web-dev-qa-db-ja.com

コンストラクタから例外をスローする必要がありますか?

PHPでコンストラクタから例外をスローできることはわかっていますが、それを実行する必要がありますか?たとえば、パラメータの値が期待どおりでない場合など。

または、メソッドが呼び出されるまで例外のスローを延期する必要があります。どちらの場合も利点と欠点は何ですか?

46
WordsWorth

なぜ例外のスローを延期するのですか?

オブジェクトが指定されたパラメーターで適切にインスタンス化できないことがわかっている場合は、必ず例外をスローする必要があります。

そうしないと、誰かがオブジェクトのnullをテストする可能性がありますが、そうではなく、すべてが期待どおりに進んだと想定できます。

メソッドを呼び出さなくてもオブジェクトに対して実行できることはたくさんあります。リストに追加したり、比較したり、パラメーターとして送信したりすることができます。これらはすべて、それが有効なオブジェクトではないことを考えると、それは起こるべきではありませんでした。

76
Andrei G

コンストラクタが不正なパラメータで呼び出された場合は、例外をスローする必要があります(?)。そうしないと、期待どおりに動作しない不良オブジェクトを取得する可能性があります。

21
Peter Kiss

絶対に!!

オブジェクトを作成するためのパラメーターが有効でないか、契約に従っていない場合は、例外をスローする必要があります。オブジェクトが不正なデータで構築されており、呼び出し元に次のことを許可した場合にmanyの問題を引き起こす可能性があることを知ってフローを進めることはお勧めできません。どうぞ。

それは常に"早く失敗し、早く失敗"することをお勧めします

17
java_mouse

PHPでコンストラクタから例外をスローできることはわかっていますが、それを行う必要がありますか?

これが、オブジェクトの構築が失敗したことを通知する唯一の健全な方法です。

7
BЈовић

オブジェクトをインスタンス化する前にパラメーターセットを検証しないのはなぜですか?そうすることで、オブジェクトが確実に作成され、障害から発生する可能性のある副次的な影響をすべて取り除くことができます。

私はあなたがあなたのコンストラクターで物事をチェックして例外を投げることができることを知っていますが、私は彼らが失敗しないような方法で私のコンストラクターを書くことを好みます。オブジェクトをインスタンス化する前にパラメーター検証を実行し、コンストラクターを失敗させることなく例外をトスすることができます。また、私は通常、新しいオブジェクトをコンストラクターでインスタンス化しようとせず、必要に応じて代わりにインスタンス化することを選択します。

ただ私の意見です。 PHPは多くの自由を提供します-楽しんでください!

3
Tony Mays