Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我应该使用哪种设计模式?_C#_Design Patterns - Fatal编程技术网

C# 我应该使用哪种设计模式?

C# 我应该使用哪种设计模式?,c#,design-patterns,C#,Design Patterns,我有一段逻辑,我需要根据类型执行一次或多次(在循环中)。战略模式在这里有意义吗?实质上: if (type == 1) { ProcessReport(""); } else if (type == 2) { for (int i = 0; i < numUsers; i++) { ProcessReport(userId); } } public void ProcessReport(string id) { if (id == "") {

我有一段逻辑,我需要根据类型执行一次或多次(在循环中)。战略模式在这里有意义吗?实质上:

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
   }
}
if(类型==1)
{
过程报告(“”);
}
else if(类型==2)
{
for(int i=0;i
通常,策略模式定义一系列算法,封装每一种算法,并使其可互换。该策略允许算法独立于使用它的客户端而变化

我没有看到任何复杂的算法值得添加另一层抽象


如果您想封装ProcessReport行为,我将创建一个表示此行为的接口,这样您就可以在循环中调用
IProcessReport.Process(userId)
,您的代码可以简化为:

if (type == 1)
    SendFullReport();
else if (type == 2)
    for (int i = 0; i < numUsers; i++)
        GetReportFragment(userId);
if(类型==1)
SendFullReport();
else if(类型==2)
for(int i=0;i
当然,您必须实现
SendFullReport()
GetReportFragment(stringuserid)
方法


在这种情况下使用复杂的设计模式没有意义。

根据
类型
变量的语义,使用多态性可能是有意义的

给定当前示例,它可能是开销(只有两个分支),但每次看到像
if()这样的结构时。。。否则如果()。。。否则如果()?将来可能会出现新的吗


根据这些问题的答案,我们可能会决定进行重构。

那么,这只是一个示例,还是实际大小?我的意思是,如果有两种类型,最好的模式是保持简单:)


如果您有几种类型,那么您可以有一个策略,或者一个字典类型的委托/命令,其中包含您想要执行的代码。

好吧,因为您显然使用“类型代码”来区分不同的行为,所以您可以从。当存在基于类型代码的分支时,这通常是要做的第一件事

然而,对于简单的问题,这可能是一种过分的做法。您的代码更令人反感的是:

  • 对您的类型使用幻数:您至少应该将它们更改为枚举以提高可读性
  • 传递空参数(
    )以指示特定行为:如果您没有要指定的ID,则至少为“完整报告”创建一个单独的方法

我觉得策略模式是正确的解决方案,尽管当前功能非常简单。一般来说,我避免使用“if”语句,并尝试将代码原子化。格罗对代码“气味”的观察也是我的。多态性(策略)可能看起来有些过分,但我更喜欢一个稍微抽象一点的解决方案,而不是尝试基于字符串参数(希望为空或数字)来更改函数的行为。

如果我没有弄错的话,使用Repository模式不是更好吗。。?请注意,设计模式不是问题的答案,而是特定问题的解决方案。所以明智地使用它。在您的情况下,我看不出这种模式的原因。代码段太短,无法给出明确的建议。在讨论设计模式时,尝试解释您的问题、工作流程、行为,以便更全面地了解问题,这是非常有用的。代码中的一个
if/else
语句并不意味着您应该立即更改设计。这只是一个示例。实际代码太大,无法发布到此处OK,所以命令类型的字典就足够了。如果命令太简单,可以使用委托。