8

私たちのコードにアサートを入れるポイントは何ですか? アサーティブ プログラミングの利点は何ですか?

private void WriteMessage(string message)
{
    Debug.Assert(message != null, "message is null");

    File.WriteAllText(FILE_PATH, message);
}

たとえば、メッセージ変数をチェックして、ここで例外をスローできます。ここで assert を使用するのはなぜですか? それとも、 assert の利点を理解するのにこれは間違った例ですか?

4

7 に答える 7

10

また、ジム ショアによるこの記事で説明されているように、フェイル ファストの哲学もサポートしています。

于 2009-04-24T21:37:29.477 に答える
7

一部の人々が書く場所:

/*
 * This can never happen
 */

書く方がはるかに実用的です:

assert(i != -1);

単純なコンパイル時定数で簡単にオフにしたり、エラー レポートを準備するなどの別のことをさせたりできるので、私はアサートを使用するのが好きです。私は通常、何かをリリースするときにアサーションをオンのままにしません (少なくとも、通常の方法では)。

それらを使用することで、他の人のコンピューターで非常に愚かな間違いを犯すことから私を救ってくれました..私のアルファコードのテストを楽しんでいる勇敢な魂.. それらに加えて valgrind のようなツールを使用すると、コミットする前に何かひどいものを確実にキャッチできます。

于 2009-04-25T01:01:47.473 に答える
2

考慮すべき重要な違いは、アサーションでキャッチするエラーの種類です。私はしばしばアサーションを使用してプログラミング エラー (つまり、null パラメーターを指定してメソッドを呼び出す) をキャッチし、別のメカニズムを使用して検証エラー (たとえば、間違った長さの社会保障番号を渡す) を処理します。アサーションでキャッチされたプログラミングエラーについては、早く失敗したいです。検証エラーについては、あまり劇的に対応したくありません。データにエラーがあるのは普通のことかもしれません (たとえば、ユーザーが何らかのデータ入力を行っている場合など)。そのような場合、適切な処理は、エラーをユーザーに報告し、機能を継続することです。

于 2009-04-25T00:27:24.887 に答える
1

メソッドが null 以外のメッセージ パラメーターを受け取るように指定された前提条件がある場合、前提条件が成立しなくなり、バグの原因を修正する必要があるとすぐに、プログラムを FAIL にする必要があります。

セーフティ クリティカルなソフトウェアを開発するときは、アサーションがより重要になると思います。また、ソフトウェアが正式に指定されている場合は、アサーションを使用することをお勧めします。

于 2009-04-24T21:37:27.277 に答える
1

アサーション (およびコードの構築に関連する他の多くのトピック) に関する優れた議論については、Steve McConnel によるCode Completeを参照してください。彼はアサーションの効果的な使用に全章を割いています。

于 2009-04-24T21:39:30.673 に答える
1

それらを使用して、有効な依存クラスが提供されていることを確認します。たとえば、コンストラクター DI では、通常、何らかのアクションまたはサービスを提供するために依存しているある種の外部クラスを受け入れています。

assert(classRef !- null,"classRef cannot be null"); をアサートできます。classRef にメッセージが渡されるのを待って、 exception : access violation などの他の例外を取得する代わりに、コードを見てすぐにはわからないかもしれない同様にあいまいなものを取得します。

于 2009-04-24T22:01:25.923 に答える