首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在可能的情况下,条件逻辑应该总是通过类型系统来编码吗?

在可能的情况下,条件逻辑应该总是通过类型系统来编码吗?
EN

Software Engineering用户
提问于 2015-11-30 22:39:54
回答 3查看 975关注 0票数 6

我有选择的余地。

备选案文1:

代码语言:javascript
复制
public class Sample
{
    bool IsRelevant { get; set; }
}

备选案文2:

代码语言:javascript
复制
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

https://stackoverflow.com/questions/4866873/replace-conditional-with-polymorphism-nice-in-theory-but-not-practical

有一个有点相关的问题,描述了不同的情况(标志作为方法参数,而不是域实体的一部分):使用布尔参数来确定行为是错误的吗?

EN

回答 3

Software Engineering用户

回答已采纳

发布于 2015-11-30 23:24:56

我认为语言选择是不相关的。在作出决定时,最重要的是如何使用信息。

如果Samples的行为不同,取决于isRelevent的值,那么将其划分为三个(而不是两个)类是绝对有意义的。基类Sample类、RelevantSample类和IrrelevantSample类。所有示例对象都将从后面的两个类中的一个进行实例化(因此遵循了基类应该是抽象的启发)。然后,其他对象可以将事件通知示例对象,而不必考虑示例是否相关。

但是,如果更多的是其他对象的行为不同,取决于示例的相关性,那么您应该选择选项1,并使isRelevant成为一个可以查询的字段。

票数 10
EN

Software Engineering用户

发布于 2015-12-15 16:10:07

您已经有了两个很好的答案;第三个原因是,您所描述的模式是“一击”模式。添加第二个布尔值时,所有东西都会变成梨形。我们首先:

代码语言:javascript
复制
public class Sample
{
    public bool IsRelevant { get; protected set; }
}

我们把它重构成:

代码语言:javascript
复制
public abstract class Sample {}
public class RelevantSample : Sample {}
public class IrrelevantSample : Sample {}

现在我们意识到,哦,等等,样品也可以是起泡的,也可以是防冻的:

代码语言:javascript
复制
public abstract class Sample 
{
    public bool IsFrobby { get; protected set; }
}
public class RelevantSample : Sample {}
public class IrrelevantSample : Sample {}

现在我们如何把它移到类型系统中呢?

代码语言:javascript
复制
public class RelevantFrobbySample : RelevantSample {}
public class RelevantAntifrobbySample : RelevantSample {}
public class IrrelevantFrobbySample : IrrelevantSample {}
public class IrrelevantAntifrobbySample : IrrelevantSample {}

现在我想做一种只取泡沫样本的方法。我该怎么做呢?

单一继承语言要求您非常小心地选择“继承枢轴”,因为您只有一次机会。

票数 12
EN

Software Engineering用户

发布于 2015-11-30 22:48:41

不是在C#。

在C#和类似的语言中,将隐含的行为编码为类型是有害的,因为从类型中获取信息的唯一方法是if x is T类型的检查(或者使用dynamic的欺骗,或者反射)。因此,对它的任何更改(添加新的变体,更改类型的行为)都意味着您可以进入所有的消费者,这违反了Open原则。

票数 3
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/303956

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档