我有一个逻辑,我需要根据类型执行一次或多次(在循环中)。策略模式在这里有意义吗?实质上:
if (type == 1)
{
ProcessReport("");
}
else if (type == 2)
{
for (int i = 0; i < numUsers; i++)
{
ProcessReport(userId);
}
}
public void ProcessReport(string id)
{
if (id == "")
{
//Send full report
}
else
{
GetReportFragment();
//Send report
}
}
答案 0 :(得分:4)
好吧,因为你显然使用“类型代码”来区分不同的行为,你可以从replacing it with subclasses (polymorphism)开始。当基于类型代码的分支时,这通常是第一件事。
然而,对于简单的问题,这可能是一种矫枉过正。您的代码更令人反感的是:
""
)以指示特定行为:如果您没有要指定的ID,则至少为“完整报告”创建单独的方法答案 1 :(得分:2)
通常,策略模式定义一系列算法,封装每个算法,并使它们可互换。策略允许算法独立于使用它的客户端。
我没有看到任何值得添加另一层抽象的复杂算法
如果要封装ProcessReport行为,我会创建一个表示此行为的接口,以便您可以在循环中调用IProcessReport.Process(userId)
答案 2 :(得分:1)
根据type
变量的语义,使用多态可能是有意义的。
鉴于当前的示例,它可能是开销(只有两个分支),但每次看到像if() ... else if() ... else if() ...
或switch() { case: ... }
这样的结构时,您都不得不怀疑:有多少个条件分支?未来可能会出现新的吗?
根据这些问题的答案,我们可能决定进行Replace Conditional with Polymorphism重构。
答案 3 :(得分:0)
您的代码可以简化为:
if (type == 1)
SendFullReport();
else if (type == 2)
for (int i = 0; i < numUsers; i++)
GetReportFragment(userId);
当然,您必须实施SendFullReport()
和GetReportFragment(string userId)
方法。
在这种情况下使用复杂的设计模式毫无意义。
答案 4 :(得分:0)
那么,这只是一个例子,还是实际尺寸?我的意思是,如果你有两种类型,最好使用的模式是保持简单:)。
如果您有多种类型,那么您可以在那里制定策略,或者使用您想要执行的代码的字典类型委托/命令。
答案 5 :(得分:0)
我觉得战略模式是正确的解决方案,尽管当前功能有多么简单。一般来说,我会避免“如果&#39;语句并试图雾化我的代码。 Groo对代码&#39;气味的观察&#39;我也是。多态性(策略)似乎有点矫枉过正,但我宁愿采用稍微更抽象的解决方案,而不是试图根据希望为空或数字的字符串参数来改变函数的行为。