2011-07-30 4 views
0

어쩌면 가장 좋은 제목이 내가 생각할 수 있지만 내 문제는 이것이다 :출력 계산 전략 문제

내가 입력 한 무리의 소요 C# 응용 프로그램을 설계해야 입력에 대한 몇 가지 계산을 수행하는 무리에 따라 일련의 결과를 얻으려면 규칙을 사용해야합니다.

문제는 규칙이 필요할 때 변경 될 수 있다는 것입니다. 복잡하게하기 위해, 그들 중 많은 것들은 십자가 모양의 룩업과 조건문입니다. 예 :

public string rule_GetFruitForThisSeason(Hamper design) 
{ 
    // crosstab of 2 properties of values 400 to 100 and 600 to 500 respectively. 
    if(design.pty1 > 400 && design.pty > 600) return "Apple"; 
    else if(design.pty1 > 200 && design.pty > 600) return "Pear"; 
    else if(design.pty1 > 100 && design.pty > 600) return "Orange"; 
    else if(design.pty1 > 400 && design.pty > 500) return "Grape"; 
    else if(design.pty1 > 200 && design.pty > 500) return "Berry"; 
    else if(design.pty1 > 100 && design.pty > 500) return "Peach"; 
} 

다음 시즌에는 모든 과일이 다시 바뀔 수 있습니다. (심지어 조건이 바뀔 수도 있습니다.) 이상적으로는 프로그래머가 매 시즌 과일을 바꾸지 않기를 바랍니다. Hamper Designers는 스스로 할 수 있어야합니다.

더 나쁜 아직도 나는 다양한 방법을 통해 생각하고 있고, 현재 내가 일반적으로 수식을 평가하는 능력을 자사의 LOOKUP (용 Excel 사용)하고

public string rule_GetBoxForFruit(string fruit) 
{ 
    if(fruit == "Apple" || fruit == "Pear" || fruit == "orange" || fruit == "peach") return "big box"; 
    else return "small box"; 
} 

예를 들어 출력에 의존 규칙, 그리고 수 그런 다음 Excel 결과를 직접 읽습니다. 그러나 여전히 큰 번거로운 작업입니다.

누구나 더 나은 방법으로이 문제에 접근하는 방법에 대한 아이디어가 있습니까? 고맙습니다.

+0

한 단어. 다형성. – Jan

+0

한 단어. 응? 친절하게 설명해 주시겠습니까? 명확히하기 위해 코드에서 정의 할 수있는 고정 된 과일 세트가 없습니다. 미래의 과일은 예측할 수 없습니다. – Jake

+0

기본 규칙을 찾기 위해 더 깊이 파고들 필요가있는 예제 규칙이있는 것 같습니다. 테이블 기반 (조회) 또는 규칙 엔진 일 수 있습니다. –

답변

0

이러한 유형의 문제에 접근 할 수있는 방법은 많이 있지만 주요 개념은 코드에서 데이터를 분리하는 것입니다. 이렇게하는 한 가지 방법은 규칙을 XML 파일로 캡슐화 한 다음 XML 파일의 값을 사용하여 논리를 관리하는 것입니다.

// ConfigurationData is loaded as 
// XDocument.Load("file.xml").Root 

public string rule_GetFruitForThisSeason(Hamper design) 
{ 
     var node = ConfigurationData.Elements("hamper") 
      .Elements("seasonalRules") 
      .Elements("rule") 
      .Where(a => int.Parse(a.Attribute("pty1").Value) > design.pty1 && 
         int.Parse(a.Attribute("pty").Value) > design.pty) 
      .FirstOrDefault(); 
     if (node == null) return null; 
     return node.Attribute("fruit").Value; 
} 

:

<configuration> 
    <hamper> 
     <seasonalRules> 
      <!-- select first rule where 
       design.pty1 > pty1 and design.pty2 > pty2 
      --> 
      <rule pty1="400" pty="600" fruit="apple" /> 
      <rule pty1="200" pty="600" fruit="pear" /> 
      <rule pty1="100" pty="600" fruit="orange" /> 
      <!-- similar for remaining --> 
     </seasonalRules> 
    </hamper> 
    <fruits> 
     <fruit name="apple" box="smallBox" /> 
     <fruit name="berry" box="smallBox" /> 
    </fruits> 
    <boxes> 
     <box name="smallBox" size="small" /> 
     <box name="largeBox" size="large" /> 
    </boxes> 
</configuration> 

은 그럼 당신은 파일을 읽고 논리를 수행 할 수 Linq에에 XML (또는 XML API를) 사용할 수 있습니다 예를 들어, 다음과 같은 파일은 모든 규칙을 포함 할 수있다 이 코드는 비즈니스 상수를 비교하므로 XML 파일의 구성 상수는 해당 코드를 변경하지 않고 변경할 수 있습니다. 또한 햄퍼 설계자가 계산 규칙을 ​​변경하는 데 사용할 수있는 XML 파일에 구성 데이터를 저장하는 유틸리티를 개발할 수도 있습니다.