2016-11-08 3 views
-1

저는 콘솔 계산기를 테스트 프로젝트로 만들고 있습니다. 내가 IOperand 및 IOperator 인터페이스에서 상속 및 역 폴란드 표기법을 통해 추가 계산에서 이러한 intefaces을 사용하고, 지금내 코드가 Single Responsibility Principle을 위반합니까?

public interface ITerm 
{ 
    Object Value { get; } 
} 

: 그것의 내 실현의 주요 기능은 내가하여 ITerm 인터페이스로부터 상속 숫자와 연산자 클래스를 만든 것입니다 .

이제는이 Object-type 속성을 사용하여 숫자와 연산자를 유지하는 것이 Single Responsibility Principle을 위반한다고 들었습니다.

private ITerm CalculatePostfixExpression(IEnumerable<ITerm> input) 
{ 
    var tempResult = new Stack<ITerm>(); 
    foreach (var term in input) 
    { 
     if (term is IOperand) 
     { 
      tempResult.Push(term as IOperand); 
     } 
     if (term is IOperator) 
     { 
      tempResult.Push(ProceedOperation(term as IOperator, tempResult)); 
     } 
    } 
    return tempResult.Peek(); 
} 

이것은 계산 방법입니다. 따라서 두 가지 질문이 있습니다. 1. Object 변수에 피연산자와 연산자를 모두 저장하는 것에 대한 몇 가지 결함이 있습니까? 2. 코드를 개선하는 몇 가지 방법이 있습니까? 지금 CalculatePostfixExpression 메서드에서 방문자 패턴을 사용하는 것을 고려하고 있습니다.

+3

당신은 여기에 게시해야합니다 : HTTP :

난 당신이 GitHub의에서 찾을 수있는 자신이 몇 주 전에 (폴란드어 계산기 콘솔 응용 프로그램을 역)와 유사한 콘솔 테스트 프로젝트를 만들었습니다 // 코드 검토 .stackexchange.com/ –

+0

나를 안내해 주셔서 감사합니다, 거기에 내 질문을 삭제해야합니까 codereview에 게시 후? –

답변

2

분명히 가장 명백한 방법은 아닙니다.

Value 속성에 저장하는 내용이 나에게 분명하지 않습니다.

IOperandIOperator는이-관계는 적어도 이럴 코드 냄새가없는 동안,이 인터페이스 IOperand 모두가 같은 기본 인터페이스 ITerm에서 파생 IOperator을 가지고 있다는 사실.

이 그들이 Liskov 교체 원칙 (고체 원칙 중 하나)의 위반 모두 ITerm 인스턴스를,있어 비록 IOperandIOperator이 서로 호환되지 않습니다 것을 의미한다. https://github.com/fgheysels/Calculator

+0

고마워, 나는 당신의 코드를 봐야한다. Value 속성은 "128"또는 "+"와 같은 용어의 내용을 보유합니다. –