失敗時に例外がスローされるか、nullが返されるかを制御する追加のブール型パラメーターを持つメソッド/関数によく遭遇します。
どちらの場合がより良い選択であるかについてはすでに議論がありますので、ここではこれに焦点を合わせません。たとえば、マジック値を返す、例外をスローする、失敗した場合にfalseを返すなどを参照してください。
代わりに、両方の方法をサポートしたい理由があると仮定しましょう。
個人的には、そのようなメソッドはむしろ2つに分割する必要があると思います。1つは失敗時に例外をスローし、もう1つは失敗時にnullを返します。
それで、どちらが良いですか?
A:$exception_on_failure
パラメータ付きの1つのメソッド。
/**
* @param int $id
* @param bool $exception_on_failure
*
* @return Item|null
* The item, or null if not found and $exception_on_failure is false.
* @throws NoSuchItemException
* Thrown if item not found, and $exception_on_failure is true.
*/
function loadItem(int $id, bool $exception_on_failure): ?Item;
B:2つの異なる方法。
/**
* @param int $id
*
* @return Item|null
* The item, or null if not found.
*/
function loadItemOrNull(int $id): ?Item;
/**
* @param int $id
*
* @return Item
* The item, if found (exception otherwise).
*
* @throws NoSuchItemException
* Thrown if item not found.
*/
function loadItem(int $id): Item;
編集:C:他に何か?
多くの人が他のオプションを提案したり、AとBの両方に欠陥があると主張しています。そのような提案や意見は歓迎され、関連性があり有用です。完全な回答には、このような追加情報を含めることができますが、署名/動作を変更するパラメーターが良いアイデアであるかどうかという主要な質問にも対処します。
ノート
誰かが疑問に思っている場合:例はPHPにあります。しかし、PHPまたはJavaにある程度似ている限り、この質問は言語全体に当てはまると思います。
loadItemOrNull(id)
かどうかloadItemOr(id, defaultItem)
を検討してください。アイテムが文字列または数値の場合、多くの場合そうです。