2011-03-17 5 views
3

현재 각 컬렉션에 몇 개의 항목이 있는지에 따라 CategoryId를 설정하는 else 문이 여러 개 있습니다. 예를 들어디자인 패턴을 선택할 때 도움이 필요합니다.

,

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

Chain of Command는 – simendsjo

+0

에 적합 할 수 있습니다. 두 개의 필드를 설정하는 데 과도한 디자인 패턴이있을 수 있습니다 ... –

+0

예 : 2 필드 만 디자인하면 패턴이 과도합니다. 하하. 현재 약 12 ​​개의 else 문장이 있습니다. – dm80

답변

4

Chain of responsibility입니다.

따라서이 개체는 상태를 처리하고 설정할 수있을 때까지 일련의 명령 개체로 전달됩니다.

+0

두 개의 필드를 설정하는 것에 대한 책임감의 거대한 사슬이 조금 과잉인데 하하지만 디자인 패턴의 길을 가고 싶다면 올바른 패턴입니다. 귀하의 답변에이 링크를 추가하는 것이 좋습니다 : http://www.exciton.cs.rice.edu/JavaResources/DesignPatterns/book/hires/pat5afso.htm. 그것은 GOF 책의 참고서입니다. –

+0

모두 감사합니다! 책임의 사슬에 좋은 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 구조를 사용하면 일련의 규칙이 순서에 따라 달라 지므로 목록에 규칙을 설정할 때주의해야합니다.

+0

'Strategy/Visitor'는 체인을 끊어서 끝날 때까지 계속 진행할 것입니다. 그래서'Chain-Of-Responsibility'가 더 좋습니다. – Aliostad

+0

작은 변화; 위의 루프는 이제 값을 생성하는 첫 번째 전략을 찾은 후에 나옵니다. 그러나 각 전략의 실행 순서는 매우 중요하며 목록에 할당 된 순서에 전적으로 달려 있으므로 여기서 명령 패턴이 더 좋을 것이라는 데 동의합니다. – KeithS

관련 문제