では、次のコードブロックを持って言う:無効な実行状態を処理する方法は?
if (Light.On) {
// do something...
} else if (Light.Off) {
// do something else...
} else {
// this state should never be reached
}
は今のアプリケーション・ロジックは、コードのこの部分では、最後の状態に到達してはならないことを指示することを想定し、それがで判定することができるものではありませんコンパイル時。アプリケーションの他の部分で設定できる他の州(例:Light.Broken
)がありますが、ここでは使用されていません。
最後のelse
ブロックにはどのようなコードを追加しますか?
- コードを入力しないでください。
- いくつかのロギング機能を追加すると、開発者として不正な状態になったことが分かります。
- 状態には到達してはならないため例外がスローされ、とにかく到達していれば何かが間違っている必要があります。
最初のオプションは私にとっては妥当ではないようですが、希望する何かが正しい選択ではないようです。オプション2では、アプリがすぐにクラッシュしないという利点があります。そのため、テストでは検出されなかったまれなケースでも、顧客はアプリケーションの使用を継続でき、開発者には問題が通知されます。オプション3は、クラッシュするアプリを引き起こします。これは明らかに顧客に体験してもらいたいことではありませんが、何かが間違っていることを明確にしています。
このような状況を処理する最善の方法は何ですか?コメントに基づいて
EDIT:
議論を操縦するためにいくつかの追加の考慮:
- 上記のコードが含まれている方法の契約は、任意の他の値をに設定することを許可しませんその瞬間にオンとオフ。
- コードがアプリケーションのそれほど重要ではない部分にあると仮定します。
どのようにこのようなソリューションを実装していますか?あなたは実際にいくつかの '開発'フラグを実装し、エラー処理をその価値に基づいていますか?それは私のようなコードを非常にきれいにしないようです... – Daan
私たちのビルドスクリプトは、バージョン番号を求めるプロンプト。 reelaseのビルドが行われている場合は、バージョンがエンジニアリングリリースとしてマークされています。実行時には、それに応じて動作する標準エラー報告機能があります。 – PaulJWilliams
Java 1.4以降、AssertionErrorを生成するassert命令を使用することもできます。デフォルトでは、アサーションは実行時に無視されます(no-opsとして動作しますが、-ea JVMスイッチを使用してアサーションを有効にできます)。 –