質問をざっと見て、私は最近assert
Javaでキーワードを発見しました。最初はワクワクしていました。まだ知らなかった便利なもの!入力パラメータの有効性をチェックするためのより効率的な方法!イェーイ学習!
しかし、それから私は詳しく調べました。私の熱意は、1つの単純な事実によって、「完全に消し去られる」ほど「和らげられる」ことはありませんでした。アサーションをオフにすることができます。*
これは悪夢のように聞こえます。listOfStuff
入力がである場合にコードを続行したくないと主張している場合、null
一体なぜその主張を無視したいのでしょうか。プロダクションコードの一部をデバッグしlistOfStuff
ていて、誤って渡された可能性があるがnull
、そのアサーションがトリガーされたというログファイルの証拠が見当たらない場合は、listOfStuff
実際に有効な値が送信されたとは信じられません。また、アサーションが完全にオフになっている可能性についても説明する必要があります。
そして、これは私がコードをデバッグしていることを前提としています。アサーションに慣れていない人は、それを見て、(かなり合理的に)アサーションメッセージがログに表示されlistOfStuff
ない場合は問題ではないと想定する可能性があります。あなたの最初の出会いがassert
野生であった場合、それが完全にオフにされる可能性があることさえあなたに起こりますか?結局のところ、try/catchブロックを無効にできるコマンドラインオプションがあるわけではありません。
そのすべてが私の質問に私をもたらします(そしてこれは質問であり、暴言の言い訳ではありません!私は約束します!):
私は何が欠けていますか?
assert
Javaの実装を、私が認めているよりもはるかに便利にするニュアンスはありますか?コマンドラインから有効/無効にする機能は、実際にはいくつかのコンテキストで非常に価値がありますか?次のようなステートメントの代わりに本番コードで使用することを想定している場合、私はそれをどういうわけか誤解していif (listOfStuff == null) barf();
ますか?
私はここで私が得ていない重要な何かがあるように感じます。
*技術的に言えば、実際にはデフォルトでオフになっています。それらをオンにするには、邪魔にならないようにする必要があります。しかし、それでも、それらを完全にノックアウトすることができます。
編集: 悟りが要求され、悟りが受け取られました。
何よりもまずデバッグツールであるという概念assert
は、私にとって意味のあるものにするために非常に長い道のりを歩んでいます。
開発者は悪い入力は不可能だと考えているため、本番環境では重要なプライベートメソッドの入力チェックを無効にする必要があるという考えにまだ問題があります。私の経験では、成熟したプロダクションコードは、さまざまな程度の正気度の急速に変化する要件を対象としたさまざまな程度のスキルを持つ人々によって何年にもわたって開発された、狂った、広大なものです。そして、悪い入力が本当に不可能であるとしても、今から6か月後のずさんなメンテナンスコーディングの一部がそれを変える可能性があります。 提供されているリンクgustafc(ありがとう!)には、例としてこれが含まれています。
assert interval > 0 && interval <= 1000/MAX_REFRESH_RATE : interval;
本番環境でこのような単純なチェックを無効にすると、ばかげて楽観的になります。ただし、これはコーディング哲学の違いであり、壊れた機能ではありません。
さらに、私は間違いなくこのようなものの価値を見ることができます:
assert reallyExpensiveSanityCheck(someObject) : someObject;
この機能を理解するのを手伝ってくれたすべての人に感謝します。大変感謝しております。