web-dev-qa-db-ja.com

プロダクションコードのassertステートメントでnot nullをアサートする必要がありますか?

this の質問を見たことがありますが、assertキーワードの使用法についていくつか質問があります。私はassertの使用について他の数人のコーダーと議論していました。この使用例では、特定の前提条件が満たされた場合にnullを返すことができるメソッドがありました。私が書いたコードはメソッドを呼び出し、それがnullを返さないことを表明し、返されたオブジェクトを引き続き使用します。

例:

class CustomObject {
    private Object object;

    @Nullable
    public Object getObject() {
        return (object == null) ? generateObject() : object;
    }
}

次のように使用するとします。

public void useObject(CustomObject customObject) {
    object = customObject.getObject();
    assert object != null;
    // Do stuff using object, which would throw a NPE if object is null.
}

assertは削除する必要があると言われました。本番用コードでは決して使用しないでください。テストでのみ使用してください。本当?

32
Big_Bad_E

programmingの間違い、つまりバグを見つけるのに役立つときは常に、アサートを自由に使用します。

論理的に発生する可能性のあるもの、つまり形式が正しくない入力をキャッチするためにassertを使用しないでください。エラーが回復不可能な場合にのみ、assertを使用します。

アサーションのチェック時に実行されるコードには、プロダクションロジックを含めないでください。ソフトウェアが適切に記述されている場合、これはほんとうに真実ですが、そうでない場合、アサーションを有効または無効にすると、微妙な副作用と異なる全体的な動作が発生する可能性があります。

会社が「テストコード」と「プロダクションコード」で同じことを行っているが、異なるコードベース(または編集の異なる段階)で作業している場合は、そこから抜け出して二度と戻らないでください。そのレベルの無能を修正しようとすることは、おそらくあなたの時間の無駄です。会社がテストのコードの外にアサートステートメントを配置していない場合は、運用ビルドでアサートが無効になっていることを伝えてください。そうでない場合は、その間違いを修正することが最優先事項です。

アサートの値は、テストスイートだけでなく、ビジネスロジック内で正確に使用されます。これにより、コードの大きなチャンクを通過してこれらすべてのアサーションをトリガーするために多くのものを明示的にテストする必要がない多くの高レベルのテストを簡単に作成できます。いくつかのプロジェクトでは、典型的なテストは実際には何もアサートしませんでした。特定の入力に基づいて計算を実行するように命令しただけで、数百のアサーションがチェックされ、小さなロジックの深い部分でも問題が見つかりました。

3
Kafein

アサートはいつでも使用できます。議論は、いつ使うかです。たとえば the guide の例:

  • パブリックメソッドの引数チェックにアサーションを使用しないでください。
  • アサーションを使用して、アプリケーションが正しく動作するために必要な作業を行わないでください。
2
Gatusko