用模式替换if / else语句

时间:2017-12-07 14:46:54

标签: c# if-statement design-patterns

在下面的代码中,我试图确定业务日期应该是什么,具体取决于月初至今(mtd)指标是否为真或前2个业务日期(btd)指标是否为真。

目前,如果我想出另一个指标,那么我将不得不包括另一个if if语句。

我已经读过使这个代码更容易维护的方法是使用Factory Design模式。但是,我不确定采取哪些步骤来实现模式。

以下是代码:

0xc0c200
[INFO]: FrameworkUI
0

1 个答案:

答案 0 :(得分:3)

工厂模式(工厂方法和抽象工厂)不能很好地适用于您的用例,因为这种模式只会强制您为每个if语句创建几个类,并且模式通常会返回一个抽象对象到你的客户端代码消费(不是你的情况,因为你要返回一个简单的字符串)。

您也不能使用简单工厂(这不是设计模式),因为只会将条件逻辑移动到单个类中,因此您的代码设计不会改进。

你应该使用设计模式只是增加代码的复杂性而没有灵活性的好处。

对于您的用例,我只需使用一行代码将其保留为if / else语句。

return mtdIndicator ? Helper.FOMBusDt :
       prev2BusDtInd ? Helper.Previous2BusinessDate : 
                       Helper.PreviousBusinessDate;

如果你想用多态替换条件,你应该尝试:

  • 责任链模式
  • 策略模式
  • 装饰图案

......或其他模式(取决于整体架构)

此外,您可以通过“告诉不要问”来避免ifs。

  • 您应该向低级别组件发送请求以执行任务X
  • 你不应该问一个关于它内部的低级别组件 上下文/状态(通过避免像isStateXOk():Boolean这样的函数来实现)

提示:不要通过创建3到10个类来避免短if / else语句,通过为每个案例分支创建类来避免切换。