4

私は他の人が最終的に使用することを望んでいるテクニカル分析ライブラリをまとめているので、自分のメソッドに入るデータを検証し、適切なものを返すことを確認したいと思います。現在、検証が失敗した場合、空白の値を返します。例外をスローする方が適切でしょうか?他の開発者がこのライブラリを使用する可能性がある場合、より良い方法は何ですか?現在検証している方法は次のとおりです。

    /// <summary>
    /// Calculates the MACD (Moving Average Convergence Divergence) over n periods, where n is the number of elements in the input prices.
    /// </summary>
    /// <param name="InputValues">The numbers used for the MACD calculation. Index 0 must be the oldest, with each index afterwards one unit of time forward. There must more values present than what the SlowEMA calls for.</param>
    /// <param name="FastEMA">Optional: The smaller (faster) EMA line used in MACD. Default value is 12. Must be less than the SlowEMA.</param>
    /// <param name="SlowEMA">Optional: The larger (slower) EMA line used in MACD. Default value is 26. Must be less than the number of elements in InputValues.</param>
    /// <param name="SignalEMA">Optional: The EMA of the MACD line. Must be less than the FastEMA.</param>
    /// <returns>Returns the components of a MACD, which are the MACD line itself, the signal line, and a histogram number.</returns>
    public MACD CalculateMACD(decimal[] InputValues, decimal FastEMA = 12M, decimal SlowEMA = 26M, decimal SignalEMA = 9M)
    {
        MACD result;

        // validate that we have enough data to work with
        if (FastEMA >= SlowEMA) { return result; }
        if (SlowEMA >= InputValues.Count()) { return result; }
        if (SignalEMA >= FastEMA) { return result; }

        // Do MACD calculation here


        return result;
    }
4

5 に答える 5

6

.Netには、次の3つの標準の引数例外があります。

  • ArgumentException
  • ArgumentNullException
  • ArgumentOutOfRangeException

それらはすべて、コンストラクターにオーバーロードがあり、どの引数が問題であったかを示すことができ、それらをスローするときのより詳細なメッセージがあります。

これらを使用するのが通常の方法です。

編集:

null(または空など)が受け入れられることに加えて、ライブラリのユーザーが何に問題がないかを必ずしも知っているとは限らないため、例外をスローする傾向があります。nullを気にしない場合は、いつでも例外をキャッチして適切に処理できます。

ただし、例外をスローしないと、ライブラリの利用者に問題が何であるかを伝える能力が制限されます。

于 2012-06-29T13:53:09.153 に答える
1

割り当てられていない変数を返そうとしているため、このコードはコンパイルされません。あなたが実際に使用していると仮定するとMACD result = new MACD();、答えは次のとおりです。それは状況によって異なります。初期化されたオブジェクトで何かできることはありますか?そうです、それを返すのは問題ありません。

そうでない場合は、それreturn nullを確認するか、throw単にArgumentException()

于 2012-06-29T13:54:33.097 に答える
0

アプリケーションが誤った状態または誤った状態に陥った場合に例外がスローされ、未処理のまままたは特別な注意を払わずに続行すると損傷が発生する可能性があるという事実を考慮します。

データが少なすぎて意味のある分析を生成できない場合は、結果の計算が正しいか、正しくないか、有害であるかなどを判断するのはあなた次第です。

また、例外をスローするということは、プログラムの通常の実行パスを中断し、追加のパス(例外処理パス)を入力することを意味することにも注意する必要があります。

そのような状況を何らかのメッセージでユーザーに通知し、強制的に例外をスローするのではなく、通常の方法でプログラムを終了または続行させます。

于 2012-06-29T13:58:53.447 に答える
0

ばかげたパラメータが渡されたためにが間違った方法で使用された場合CalculateMACD、これはプログラミングエラーと見なすことができ、例外をスローする必要があります。この場合、例外をスローした場合の結果について心配する必要はありません。例外は、開発環境でアプリケーションをテストするときにのみスローされる必要があるためです。

ただし、問題のあるパラメーターが実稼働環境で渡される可能性がある場合は、これが正常な状態であるかどうかを判別する必要があります。この場合、戻り値で適切な情報を返すことを検討してください(特別なプロパティまたはnullたとえば返すことによって)。

発生してはならない例外的な状態である場合は、例外をスローするのがおそらくより良い方法です。この場合、アプリケーションがその後もスムーズに実行されるか、少なくとも適切で理解しやすいメッセージで終了することを確認してください。

于 2012-06-29T14:18:12.400 に答える
0

引数を検証することは一般的な良い習慣です。一般的な引数チェックが行われるライブラリがあるため、これらのチェックを繰り返す必要はありません。これは、私が作成してプロジェクトに使用したArgumentValidatorと呼ばれるものです。

サンプルの使用法は次のようになります。

public void AddPerson(string personId, Person personData)
        {
            Throw.IfNullOrEmpty(personId, nameof(personId));
            Throw.IfNull(personData, nameof(personData));

..

public void Compute(int generation)
        {
            Throw.IfNot(() => generation > 100);

..

 public void Compute(int generation)
        {
            Throw.IfOutOfRange(generation, 1, 100, nameof(generation));
于 2016-08-21T00:18:50.527 に答える