koe*_*oen 123 oop null return-value
我听到一些声音说从方法中检查返回的空值是糟糕的设计.我想听听一些原因.
伪代码:
variable x = object.method()
if (x is null) do something
Run Code Online (Sandbox Code Playgroud)
Ada*_*ski 198
不返回null的基本原理是您不必检查它,因此您的代码不需要根据返回值遵循不同的路径.您可能想要查看Null对象模式,它提供了有关此内容的更多信息.
例如,如果我在Java中定义一个返回Collection的方法,我通常更喜欢返回一个空集合(即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.
}
Run Code Online (Sandbox Code Playgroud)
......比以下更清洁:
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.
}
}
Run Code Online (Sandbox Code Playgroud)
Max*_*yak 67
这就是原因.
在罗伯特·马丁的"清洁代码"中,他写道,当你可以改为返回空数组时,返回null是糟糕的设计.由于预期的结果是数组,为什么不呢?它将使您能够在没有任何额外条件的情况下迭代结果.如果它是一个整数,那么0就足够了,如果它是一个散列的空哈希.等等
前提是不强制调用代码来立即处理问题.调用代码可能不想关注它们.这也是为什么在许多情况下例外优于零.
Zer*_*ept 37
返回null的好用法:
不良用途:试图替换或隐藏异常情况,例如:
在这些情况下,抛出异常更加充分,因为:
但是,异常不应用于处理正常的程序操作条件,例如:
yeg*_*256 27
是的,在面向对象的世界中,返回NULL是一种糟糕的设计.简而言之,NULL使用会导致:
查看此博客文章以获取详细说明:http://www.yegor256.com/2014/05/13/why-null-is-bad.html.更多内容在我的书中,优雅对象,第4.1节.
Bra*_*don 23
谁说这是糟糕的设计?
检查空值是一种常见的做法,甚至是鼓励的,否则你将面临NullReferenceExceptions的风险.更好地处理错误优雅而不是在不需要时抛出异常.
jco*_*lum 17
根据你到目前为止所说的,我认为没有足够的信息.
从CreateWidget()方法返回null似乎很糟糕.
从FindFooInBar()方法返回null似乎很好.
Gre*_*ech 10
这取决于您使用的语言.如果您使用的语言类似于C#,其中指示缺少值的惯用方法是返回null,那么如果您没有值,则返回null是一个很好的设计.或者,在诸如Haskell之类的语言中,在这种情况下习惯使用Maybe monad,然后返回null将是一个糟糕的设计(如果它甚至可能).
我在这个领域有一个会议,对我很有帮助
对于单项查询:
Create...返回一个新实例,或者抛出Get...返回预期的现有实例,或抛出GetOrCreate...返回现有实例,如果不存在则返回新实例,或者抛出异常Find...返回现有实例(如果存在),或者null对于集合查询:
Get...始终返回一个集合,如果没有找到匹配的[1]项,则该集合为空[1] 给定一些标准,显式或隐式,在函数名称中或作为参数给出。
如果您阅读了所有答案,那么这个问题的答案就会变得清晰,取决于方法的种类.
首先,当异常发生时(IOproblem等),抛出逻辑异常.当确切的东西是特殊的可能是一个不同的主题..
每当一个方法预计可能没有结果时,有两个类别:
直到我们有一个官方的方式来表示函数可以或不能返回null,我尝试使用命名约定来表示.
就像你对预期失败的方法有Try Something()约定一样,当方法返回中性结果而不是null时,我经常将我的方法命名为Safe Something().
我还没有完全确定这个名字,但是无法想出更好的东西.所以我现在正在使用它.