1

多くの方法で定期的にチェックしたい事後条件があります。私はアサーションを正しく使用しているとかなり確信しています。つまり、コードが愚かなことをしていないことを確認するために何かをチェックするだけで、しばらくしてからアサーションをオフにするつもりです。しかし、私が今書いた後の状態が、私がいつも望んでいる状態とまったく同じであるかどうかはわかりません。だから私はそれをメソッドに入れました。しかし、その後、次の問題が発生しました。

public class Foo
{
    public void doSomethingRisky()
    {
        //...
        assert someBoolean();
    }

    private boolean someBoolean()
    {
        return bar && baz;
    }
}

対。

public class Foo
{
    public void doSomethingRisky()
    {
        //...
        verifySomeBoolean();
    }

    private void verifySomeBoolean()
    {
        assert bar && baz;
    }
}

無効なアサーションを使用してコンパイルした場合、前者のコードはsomeBoolean()呼び出されないため、パフォーマンスに影響はありません。しかし、Javaは「スマート」であるため、アサーションを無効にすると、2番目の形式でもアサーションを無効にしてもパフォーマンスが低下しません。

そして、より重要な質問は、明らかに、どちらがより良い実践ですか?

私はそれが明示的であり、再解釈や誤解の対象ではないので好きですが、同じ基礎を主張する以外に何かassert someBoolean()をするための動作を拡張したいので、他の形式はもう少し将来の証拠になるかもしれませんverifySomeBoolean()ブール値。私の腸はそれが事実であるかどうかを言いますが、私は古いコードを収まるようにつぶそうとするよりも再コーディングする方が良いです。賢者からの言葉をいただければ幸いです。

4

1 に答える 1

2

アサーションを編集していないと思いましたか?それらはコンパイルされており、JVM with でのみ有効にできると思いましたjava -ea

その場合、使用されていないときに空の呼び出しを最適化するのは JVM 次第-eaです。しかし、あなたは時期尚早に最適化しています。コードを理解しやすく、書きやすくします。次に最適化します。空のメソッドを呼び出しても、パフォーマンスの問題は発生しません。

アップデート:

スタイルに関しては、可能な限り問題に近いアサートを使用します。チェックのためだけにメソッドでアサートするのは好きではありません。

次に、assert() と Guava Preconditions には 2 つの異なるアプリケーションがあります。assertあなたの世界がまだあなたが思っていた世界であることを確認するために使用されるべきです。それはassert (1+1 == 2)一種のことです。呼び出し先パラメーターで assert() を使用しないでください。assert を使用して、真実でなければならないことを確認しますが、とにかくそれを確認しています。

Guava Preconditions は、使用する必要があるように見えます。これは入力の検証であり、契約の遵守を確認するために使用されます。たとえば、null 引数のチェック、自然数のみを使用する必要がある場合の負の数、適切にフォーマットされた文字列などです。

要約すると、 assert() は「重力があることを知っていても、重力がまだここにあることを確認させてください」であり、前提条件は「警察が許可するよりも速く移動しようとしていることを確認させてください」です。

于 2012-11-09T19:00:12.630 に答える