我有三个对象;行动,问题和风险。这些都包含一系列公共变量/属性(例如:描述,标题,截止日期,提升等)和一些特定字段(风险有概率)。问题是:
我应该创建3个单独的 每个行动作,风险和问题 包含重复字段。
创建父类“Abstract_Item” 包含这些字段和 对他们的操作然后有 行动,风险和问题子类 Abstract_Item。这会坚持 干校长。
答案 0 :(得分:5)
我的观点
让我们说,如果你使用了继承。在一段时间内,您有新属性,这些属性仅对于操作和问题而非风险是通用的。你将如何处理?如果你把它们放在父母之下,那么Risk就会继承那些无关紧要的东西(Liskov Substituon Principle knocking?)。如果你把它分别放在Action和Risk中,那么你就会破坏DRY,这是你开始继承的最初原因。点是Inhertence重复使用是坏事。如果没有“is-a”那么最好不要使用它,当你有疑问时,就没有真正的“是-a”。
我的偏好
还有其他实现DRY的方法,如下面的示例代码所示。通过添加新属性,我将成为另一个 Common2 ,如果它们不适用于所有3个类,则添加新行为是新的 CommonBehavior2 ;如果他们只是改变现有的 Common 和 CommonBehavior
public class Common implements CommonBehavior
{
String Description;
String title;
public void f() {}
}
public interface CommonBehavior
{
void f();
}
public class Action implements CommonBehavior
{
private Common delegate;
public void f()
{
delegate.f();
}
}
另请参阅另一个实际示例Design pattern to add a new class
对类似问题的回答答案 1 :(得分:2)
是的,坚持DRY通常是一个非常好的主意除了如果这些类有非常非常不同的用途(即苹果和汽车都可能是红色的,我仍然不会得到它们两者来自名为ProbablyRed
的基类。但是,在您的情况下,我肯定会选择基类,因为您描述的实现(Action
,Issue
,Risk
)似乎都是某种业务规则。类似的语义。
答案 2 :(得分:0)
你好像在回答这个问题。正如你所说,干。
答案 3 :(得分:0)
抽象的父类听起来像是要走的路。它还可以或更容易(取决于您的语言)实现和使用对三个项目中的任何一个起作用的功能。例如,您可以拥有“获取{user}所有项目的列表”功能。
答案 4 :(得分:0)
如果查看用例,可能会看到另一个方面,可能是处理属性的不同子组。
例如,如果“标签”,“截止日期”和“提升”用于类似应用程序,而“行动”和“风险”的其他属性在处理该任务时将很普遍,您可能会考虑聚合让我们说任务(标签,截止日期......)和主题,这是对动作,问题或其他任何事情的多态参考有一天会出现
答案 5 :(得分:0)
我想我在这里回答了同样的问题
答案 6 :(得分:0)
不要仅仅因为对象共享某些数据或操作而进行子类化。将合成视为遵循DRY的默认方式。
在您的特定情况下,如果您的对象实际上是相关的,则只创建一个父类,即与父类有一个语义“是”关系。例如,如果Action,Issue和Risk都是Ticket对象。