Coding style don';t return null——搜索函数要返回的内容

Coding style don';t return null——搜索函数要返回的内容,coding-style,Coding Style,全部。我正在读一本名为的书,其中一个想法是在编写方法时“不要返回null”。当函数必须返回null时,他建议“抛出异常”或“使用特殊情况” 如果方法返回类型是一个列表,我知道我可以返回一个空列表而不是null。但是,如果返回类型是一个特定的对象,该怎么办。例如,一种按唯一id搜索数据库并返回结果的方法。如果方法找不到任何内容,我应该返回什么 我尝试使用“抛出异常”,但最终为调用函数的任何地方编写了更多编码和附加逻辑 如有任何建议,将不胜感激 如果您不想返回null,那么您可以使用类之类的东西。n

全部。我正在读一本名为的书,其中一个想法是在编写方法时“不要返回null”。当函数必须返回null时,他建议“抛出异常”或“使用特殊情况”

如果方法返回类型是一个列表,我知道我可以返回一个空列表而不是null。但是,如果返回类型是一个特定的对象,该怎么办。例如,一种按唯一id搜索数据库并返回结果的方法。如果方法找不到任何内容,我应该返回什么

我尝试使用“抛出异常”,但最终为调用函数的任何地方编写了更多编码和附加逻辑


如有任何建议,将不胜感激

如果您不想返回null,那么您可以使用类之类的东西。

null被定义为不存在,这似乎完全符合您的要求。如果代码不返回任何内容,对吗

但是,一如既往,这要视情况而定

如果您的代码不打算什么都不返回,那么这样做可能会导致无法描述的问题。在这种情况下,抛出异常肯定更好<代码>1/null,无法在任何地方工作


如果不存在是一个完全有效的返回值,那么为什么要返回异常呢?当然,假设您已经准备好了代码来处理从查询返回的不存在的值,那么根本不需要抛出异常

我认为返回null没有任何问题,但抛出异常似乎是最明智的选择。最好是创建自己的自定义异常类

无论哪种方式,代码的外观都应该大致相同:

try {
    SearchResult someResult = searchForStuff();
}
catch ( ResultNotFoundException rnfe ) {
    /* do stuff */
}


/* almost the same as this */

SearchResult someResult = searchForStuff();

if ( someResult == null ) {
    /* do stuff */
}

抛出异常是一项昂贵的操作,因为有一个上下文切换,并且必须收集大量调试信息,因此您希望避免将抛出异常作为控制流程流的一种方式(特别是如果您可以在不抛出异常的情况下处理这种情况)。为了避免捕获异常,返回null是完全可以接受的

这方面的一个例子是C#中的几个例子。这些方法可以返回空值:

SingleOrDefault(); // returns a single instance of an object, or null if not found

FirstOrDefault(); // returns the first matching object, or null if not found
这允许您检查null,而无需尝试使用异常处理来确定控制流


我能想到的一个例外(请原谅我的双关语),就是使用例外来跨程序边界进行通信。例如,如果您在一个单独的DLL中有一个数据访问层,并且需要将数据库故障传回父程序,有时最好的方法是通过异常处理。

如果
Null
可能是您可以返回的值,如果找不到任何内容,则不应返回
Null
。例如,在:

[1, 2, 3, Null, 5].find(nonInteger) -> Null
[1, 2, 3, 4].find(nonInteger) -> Null
.find
函数不能返回
Null
以指示失败,因为有时它会在成功时返回
Null
!相反,您可以更改语义,或使用特殊对象:

# changed semantics (with extra information returned)
[1, 2, 3, Null, 5].find(nonInteger) -> index=4, value=Null
[1, 2, 3, 4].find(nonInteger) -> index=Null, value=Null

# changed semantics (with wrapper)
[1, 2, 3, Null, 5].find(nonInteger) -> new Maybe(Null)
[1, 2, 3, 4].find(nonInteger) -> new Maybe()

# special object
NoResultFound = new object()
[1, 2, 3, Null, 5].find(nonInteger) -> Null
[1, 2, 3, 4].find(nonInteger) -> NoResultFound

这本书的名字可能是重复的?它被称为“干净的代码”,但我想stackoverflow不喜欢这个名字出现在帖子上,所以有人把它删除了可选的好处是什么。从我的角度来看,它只将(obj==null)改为(optional.缺席())它为代码提供了一些额外的类型安全性-null的意图更加模糊,如果客户端不能正确处理它,可能会导致细微的错误。番石榴的动机是:同意。在我的例子中,该方法可能会发现null没有任何意义。但人们一直在谈论“方法不应该返回null”。我发现很难真正实现这样的思想如果序列中有多个元素,SingleOrDefault()实际上会引发异常: