我正在为我正在为评估工具工作的对象模型寻找一些指导。目前有两种类型的评估
这两个评估之间的唯一区别是表单在UI中呈现给用户的方式。同行评估将向您的团队中的同行展示您应根据某些标准进行评估,团队评估将根据某些标准显示所有参与评估的团队。除此之外,这两个评估完全相同。
构建对象模型时,我应该创建一个抽象的Evaluation对象,然后将Peer评估和团队评估子类化吗?或者我应该创建一个Evaluation对象并有两个属性来表示两种不同类型的评估?
将来可能会增加更多类型的评估。
答案 0 :(得分:4)
通常,如果类型只是一条信息,则将其设为字段。如果它用于改变方法的行为,如
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();
}
}
答案 1 :(得分:0)
考虑到这一点,在我看来,将此信息存储在Evaluation对象本身是错误的方法。考虑一个现实世界的例子 - 南瓜种子。现在,我可以种下种子,或者我可以烤种子。事实上,对于一个给定的种子,我可以采取一种方式,或另一种方式,但不是两种方式:一些种子已被留下用于进食,一些用于种植,但该种子本身与种子没什么关系。
因此,我建议在其他地方编码区别...也许你有一个EvaluationModel来维护单独的集合(团队与同行)并在适当的时候将它们转发到UI。为什么评估会关注他人如何使用它?你需要的是一个实体,它的工作就是关心,让那个人得出他将要有的区别。
答案 2 :(得分:0)
将一般属性和方法取出到一个接口Say ICommon, 然后让团队和对等点自己的接口实现ICommon ...
interface ICommon{
}
interface ITeam:ICommon{
}
interface IPeer:ICommon{
}
然后实现每个接口(IPeer和ITeam)和您的EvaluationManager(如果有的话)将知道何时实例化每个对象