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