2011-03-17 69 views
3

目前我有一堆if if语句来根据每个集合中有多少项目来设置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... 
    } 
} 

我想有一个更好的方式,通过应用一些设计模式来做到这一点也许。有什么建议么?谢谢!

+0

命令链可以适合 – simendsjo 2011-03-17 16:03:04

+0

设计模式可能是矫枉过正的设置两个字段... – 2011-03-17 16:15:41

+0

是的,如果我只有2个字段设计模式它会矫枉过正。哈哈。目前大约有12条if else语句(并且正在增长......)。 – dm80 2011-03-17 16:26:18

回答

4

Chain of responsibility是要走的路。

所以这个对象被传递给一系列的命令对象,直到一个能够执行和设置状态。

+0

一个巨大的责任链让两个领域有点矫枉过正哈哈,但我同意,如果他想采用设计模式的方式,这是正确的模式。我可以建议将此链接添加到您的答案:http://www.exciton.cs.rice.edu/JavaResources/DesignPatterns/book/hires/pat5afso.htm。这是GOF书的参考。 – 2011-03-17 16:14:25

+0

谢谢大家!找到一个很好的C#示例链接责任-http://www.dofactory.com/Patterns/PatternChain.aspx#csharp – dm80 2011-03-17 16:29:47

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结构,您的一系列规则可能会依赖于顺序,因此在设置列表中的规则时要小心。

+0

'策略/访问者'不会中断链条,因此它会继续传递到最后。所以'责任链'更好。 – Aliostad 2011-03-17 16:19:04

+0

小变化;在找到产生一个值的第一个策略之后,上面的循环现在会发生。但是,每个策略的执行顺序都很关键,完全取决于它们被分配给列表的顺序,所以我确实认为在这里命令链模式会更好。 – KeithS 2011-03-17 18:17:26