我经常遇到带有附加布尔参数的方法/函数,该参数控制是否在失败时引发异常或返回null。
已经讨论了在哪种情况下哪种选择是更好的选择,因此在这里我们不要专注于此。参见例如返回魔术值,抛出异常或在失败时返回false?
相反,让我们假设我们有一个很好的理由要支持这两种方式。
我个人认为这样的方法应该分为两种:一种在失败时引发异常,另一种在失败时返回null。
那么,哪个更好?
答:一种带$exception_on_failure
参数的方法。
/**
* @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:两种不同的方法。
/**
* @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)
对您有意义。如果item是字符串或数字,通常会这样做。