2017-01-06 3 views
0

私は開発中にユーザーから多数の入力変数を必要とするac#プログラムを持っています(現在の数では32ですが、増加しています)。これらは、または予め作成されたxmlファイルからロードされたもの複数の従属入力の組み合わせのデフォルト値の生成

多くの場合、ユーザーはこれらの変数のいくつかの値を知らない(気にする)ことはできません。単純な次元を入力して、いくつかの内部的な前提、デザインのあらゆる細部を知る必要はありません。

未知の変数は、質問が最善の方法である

(他の必要な値が知られている場合は、1つの選択肢は、望ましいことで、時には両方の)デフォルト値から、または既知の変数との関係から、多くの場合、いずれかで導出することができます意思決定ツリーを操作して未知の値を取って、どの値がギャップを埋めるために利用可能であるかを評価する。例として

:取る三つの変数は:A、B、C

我々は知っているA = B +我々は、すべての3つの値がわかっている場合

(Cは、典型的には、Aの約75%である)、C、 (実際には有効です) 1つの値が不足している場合は、他の2つから取り除くことができます(ただし、他の2つが最初に存在することを確認する必要があります) 2つの値隙間を埋めるために75%の関係を使用することができます 3つの値がすべて不足している場合は、それらの値の1つにデフォルト値を設定し、そこから上向きに作業できます。

今まで私は 'If'チェックを含む一連のメソッドでこれを処理していましたが、2つ以上のリレーションを持つ制御FASTから抜け出し、各変数がコード内でチェックされる順序に大きく依存しますコードが拡大するにつれてメンテナンスを問題にしている重要な内部階層。

static class defaultValue 
{ 
    public static double a(InputValues inputvalues) 
    { 
     double x; 
     if (inputvalues.a != 0) x = inputvalues.a; 
     else { 
      if ((inputvalues.b != 0) && (inputvalues.c != 0)) 
      { 
       x = publicProgramValues.b + publicProgramValues.c; 
      } 
      if ((inputvalues.b = 0) && (inputvalues.c != 0)) 
      { 
       x = publicProgramValues.c/0.75; 
      } 
      if ((inputvalues.b != 0) && (inputvalues.c = 0)) 
      { 
       x = publicProgramValues.b/0.25; 
      } 
      if ((inputvalues.b = 0) && (inputvalues.c = 0)) 
      { 
       x = 100; 
      } 

     } 
     return x; 
    } 
} 

あなたは上記のコードは非常に単純化した例からもわかるように、既に、比較的単純な関係で手に負えなくなるし始めていると私はまだ他の2つの変数のチェックを処理するために開始していません。

より複雑な例(現実には私が直面する問題にもっと近い)は、プロパティ 'height'、 'width'、 'area'、 'aspect ratio'を持つオブジェクト 'rectangle'になります。任意の2つの既知の値が与えられれば、未知数は常に計算できますが、これを達成するための可能なインプットの組み合わせを約15にして、コードがかなり乱雑になり始めます。特に、「高さ」が他のセット変数の...私の脳が溶けた。

私は確かにこれを処理するためのよりエレガントな方法 - IDはいくつかの提案を聞いて大好きです!

事前に感謝します。

答えて

0

ドメイン領域とあなたの解決している問題を知らなくても、言うことは難しいです。時には、デザインを一から考え直す方がよい場合もあります。

考えられる解決策:

  • あなたはクラスInputValues(またはいくつかのプロキシクラス)にデフォルト値を計算するためのロジックをカプセル化することができます。 プロパティが頻繁に読み取られず、パフォーマンスが最優先事項でない場合、ロジックをプロパティのゲッターに配置できます。この場合は、デフォルトの計算方法が常に表示されます。新しいプロパティを追加すると、デフォルト値の計算方法のロジックが追加されます。
  • は、ロジックをパラメータから構築された特定のクラスにカプセル化します。たとえば、からRectangleオブジェクトを構築すると、計算のデフォルト値の論理をそこにカプセル化できます。
  • いくつかのT4テンプレートを作成し、それを使用してデフォルトのロジック計算でクラスを生成します。この場合、あなたは巨大なクラスを持つでしょうが、それはテンプレートを介してそれを維持することが簡単になります。
+0

回答ありがとうございます - 私は文脈について漠然としていましたが、物理的な物体の寸法と属性を記述していると言えば十分ですので、「長方形」の例は不必要に複雑ではなく有効です。 – leShark

+0

提案された方法の1つが、クラスのメンテナンスを簡素化するのに役立つかもしれません。 –

+0

最初の2つの例は、現時点では問題ではないデフォルト値を定義するロジックを配置する場所を扱っているようです。私はここでいくつかの改善を行うことができると確信していますが、私の現在の解決策は機能的です 私の質問は本当にありました:どのようにロジック自体を記述する。 これは私にとって新しいテンプレート提案に興味があります。私のニーズに合っているかどうかをさらに調査します。 – leShark

関連する問題