我听到有些声音说从方法返回null值并进行检查是不好的设计。我希望听到一些原因。
伪代码:
variable x = object.method()
if (x is null) do something
我听到有些声音说从方法返回null值并进行检查是不好的设计。我希望听到一些原因。
伪代码:
variable x = object.method()
if (x is null) do something
Collections.emptyList()
),而不是null,因为这意味着我的客户端代码更加简洁。Collection<? extends Item> c = getItems(); // Will never return null.
for (Item item : c) { // Will not enter the loop if c is empty.
// Process item.
}
...这比以下方式更加简洁:
Collection<? extends Item> c = getItems(); // Could potentially return null.
// Two possible code paths now so harder to test.
if (c != null) {
for (Item item : c) {
// Process item.
}
}
if (c == null)
:如果为真,则退出代码(_返回 false、抛出异常、回滚等_);否则(独立的代码块,而不是 else 块!),继续执行。 - ADTC这是原因。
在Clean Code by Robert Martin中,他写道,当你可以返回空数组时,返回null是不好的设计。既然预期结果是一个数组,为什么不呢?这将使您能够在没有任何额外条件的情况下迭代结果。如果它是一个整数,也许0就足够了,如果是一个哈希表,就是一个空的哈希表等等。
前提是不要强制调用代码立即处理问题。调用代码可能不想关注它们。这也是为什么在许多情况下,异常比nil更好的原因。
返回null的好处:
使用不当的情况:
在这些情况下,抛出异常更为适当,因为:
但是,异常不应用于处理正常的程序操作条件,例如:
boolean login(String,String)
看起来不错,AuthenticationContext createAuthContext(String,String) throws AuthenticationException
也不错。 - sfussenegger在面向对象的世界中,返回NULL是一种糟糕的设计。简而言之,使用NULL会导致以下问题:
请参阅此博客文章以获取详细解释:http://www.yegor256.com/2014/05/13/why-null-is-bad.html 。更多内容请参见我的书籍 Elegant Objects ,第4.1节。
bool TryGetBlah(out blah)
、FirstOrNull()
或 MatchOrFallback(T fallbackValue)
。 - Luke PuplettisEmpty()
),只有在它为真时才调用该方法。有人反对第二种方法,认为它性能较差 - 但正如Unix哲学所说,“珍惜人类时间胜过机器时间”(即微不足道的较慢性能浪费的时间比开发人员调试给出虚假错误的代码更少)。 - Sridhar Sarnobat谁说这是不好的设计?
检查空值是一种常见的做法,甚至是被鼓励的,否则你就会在各个地方面临 NullReferenceExceptions 的风险。最好优雅地处理错误而不是在不需要抛出异常时抛出。
根据您目前提供的信息,我认为还不够充分。
从CreateWidget()方法返回null似乎不好。
从FindFooInBar()方法返回null似乎没问题。
Create...
返回一个新的实例,或抛出异常;Get...
返回一个预期存在的实例,或抛出异常;GetOrCreate...
返回一个现有实例,如果不存在则返回新实例,或抛出异常;Find...
返回一个现有实例,如果存在,则返回该实例,否则返回null
。 对于集合查询 - Get...
始终返回一个集合,如果没有匹配的条目,则为空。 - Johann Gerell这取决于你使用的编程语言。如果你使用的是像C#这样的语言,其中表示缺少值的惯用方式是返回null,那么如果没有值,返回null是一个好的设计。相反,在像Haskell这样的语言中,惯用的方式是使用Maybe Monad处理这种情况,那么返回null将是一个不好的设计(即使可能性很小)。
null
还是“未初始化”null
。 - CervEd在这个领域,我有一个惯例,它对我很有帮助
对于单项查询:
Create...
返回一个新实例,或抛出异常Get...
返回一个预期的现有实例,或抛出异常GetOrCreate...
返回一个现有实例,如果不存在,则返回新实例,或抛出异常Find...
返回一个现有实例(如果存在),否则返回 null
对于集合查询:
Get...
总是返回一个集合,如果没有找到匹配项,则为空[1] 给定一些标准,明确或隐含,在函数名或参数中给出。
Get
方法,这样如果它不存在,就会抛出一个错误 - 我不需要检查返回值。而当我真的不确定某个值是否存在时,我使用Find
方法 - 这时我需要检查返回值。 - Johann Gerell