我有选择的余地。
备选案文1:
public class Sample
{
bool IsRelevant { get; set; }
}备选案文2:
public class Sample
{
}
public class RelevantSample : Sample
{
}有一个明确的规则如何作出这个决定?
我的研究:我以前听说过“用多态性替换条件”重构,但它通常处理大开关语句:
https://sourcemaking.com/refactoring/replace-conditional-with-polymorphism
https://stackoverflow.com/questions/234458/do-polymorphism-or-conditionals-promote-better-design
有一个有点相关的问题,描述了不同的情况(标志作为方法参数,而不是域实体的一部分):使用布尔参数来确定行为是错误的吗?
发布于 2015-11-30 23:24:56
我认为语言选择是不相关的。在作出决定时,最重要的是如何使用信息。
如果Samples的行为不同,取决于isRelevent的值,那么将其划分为三个(而不是两个)类是绝对有意义的。基类Sample类、RelevantSample类和IrrelevantSample类。所有示例对象都将从后面的两个类中的一个进行实例化(因此遵循了基类应该是抽象的启发)。然后,其他对象可以将事件通知示例对象,而不必考虑示例是否相关。
但是,如果更多的是其他对象的行为不同,取决于示例的相关性,那么您应该选择选项1,并使isRelevant成为一个可以查询的字段。
发布于 2015-12-15 16:10:07
您已经有了两个很好的答案;第三个原因是,您所描述的模式是“一击”模式。添加第二个布尔值时,所有东西都会变成梨形。我们首先:
public class Sample
{
public bool IsRelevant { get; protected set; }
}我们把它重构成:
public abstract class Sample {}
public class RelevantSample : Sample {}
public class IrrelevantSample : Sample {}现在我们意识到,哦,等等,样品也可以是起泡的,也可以是防冻的:
public abstract class Sample
{
public bool IsFrobby { get; protected set; }
}
public class RelevantSample : Sample {}
public class IrrelevantSample : Sample {}现在我们如何把它移到类型系统中呢?
public class RelevantFrobbySample : RelevantSample {}
public class RelevantAntifrobbySample : RelevantSample {}
public class IrrelevantFrobbySample : IrrelevantSample {}
public class IrrelevantAntifrobbySample : IrrelevantSample {}现在我想做一种只取泡沫样本的方法。我该怎么做呢?
单一继承语言要求您非常小心地选择“继承枢轴”,因为您只有一次机会。
发布于 2015-11-30 22:48:41
不是在C#。
在C#和类似的语言中,将隐含的行为编码为类型是有害的,因为从类型中获取信息的唯一方法是if x is T类型的检查(或者使用dynamic的欺骗,或者反射)。因此,对它的任何更改(添加新的变体,更改类型的行为)都意味着您可以进入所有的消费者,这违反了Open原则。
https://softwareengineering.stackexchange.com/questions/303956
复制相似问题