2009-04-15 15 views
0

では、次のコードブロックを持って言う:無効な実行状態を処理する方法は?

if (Light.On) { 
    // do something... 
} else if (Light.Off) { 
    // do something else... 
} else { 
    // this state should never be reached 
} 

は今のアプリケーション・ロジックは、コードのこの部分では、最後の状態に到達してはならないことを指示することを想定し、それがで判定することができるものではありませんコンパイル時。アプリケーションの他の部分で設定できる他の州(例:Light.Broken)がありますが、ここでは使用されていません。

最後のelseブロックにはどのようなコードを追加しますか?

  1. コードを入力しないでください。
  2. いくつかのロギング機能を追加すると、開発者として不正な状態になったことが分かります。
  3. 状態には到達してはならないため例外がスローされ、とにかく到達していれば何かが間違っている必要があります。

最初のオプションは私にとっては妥当ではないようですが、希望する何かが正しい選択ではないようです。オプション2では、アプリがすぐにクラッシュしないという利点があります。そのため、テストでは検出されなかったまれなケースでも、顧客はアプリケーションの使用を継続でき、開発者には問題が通知されます。オプション3は、クラッシュするアプリを引き起こします。これは明らかに顧客に体験してもらいたいことではありませんが、何かが間違っていることを明確にしています。

このような状況を処理する最善の方法は何ですか?コメントに基づいて

EDIT:

議論を操縦するためにいくつかの追加の考慮:

  • 上記のコードが含まれている方法の契約は、任意の他の値をに設定することを許可しませんその瞬間にオンとオフ。
  • コードがアプリケーションのそれほど重要ではない部分にあると仮定します。

答えて

6

開発中 - ハードに失敗して高速に失敗します。実行時の例外を投げたり、Assert(false)だけを投げる。

リリースシャットダウン時に正常に終了します。あなたのアプリは使用不可能な状態にあり、あなたは本当にクラス不変式など、あなたが普通にやることはできません。ユーザーにあなたの仕事を保存する機会を与えます。例えば、エラーを記録してください。 devチームとシャットダウンします。

EDIT:コメントに基づいて追加されました。

関数の契約によって、関数入力時にlight shouoldがオンまたはオフであると指定された場合、他の状態はエラーです。私の元の答えに概説された原則に従って、関数は失敗するはずです。

「非クリティカル」アスペクトについて - 関数の前提条件が満たされていない場合は、アプリケーションが壊れていることを意味します。重要ではないコードでエラーが検出された場合でも、問題自体は重要ではないことを意味するわけではありません。無効な状態を作成するバグがコードの重要な部分にも影響しないことを知る方法はありません。

+0

どのようにこのようなソリューションを実装していますか?あなたは実際にいくつかの '開発'フラグを実装し、エラー処理をその価値に基づいていますか?それは私のようなコードを非常にきれいにしないようです... – Daan

+0

私たちのビルドスクリプトは、バージョン番号を求めるプロンプト。 reelaseのビルドが行われている場合は、バージョンがエンジニアリングリリースとしてマークされています。実行時には、それに応じて動作する標準エラー報告機能があります。 – PaulJWilliams

+0

Java 1.4以降、AssertionErrorを生成するassert命令を使用することもできます。デフォルトでは、アサーションは実行時に無視されます(no-opsとして動作しますが、-ea JVMスイッチを使用してアサーションを有効にできます)。 –

0

第3のオプションは、他の状態が無効なので、無効な状態を示す例外と例外を投げるべきであるように正しいです。

2

まあ...それは異なります。ブールテストの3番目のケースを持つと、私は泣きたいと思うでしょう。それはちょうどノイズ、混乱を追加し、私に感じるように開発者が少なくとも混乱していたと言っている。

ブール値でない場合は、何でもできると思います... ifが問題のコードに関連する状態をキャプチャすると、他のケースを無視するだけで害はありません。将来的にさらなるケースが必要になる可能性が高い場合は、明確にするためにコメントを表示するだけで十分でしょう。

+0

この場合、if文は問題のコードに関連する状態を取得しますが、他の状態はここでは許可されません。問題は、許可されていない状態に達した(違法な)状況に対処する方法です。あなたはこの状況でもその事件を単に無視しますか? – Daan

+0

許可されていないものは無視しないでください。 「許されない」と「重要でない」との間には違いがあります。 – paxdiablo

+0

@Pax私は同意しますが、それでも問題は残っています:ログのエントリを作成して続行するか、このチェックがアプリケーションの重要ではない部分にあっても、すぐにアプリケーションをシャットダウンしますか? – Daan

0

何もしないでください。あなたが気にするのは、ライトが点灯しているかどうかです。

そうしないと、すべての状態が列挙されます。

他の状態が許可されていない場合は、エラーが発生します。彼らが許可されているが無関係ならば、無視するだけです。適切に設計されたコードでは、問題はありません。

ここでは、Light.OnとLight.Offを同時に設定できるデザインが主な問題です。 Light.Stateは、{on、flickering、off、broken、unplugged、exploded、emission_dangerous_gamma_rays}のいずれかに設定されている状態を使用する必要があります。

+0

ライトがオンかオフかだけが気になりますが、ライトはこの時点でオンまたはオフでなければなりません。それが他のものであれば、私のコードの一部が壊れていなければなりません。あなたはまだ単純な状況を無視していますか? – Daan

+0

このコード例のライトは列挙型である可能性があるため、OnとOffを同時に設定することはできません。あなたは、On、Off、...をそのような状態として考えることができます。 – Daan

+0

これは重要な意味です(コードが壊れています)。可能なものを保存してください(プログラムが壊れているとデータが信頼できないことを意味するため、ユーザー文書以外のどこかに保存してください)。 – paxdiablo

0

例外をスローします。

あなたが言ったように、3番目のケースは決して起こるべきではありません。それが起こった場合、何かが間違っていて、他に何が間違っているのか分からない。

また、コードが実際には機能していないときにコードが正常に機能していると考えるようにしたくない場合もあります。

さらに、リリース前に問題を見つけやすくなりました。

1

既に述べたように、開発段階ではできるだけ早く表示する必要があります。リリース段階では、この無効な状態に到達することがどれほど重要であるかによって異なります。

少なくとも、デバッグ目的でログを発行することです。

次に、以前の有効な状態に戻るか、新しい有効な状態に戻ることによって、この無効な状態から回復しようとすることができます。

最後に何も安全ができない場合は、実行を終了することができます(ユーザーと管理者への警告が表示されます)。

0

開発版では、例外をスローするだけです。リリースバージョンで

:いくつかの一時ファイルに

  • 例外
  • 保存ユーザの作業を投げ可能であれば
  • (小さなヘルパーアプリケーションを使用して)クラッシュダンプを保存して、ユーザーにオプションを提供します問題を特定して修正できるように送信してください。
関連する問題