0

피연산자/연산자를 매개 변수로 사용하고 평가 결과를 제공하는 함수가 필요합니다. 내가 직면하고있는 문제는 연산자를 우아하게 구문 분석하는 방법입니다.일치 연산자와 리팩토링 스위치 사례 구문 분석

샘플 코드는 내가 스위치 케이스를 제거하는 열거 (또는 확장 열거)과 사용 전략 패턴 연산자를 넣을 수 있습니다

internal static bool Evaluator(double operand1, double operand2, string operation) 
{ 
    bool evaluation = false; 
    switch (operation) 
    { 
     case "<": 
      evaluation = operand1 < operand2; 
      break; 

     case ">": 
      evaluation = operand1 > operand2; 
      break; 

     case "<=": 
      evaluation = operand1 <= operand2; 
      break; 

     default: 
      break; 
    } 

    return evaluation; 
} 

다음과 같다. 문제가 남아있어 연산자를 구문 분석 할 수 없습니다. 예를

 op1="<"; 
    var operation = Operation.Parse(op1); 
    var result = operand1 <-- operation should come here --> operand2. 

우아 코드 위 (평가자 기능) 리팩토링하는 방법을 제안 해주십시오.

답변

1

스위치 문이 책임 패턴의 사슬의 가장 간단한 구현, 그 목적은 문제를 올바른 처리기로 전달하는 것입니다. 기본 GoF 구현은 링크 된 목록입니다. Wikipedia에는 NetObjectives처럼 좋은 기사가 있습니다.

또 다른 좋은 구현은 레지스트리 구현입니다. 이것은 규칙이 항상 동일하기 때문에 여기에서 작동합니다 - 지정된 키를 작업과 일치시킵니다. 이 추상화를 채우고 사전으로 백업하십시오. 알고있는 작업으로 사전을 사전로드하십시오.

public abstract class OperationRegistry 
{ 
    public abstract void RegisterOperation(string symbol, Func<double, double, bool> operation); 
    public abstract Func<double, double, bool> GetOperation(string symbol); 
} 

FWIW, 나는 Func 대신 새로운 클래스를 보는 것을 선호하지만 아마도 그것은 나 일 것입니다.

+0

독단적 구현은 나에게 깨끗해 보인다. Func에 관해서는 맞습니다. 새로운 Class가 더 좋습니다. – Tilak

1

난 당신이 이런 식으로 뭔가를 찾고있을 것 같아요 :

public static Func<double, double, bool> ParseOperation(string operation) 
{ 
    switch (operation) 
    { 
     case "<": 
      return (x, y) => x < y; 

     case ">": 
      return (x, y) => x > y; 

     case "<=": 
      return (x, y) => x <= y; 

     default: 
      throw new Exception(); 
    } 
} 

당신은 다음과 같이 사용할 수 있습니다 :

var op = ParseOperation("<"); 
Console.WriteLine(op(1, 2)); // true 
+0

매우 가깝고 깨끗합니다. 비슷한 것을 찾고 있는데 스위치 조작자를 제거하여 나중에 더 많은 연산자를 추가하려고합니다. – Tilak