2016-11-08 110 views
-1

我正在製作控制檯計算器作爲測試項目。我實現它的主要特點是,我從ITERM接口繼承的數字和運算符類:我的代碼是否違反單一責任原則?

public interface ITerm 
{ 
    Object Value { get; } 
} 

現在,我繼承它IOperand和IOperator接口,並通過逆波蘭符號使用在進一步計算這些intefaces 。

現在,我被告知使用這個Object-type屬性來保存數字和操作符是違反單一責任原則的。

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://代碼審查.stackexchange.com/ –

+0

感謝您指導我,我應該在codereview上發佈後刪除我的問題嗎? –

回答

2

這絕對不是最明顯的方法imho。

這也是不是很清楚我在Value屬性中存儲什麼?

,你有2個接口IOperandIOperator這兩個來自同一基本接口ITerm派生,而那些IOperandIOperator沒有一個是-的關係是一個恕我直言代碼味道,至少事實。

這意味着IOperandIOperator不可互換,雖然它們都是ITerm實例,這違反了Liskov替換原則(SOLID原則之一)。

我創建了一個類似的控制檯測試項目我(逆波蘭計算器控制檯應用程序),幾個星期前,你可以在github: https://github.com/fgheysels/Calculator

+0

非常感謝,我應該看看你的代碼。價值財產持有,ehm,術語內容如「128」或「+」 –

相關問題