15

私は、コード検証メソッドの引数のどこで、どのくらいの頻度で、疑問に思っています。

以下のクラスの例 (.dll ライブラリ) では、どの方法が最適だと思いますか? 一部のオブジェクトができないことを検証したいとしますnull(ただし、メソッドを適切に実行するために必要な他の検証である可能性があります)。ポイント1.で一度だけチェックする方が良いですか?ユーザーが利用できるパブリックメソッドで、後で「自分を信頼する」ことで、他のプライベートメソッドではnullにならないか、少し偏執的になり、毎回チェックすることをお勧めします使用される時間 (ポイント 2. 3. および 4.)

オブジェクトを使用する直前に (ポイント 2、3、4 で) チェックすることで、これらのプライベート メソッドを使用してクラス内の何かを変更し、有効なオブジェクトを渡すことを「忘れる」ことにした場合に、将来保護されます。また、将来新しいパブリック メソッドを追加する場合、検証について覚えておく必要はありません。一方、同じ条件を何度もチェックしています。または、他の提案がありますか?

public class MyClass()
{
    public MyClass()
    {
    }

    public void ProcessObject(SomeObject obj)
    {
        //1. if (obj == null) throw new ArgumentException("You must provide valid object.");

        DoSomething(obj);
        DoMore(obj);
        DoSomethingElse(obj);
    }

    private void DoSomething(SomeObject obj)
    {
        //2. if (obj == null) throw new ArgumenException("You must provide valid object.");
        //do something with obj...
    }

    private void DoMore(SomeObject obj)
    {
        //3. if (obj == null) throw new ArgumentException("You must provide valid object.");
        //do something with obj...
    }

    private void DoSomethingElse(SomeObject obj)
    {
        //4. if (obj == null) throw new ArgumentException("You must provide valid object.");
        //do something with obj..
    }
}  
4

3 に答える 3

12

他の開発者が使用できるように公開している API である場合は、各メソッドで、 または のいずれかを実際にスローする必要がありArgumentExceptionますArgumentNullException

他の開発者が直接対話しない内部クラスまたはメソッドの場合、私は を使用しますDebug.Assert。したがって、デバッグ モードでは追加のデバッグ情報を取得し、リリース モードではそれを取り除かれ、これらすべての引数を実行しなくてもパフォーマンス上の利点が得られます。どこでもチェック。

于 2012-06-17T18:51:39.563 に答える
5

優れたソフトウェア設計方法では、互いに独立している必要があります。それらを任意の順序で使用でき、互いに分離できる必要があります。そうです、すべてのメソッドで同じ条件を何度も確認する必要があります。

編集: obj が null でないことを確認する Pre-Condition で CodeContract を使用します。これは、メソッドが正しく機能するための前提条件であるように思われるためです。

于 2012-06-17T18:51:10.280 に答える
3

各パブリック メソッドは、その入力を検証する必要があります。

以前に検証されたオブジェクトを渡すだけの場合、プライベートメソッドはクラス内の他のパブリックメソッドの検証に私見を依存できます。プライベート メソッドはクラスにカプセル化されるため、検証の責任はクラスに残ります。

ただし、(パブリック メソッドに渡されたものではなく) 計算されたパラメーターを受け取るプライベート メソッドがある場合は、追加の検証を行う必要があります。

単体テストはクラスのパブリック インターフェイスをテストし、検証が .NET のみの場合SomeObjectは失敗します。その場合、プライベート メソッドで検証を複製しません。nullProcessObject

于 2012-06-17T18:48:46.757 に答える