2016-11-08 8 views
-1

私はテスト用プロジェクトとしてコンソール電卓を作っています。私のコードはSingle Responsibility Principleに違反していますか?

public interface ITerm 
{ 
    Object Value { get; } 
} 

今、私はIOperandとIOperatorインタフェースでそれを継承し、逆ポーランド記法を経由してさらに計算でこれらのintefacesを使用しています:それは私の実現の主な特徴は、私が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(); 
} 

これは計算の処理方法です。したがって、2つの質問があります。 1.オブジェクト変数にオペランドと演算子の両方を格納することについての私の考えにいくつかの欠陥がありますか? 2.コードを改善するいくつかの方法がありますか?私は今CalculatePostfixExpressionメソッドで訪問者パターンを使用することを検討しています。

+3

あなたがここにそれを投稿する必要があります。http://コードレビュー.stackexchange.com/ –

+0

私を案内してくれてありがとう、私はそこに私の質問を削除する必要がありますcodereviewに投稿した後に? –

答えて

2

これは間違いなく最も明白なアプローチです。

また、Valueプロパティに格納されている内容がわかりません。

ものIOperandIOperatorは、関係は、少なくとも私見コードのにおいである必要はありません中に、2つのインターフェイスIOperandとの両方が同じベースインタフェースITermから派生IOperatorを有するという事実。

これは、彼らがリスコフ置換原則(SOLID原則の一つ)に違反している両方ITermの場合、だもののIOperandIOperatorは互換性がないことを意味します。

私はあなたがgithubの上で見つけることができ、数週間前(ポーランド電卓コンソールアプリを逆に)似たコンソール・テストプロジェクトを自分で作成しました: https://github.com/fgheysels/Calculator

+0

ありがとう、私はあなたのコードを見てください。 Valueプロパティは "128"や "+"のような用語の内容を保持します。 –

関連する問題