15

ノードのエラーメッセージが特に役に立たない場合があることを考慮して、プログラミングエラーをできるだけ早くキャッ​​チし、一般的に問題を特定するメッセージを取得できるように、関数で assert を自由に使用するのが好きです。

function doSomething(arg1, arg2){
  assert(!arg1, "arg1 is undefined");
  assert(!arg2, "arg2 is undefined");
  assert(!arg1.expectedFn, "arg1 does not have expectedFn");

  arg1.expectedFn(function(blah){
    ...
  }
}

node/javascript プログラムでこれを行うのは特に悪いことですか? これはパフォーマンスに影響しますか?

4

1 に答える 1

6

(これは事実の投稿というよりは意見なので、価値があるものとして受け取ってください)

アサートは確かにパフォーマンスには何の役にも立ちませんが、適度に使用すれば、問題になるほど深刻な影響があるとは思えません。とはいえ、一般的に言えば、可能な限りアサートするよりも、優れたテスト カバレッジが望ましいと言えます。また、作成する assert は、特に不透明でない限り、実行時に自然にスローされるエラーと冗長であってはなりません。

doSomething の修正された (そしていくらか工夫された) バージョンを考えてみましょう -

function doSomething(arg1, arg2){
  var res = arg1.expectedFn(function(blah){
    ...
  }
  return res + arg2;
}

arg1 の存在をチェックしても意味がないか、関数名 expectedFn が含まれていると主張します。どちらかが定義されていない場合、javascript ランタイムは、何が起こったかを正確に示すかなりわかりやすい TypeError をスローします。アサーションは冗長です。

ただし、ここで arg2 をテストすることが望ましい場合があります。それが未定義であり、 res が文字列または数値であると仮定すると、文字列に「未定義」が追加されるか、 NaN が返されます。どちらも非常に微妙なエラーであり、誰も気付かないうちに長期間存在する可能性があります。デバッグ目的で失敗するのを遅らせるのではなく、遅かれ早かれ失敗させたい場合は、正しい型であることを確認するためにいくつかのアサートを追加することをお勧めします。

一般に、厳密さが気になる場合は、包括的なテストを作成することにエネルギーを費やす方がよいと思います。 . assert が適切な場合はいくつかありますが、それは直接的なエラーがなく不正な結果が長期間存在する可能性があるが、望ましくない副作用を引き起こす可能性がある場合に限定されます。

于 2012-11-02T18:13:34.783 に答える