私はいくつかの入力を期待する方法を書いています。今、私は(入力が正しいことを確認すなわち)防御的な方法でそれを書くことをお勧めだろうと思いました。
この方法を使用する唯一の1位(信頼性)がありますので、基本的には、入力は大丈夫でなければなりません。
、私の質問があるので、
- 防御的プログラミングはここに正当化されますか?
- もしそうなら、それがオンまたはオフ例外をスローする必要がありますか?
この方法を使用する唯一の1位(信頼性)がありますので、基本的には、入力は大丈夫でなければなりません。
それはあなたの関数についてのあなたそのため、この方法では、素晴らしいことです。あなたは自分の機能のための契約を定義しました。これは、この機能があること、言う期待する有効な入力を。この場合は、無効な入力が検出されたときに例外をスローすることにより、防御的プログラミングを採用することは非常に良い習慣です。この例外は、契約を破ったし、無効な入力を使用して関数を呼び出し、あなたの関数の呼び出し元の大幅簡素化検出、意志。
あなたは、専用の例外をスローしなかった場合は(運がよければ)よりも、あなたの関数は、例えば、汎用的な技術的な例外をスローすることによって壊すかもしれないNullPointerException
多分かArrayIndexOutOfBoundsException
。あなたの関数が呼び出されたときに何か間違ったが、起こったことを、このようなスタックトレースまだショー、。しかし、あなたは起こった「何を」、分析する必要があります。最悪のケースでは、あなたの関数は、「何とか」無効な入力を処理するすべての例外をスローしていないでしょう。よりあなたのプログラムは、後に、一見無関係な場所を上破ることができるか、さらに悪い場合には、それが壊れていない、それはユーザーに誤った結果を提示します。
防御的プログラミングはここに正当化されますか?
はい、それは間違いです。
もしそうなら、それがオンまたはオフ例外をスローする必要がありますか?
未チェックの例外対チェックまだ進行中の議論です。あなたはStackOverflowの上でこの質問に対する多くの答えを見つけることができます。Scalaの言語は未チェックの例外があります。私は個人的にあまりにもそれらを好みます。
どのような関数が想定した場合、無効な入力をあまりにも?
典型的には、これらは、ヒトからの入力を受け取る機能、です。例えば、ユーザ登録フォームが短すぎない少なくとも1つの数字が含まれているパスワードが必要です。成功と失敗-関数の呼び出し元が戻り値の両方の種類を検査することを余儀なくされ、その結果、この場合には、「失敗」を期待されていると何とか関数の戻り値でエンコードする必要があります。このような戻り値は使用してモデル化することができる代数的データ型を。Javaは自然にモデルのADTに許可していないと我々は例外をスローすることにより、モデルの失敗に慣れ。たぶん、この場合には例外はまだ意味をなさない確認。
編集::他の回答が「いつ」検証する上でより詳細に入ると、ときにありません。要約すると:publicメソッドを-はい。レイヤ間で同じ検証を繰り返さないでください。