私は正確に要点ではない応答をします。もちろん、パブリックメソッド(または好きな場所)でassertを使用できます。
重要なのは、何をすべきかどうかということです。私自身、アサーションを使用すべきかどうかについての他の人の反応を完全に理解しています。
しかし、私はアサーションを決して使用しないこと、そしてコードにアサーションが表示されることはめったにないことを認めなければなりません。私は数年しか働いていませんでしたが、私が働いていた4つのまったく異なる会社では、コードにアサーションはありませんでした。フライトを予約するための1,000万行を超えるコードWebアプリケーション、宇宙船コントロールセンター、ハイパーマーケットを管理するソフトウェア、またはバグトラッカーなどです。それらのどれもassertを使用しませんでした。すべての企業は異なるニーズと方法を持っていました。使用されたアサートはありません。
私にとってその理由は単純です。ここの人々は、アサーションはデバッグ用であると言います。それはいいです。また、速度を向上させるためにそれらを非アクティブ化することができます。それも結構です...最初は。プログラムが複雑になるほど、デバッグに時間がかかります。また、一部のバグは、コードカバレッジが100%であっても、広範な統合と検証のテストを行ったとしても、本番環境でのみ検出されます。ユーザーがあなたよりもアプリケーションを使用することになったからです。そして、彼らはそれをあなたと同じように使うことはありません。
本番ログでは、次のようなコードからのスタックトレースが引き続き表示されるため、おかしいです。
catch (MyException e) {
logger.war("This should never happen",e);
}
つまり、本番環境で何が発生する可能性があるかがわからないということです。
そして、あなたがチェックをする機会があれば、それをしてください。もちろん、ログコメントはここで役立つよりも面白いので、例外をポップアップさせる方がよいでしょう。
すべての場合において、本番環境で無効になるアサーションにしないでください。役に立たないから。例外を発生させる通常のコードにします。必要に応じてログに記録されていることを確認してください。UIにエラーが表示されることを確認します。そして、調査する例外とログを取得できることを確認してください。
重要なのは、いつの日か、警告をポップアップさせるようなことをするユーザーがいるということです。ひどく書かれたコードか何かのせいで、あなたはそれを見るでしょう。つまり、2日間を費やして、プログラムがこの奇妙な動作をする理由を見つける代わりに、開始点で完全なスタックトレースを使用して、2時間で問題を修正できるようになります。
アサーションが無効になっているチェックは、チェックがまったくない場合と同じです。それはあなたが書き、読みそして維持しなければならないコードです...無料で。私は、本番環境でのアサーションが物事を遅くするというパフォーマンスの議論全体を理解しています。はい、いくつかのケースでは、パフォーマンスの問題があります。ほとんどの場合、とにかくほとんど何も得られず、貴重なヒントを失います。