1

いくつかの計算を行うクラスがあるとしましょう。この一連の計算には、入力として一連のパラメータが必要です。

public class Calculator
{
private CalculatorConfig _config;
public Calculator(CalculatorConfig config)
{
_config = config;
}

public Result Calculate(object obj){}
}

私の CalculatorConfig クラスは非常に単純です:

public class CalculatorConfig
{
      public double param1;
      public double param2;
      ...
}

そして、私はそれを非常に簡単に初期化します

var config = new CalculatorConfig();
config.param1 = val;
....
var calculator = new Calculator(config);

私が抱えているジレンマは、このクラスのユーザーがいくつかのフィールドを初期化するのを忘れて、奇妙な動作につながる可能性があることです。意味のある解決策は、フィールドをプロパティに変換し、プライベート フィールドごとに、フィールドが初期化されたかどうかの情報を保持する追加のブール値を持つことです。すべてのフィールドを引数として持つメガコンストラクターを作成することもできます。

この場合、どのようなアプローチを選択しますか?

ありがとう

4

4 に答える 4

0

別のアプローチを使用します。

  • Check という別のメソッド (おそらく内部メソッド) を CalculatorConfig クラスに追加します。
  • Calculate メソッドの実行内でこのメソッドを呼び出します。
  • Check メソッドで各パラメーターを確認し、何か問題がある場合はカスタム例外をスローします

    public class CalculatorConfig 
    { 
      public double param1; 
      public double param2; 
      ... 
      internal void Check()
      {
           if(param1 == 0.0)
               throw new ArgumentException("Configuration error: param1 is not valid!");
           if(param2 == 0.0)
               throw new ArgumentException("Configuration error: param2 is not valid!");
           .... // other internal checks
      }
    } 
    
    
    public class Calculator 
    { 
        private CalculatorConfig _config; 
        public Calculator(CalculatorConfig config) 
        { 
            _config = config; 
        } 
    
        public Result Calculate(object obj)
        {
            // Throw ArgumentException if the configuration is not valid
            // Will be responsability of our caller to catch the exception
            _config.Check();
    
            // Do your calcs
            .....
        } 
    } 
    
于 2012-05-23T12:59:42.173 に答える
0

readonly構成パラメーターは(そしておそらくprivateプロパティを介してアクセスできる)べきだと思います。次に、警告がエラーとしてマークされるように設定します。次に、これらの変数のいずれかの初期化に失敗すると、コンパイル時エラーが発生します

フィールドCalculatorConfig.param1が割り当てられることはなく、常にデフォルト値が設定されます。

これで、コンパイル時に問題をキャッチできました。

于 2012-05-23T12:59:55.760 に答える
0

すべてのパラメーターが絶対に必要な場合は、「メガコンストラクター」オプションを使用します。すべてが初期化されるようにするためのよりクリーンな方法であり、余分なブール値のプロパティを追加して、何かが初期化されていない場合に対処する必要はありません。ブール値の 1 つに偽の値が含まれている場合はどうしますか? ある種の例外処理を除いて、クラスのユーザーに戻ってそれらの値を追加するように強制するにはどうすればよいでしょうか? コンストラクターは、これらのことが実行時ではなくコンパイル時にも起こらないようにするだけです。

于 2012-05-23T12:57:35.703 に答える
0

宣言でデフォルト値を設定します。

public class CalculatorConfig
{
      public double param1 = 1.0; // a default value chosen by you
      public double param2 = 2.0; // a default value chosen by you

}

または、よりオブジェクト指向のソリューション: パブリック フィールドの代わりにプロパティを使用し、インスタンスの作成時に既定値を設定します。

public class CalculatorConfig
{
      public double param1 {get;set;}
      public double param2 {get;set;}

      public CalculatorConfig()
      {
          InitParams();
      }

      private void InitParams()
      {
          param1 = 1.0;
          param2 = 2.0;
      }
}
于 2012-05-23T12:57:43.890 に答える