2011-03-17 72 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