需要选择一个设计模式,需要帮助。

3

目前我有一堆if else语句,根据每个集合中的项目数量来设置CategoryId。

例如,

public class TeamWork
{
    public string EmployeeName { get; set; }
    public int CategoryId { get; set; }
}

public class BLL
{
    public void SetCategoryId(ICollection<TeamWork> Converted, ICollection<TeamWork> Sourced)
    {
        if (Converted.Count == 1 && Sourced.Count == 1)
        {                
            if (String.Compare(Sourced.First().EmployeeName, Converted.First().EmployeeName) == 0)
            {
                // set category id to 1
                Converted.First().CategoryId = 1;
                Sourced.First().CategoryId = 1;                                            
            }
            else
            {
                // set category id to something                  
            }
        }
        else if (Sourced.Rows.Count == 1 && Converted.Rows.Count > 1)
        {
            // set category id to something           
        }
        // more if else statements...
    }
}

我认为有更好的方法来做这件事,也许可以应用一些设计模式。有什么建议吗?谢谢!


设计模式可能对于设置两个字段来说有些过度设计了... - Jean-Christophe Fortin
如果我只有两个字段的设计模式,那就太过头了。哈哈。目前大约有12个if else语句(而且还在增加……)。 - dm80
2个回答

4

责任链模式是一个不错的选择。

这个对象会被传递给一系列命令对象,直到其中一个能够处理并设置状态为止。


一个巨大的责任链来设置两个字段有点过分了哈哈,但我同意,如果他想要按照设计模式的方式去做,这确实是正确的模式。我可以建议将此链接添加到你的答案中:http://www.exciton.cs.rice.edu/JavaResources/DesignPatterns/book/hires/pat5afso.htm。这是GOF书的参考资料。 - Jean-Christophe Fortin
谢谢大家!找到了一个很好的C#责任链模式示例 - http://www.dofactory.com/Patterns/PatternChain.aspx#csharp - dm80

1
一个策略模式浮现在脑海中。尝试将这些规则分解成一系列的“如果这个条件为真,则类别ID为此”的方法。将每个方法作为委托添加到List<Func<ICollection<TeamWork>, ICollection<TeamWork>, bool>>或类似的索引集合中。然后,您的SetCategoryId()代码看起来像这样:
public void SetCategoryId(ICollection<TeamWork> Converted, ICollection<TeamWork> Sourced)
{
    foreach(var categoryRule in CategoryRules)
    {
       var category = test(Converted, Sourced);
       if(category != 0)
       {
          Converted.First().CategoryId = Sourced.First().CategoryId = category;
          break;
       }
    }
}

上述代码无论添加或删除多少规则都不需要更改。但是,由于您拥有if-else if结构,因此您的一系列规则很可能会依赖于顺序,因此在设置列表中的规则时要小心。

“Strategy/Visitor”不会中断链条,因此它将一直传递到最后。因此,“责任链模式”更好。 - Aliostad
小改动;上述循环现在将在找到第一个产生值的策略后退出。然而,每个策略的执行顺序都是关键的,并且完全依赖于它们被分配到列表中的顺序,因此我同意在这里使用命令链模式会更好。 - KeithS

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接