【发布时间】:2013-05-14 13:35:20
【问题描述】:
我遇到了一个需要做出设计决策的案例(与其说是程序本身,不如说是为了了解其他人在这种情况下做了什么,最好把它看作是是一个 API)。我有一个枚举类:
public enum Type
{
CAPTAIN(2), // Only Use CalcMorale never other
LEADER(5), // Only use CalcMorale never other
PARTIER(80); // Only use CalcMorale2 never other
int calcMorale(int inMorale)
{
return inMorale * (100 + morale) / 100;
}
int calcMorale2(int inMorale, int teamCount)
{
return inMorale + morale * teamCount;
}
int morale;
private Type(int aMor)
{
morale = aMor;
}
}
有一个类 Character 持有这些枚举之一,也是传入参数的那个。
评论的问题是我只希望某些枚举使用枚举类中的某些方法。领导者增加了 5% 的团队士气,但党员为该党内的每个成员增加了 80%,因此需要另一个参数。我可以通过几种方式解决问题,但想知道社区对如何解决问题的普遍共识。
我可以:
让程序员有责任调用正确的方法。 (这对我来说听起来不对)。
给每个枚举它自己的函数版本。 (这会产生一个巨大的文件,我会重复很多代码)。
将责任留给“Character”类,该类有一个带有开关的方法来处理这个。 (这意味着程序员可以更改计算而不是故意的)。但是,如果我想稍后将枚举移动到文件中,这将导致更少的问题。但是我质疑这是否会破坏封装,如果这只是枚举的责任。
使类型成为一个类并通过匿名内部类定义方法。在这种情况下,类将添加到地图中,而不是在枚举类中使用 getByName()。
--
你认为什么最合适? (我更喜欢我的类尽可能地独立,就像我使用 API 一样(它不会),你的建议会如何/会根据枚举的数量受到影响?那我想要的情况呢?能够同时使用这两种方法的枚举?语言是 Java。
【问题讨论】:
-
它们是不同的野兽(不同的方法签名),所以你不应该试图把它们塞进一个类中。
-
@Bohemian 好吧,通过将它们分开,我不能在字符类中拥有一个“类型”成员。但相反,必须采用一种根本不受欢迎的继承类型结构。您也同意 hoaz 的方法是正确的解决方案,那不是也将它们挤在一起吗?