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


46

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

または、メソッドが呼び出されるまで例外のスローを延期する必要があります。両方の場合の長所と短所は何ですか?


問題は、ユーザーに見苦しい例外エラーメッセージを表示させたいですか?

15
@LawrenceCheroneいいえ、それは問題ではありません。どういたしまして。問題は、アクターが渡された引数からオブジェクトを有効な状態に設定できない場合にすぐに例外を発生させるか、無効な状態の可能性があるインスタンスで動作するメソッドが呼び出されるまでそれを延期するかです。ただし、プログラマに適しています。

4
@LawrenceCheroneそのとおりです。ソフトウェアが故意に失敗することはありません。ただ動き続けて何が起こるかを見るだけです。/ s
user253751

@immibis良い皮肉は良いです。
-kodeart

これは素晴らしい質問です!!! 私は今日までこの考えさえ考えませんでした。
リースジョンズ

回答:


75

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

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

そうしないと、誰かがあなたのオブジェクトをnullに対してテストするかもしれませんが、それはそうではなく、すべてが期待通りに進んだと仮定することができます。

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


21

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


17

絶対に!!

オブジェクトを構築するためのパラメーターが無効であるか、契約に従っていない場合は、例外をスローする必要があります。 呼び出し元が先に進むことを許可すると、多くの問題を引き起こす可能性のある不良データでオブジェクトが構築されることを知ってフローを進めることは得策ではありません。

常に「早く失敗し、早く失敗する」ことをお勧めします


7

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

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


2

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

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

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


この答えがなぜ投票されないのかはわかりません。オブジェクト構築の前にパラメーター検証を使用した有効なアプローチ(「ガード」メソッド)を提供します。これは、特定の(通常はビジネス)ルールのクラス/関数を設計するのに適した方法です。OPの質問にも直接回答しない場合でも、それは良いアドバイスです:)
kodeart
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.