2016-10-28 6 views
0

コマンドラインから入力したユーザーに基づいてオブジェクトを生成します。 オブジェクトを処理するには、一定量のデータが必要です。これまでの私の解決策は、オブジェクトが準備が整っているかどうかを調べるためにif文を入れ子にしたものです。以下の例のように。 多分3つのif文がそれほど悪くない(?)が、if文の数が増え始めるとどうなりますか?私の選択肢は何ですか? X、Y、Zが3つの全く異なるものだとしましょう。たとえば、object.Xが整数のリストで、object.Yが文字列であり、Zがobject.Yに一定量の値しかない場合にtrueを返すための何らかの並べ替えであるとします。 この場合、ポリモーリズムがうまくいくとは思わないのですか?複雑な論理ワークフローのオブジェクトをコマンドラインから入力してオブジェクト状態を確認する

do 
    { 
     if (object.HasX) 
     { 
      if (object.HasY) 
      { 
       if (object.HasZ) 
       { 
        //Object is ready to proceed. 
       } 
       else 
       { 
        //Object is missing Z. Handle it... 
       } 
      } 
      else 
      { 
       //Object is missing Y. Handle it... 
      } 
     } 
     else 
     { 
      //Object is missing X. Handle it... 
     } 
} while (!String.IsNullOrEmpty(line)); 
+1

「単一レイヤの抽象化」原理についてお読みになることをお勧めします。そしてそれを超えて:if/elseのようなカスケードは問題への明確な道です。他の解決策を見つけるのは難しいと思います。 – GhostCat

答えて

1

、保守性が論理に生きるべき抽象のどのレベルかを決定することが重要だ、私を発見した。

新しいロジック/解析規則は、定期的に追加する必要がありますか?

明示的な条件文を実行する必要がなくなり、どこかに生きなければならない方法はありません。

きれいそれを保つのを助けることができるいくつかのものが考えられます。

  • 主な機能は、ネイティブデータ型にコマンドライン引数を変換するための唯一の責任がある、それはダウンオブジェクトビルダクラスにロジックをプッシュし、これが維持されます主な機能は安定しており、フラグの説明を追加する以外は変更されません。これは、ドメインからロジックを外して、ビルダーの抽象化に集中する必要があります。
  • 主な機能はドメインの解析と設定を担当します。 main/parsing関数を使用して、ドメインモデル外のロジックを保持する
  • 論理を平坦化するif not object.hasX; return次のステップではhas.Xを知っていますが、それでも条件のリストがありますが、フラットになります。
  • (平坦化するとより明白になります)DSL宣言規則言語を作成します。これはロジックが存在するルールプロセッサであり、次に外側のメイン関数は処理に必要な状態を定義することができます。
関連する問題