空对象 vs 空值对象

17

[这是一个最佳实践:函数应该返回null还是一个空对象的结果?,但我试图非常通用。]

在我看过的许多传统(嗯...生产)C ++代码中,有一种倾向于编写很多NULL(或类似的)检查来测试指针。其中许多是在发布周期的最后阶段添加的,当添加NULL 检查提供了快速修复由指针解引用引起的崩溃时--并且没有足够的时间进行调查。

为了解决这个问题,我开始编写使用(const) 引用参数而不是更常见的传递指针的技术的代码。没有指针,也就没有必要检查NULL(忽略实际上有一个空引用的极端情况)。

在 C# 中,同样存在与 C++ 相同的“问题”:希望检查每个未知引用是否为nullArgumentNullException),并通过添加null检查来快速修复NullReferenceException

对我来说,避免这种情况的一种方法是使用空对象(String.Empty, EventArgs.Empty)。另一种方法是抛出异常而不是返回null

我刚开始学习 F#,但似乎在那个环境中很少有null对象。所以也许你真的没有许多null引用浮动?

我在这里走错方向了吗?


2
你一直在看糟糕的 C++ 代码。C++ 程序应该使用异常来避免无效对象,引用来避免指针等。任何接受指针而非 const 引用(或按值传递)的代码都是糟糕的代码。 - GManNickG
2
F#中的空对象较少,因为它倾向于使用选项。请参见http://srtsolutions.com/blogs/chrismarinos/archive/2009/09/10/option-types-vs-nullable-types.aspx进行比较。 - Tony Lee
2
Toney Hoare称空引用为他的十亿美元错误:http://www.infoq.com/presentations/Null-References-The-Billion-Dollar-Mistake-Tony-Hoare - Tony Lee
3
10年前的C++程序员没有开发出好的C++程序。 老旧不等于好。 - GManNickG
6
我根本不同意在C++中使用异常会使它更好的观点。指针与引用、异常与返回值都是重要的东西,但并不是好代码或坏代码的指标。重要的是结构、一致性和良好的惯例。使用某种语言特性与否只是方便之处。说10年前的C++代码因为这个原因就不能是好代码,不仅幼稚无知,而且是一种侮辱。 - Chris Walton
显示剩余2条评论
11个回答

0

你不能总是返回一个空对象,因为“空”并不总是被定义。例如,对于int、float或bool类型的变量来说,“空”意味着什么?

返回一个NULL指针并不一定是一种不好的做法,但我认为更好的做法是返回一个(const)引用(当然,在适当的情况下)。

最近,我经常使用一个Fallible类:

Fallible<std::string> theName = obj.getName();
if (theName)
{
    // ...
}

有多种可用于这样的类的实现(请查看Google Code Search),我也创建了自己的


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接