何时子类化,何时在对象模型中使用属性
本文关键字:何时 属性 子类 对象模型 | 更新日期: 2023-09-27 17:50:39
我正在为评估工具工作的对象模型寻找一些指导。目前有两种类型的计算
- 同行 团队
这两种评估之间的唯一区别是表单在UI中呈现给用户的方式。同行评估将显示团队中的同行,您应该根据某些标准对其进行评估,团队评估将显示根据某些标准对所有相关团队进行评估。除此之外,这两个评价是完全一样的。
在构建对象模型时,我是否应该创建一个抽象的评估对象,然后子类化Peer评估和Team评估?还是应该创建一个Evaluation对象,并使用两个属性来表示两种不同类型的评估?
将来可能会添加更多类型的求值
一般来说,如果类型只是一条信息,则将其设置为字段。如果它被用来改变方法的行为,比如
public void foo() {
if (type == PEER) {
doSomething();
}
else {
doSomethingElse();
}
}
则表明您应该子类化,并使用多态性根据类型获得适当的行为。另一个解决方案是使用委托而不是继承,并将行为关联到类型:
public enum EvaluationType {
PEER {
@Override
public void foo() {
...
}
},
TEAM {
@Override
public void foo() {
...
}
};
public abstract void foo();
}
public class Evaluation {
private EvaluationType type;
public void foo() {
return this.type.foo();
}
}
稍微考虑一下,在我看来,将此信息存储在evaluate对象本身是错误的方式。考虑一个现实世界的例子——南瓜籽。现在,我可以种下种子,也可以烤着吃种子。事实上,对于一个给定的种子,我可以选择一种方式,也可以选择另一种方式,但不能两者兼而有之:有些种子可以吃,有些种子可以种,但这种划分与种子本身没有什么关系。
因此,我建议在其他地方编码区别…也许您有一个EvaluationModel,它维护单独的集合(团队与同伴),并将它们适当地转发给UI。为什么评估人员要关心其他人如何使用它?你需要的是一个以关心为职责的实体,让那个家伙想怎么区分就怎么区分吧。
拿出一个接口的常用属性和方法然后让团队和同伴自己的接口实现iccommon…
interface ICommon{
}
interface ITeam:ICommon{
}
interface IPeer:ICommon{
}
,然后实现每个接口(IPeer和ITeam),并且您的EvaluationManager(如果您有一个)将知道何时实例化每个对象