null对象与空对象

Ðаn*_*Ðаn 13 c# c++ null

[这是最佳实践的结果:函数应该返回null还是空对象?但我想要非常一般.]

在很多传统的(嗯...生产)C++代码,我所看到的,有写的倾向大量NULL(或类似)的检查,以测试指针.在添加NULL时,许多这些都会在发布周期结束时添加 - 检查可以快速解决由指针取消引用导致的崩溃问题 - 而且没有太多时间进行调查.

为了解决这个问题,我开始编写带有(const)引用参数的代码,而不是传递指针的(更多)常见技术.没有指针,没有检查NULL的愿望(忽略实际具有空引用的角落情况).

在C#中,存在相同的C++"问题":希望检查针对null(ArgumentNullException)的每个未知引用并NullReferenceException通过添加null检查来快速修复s .

在我看来,防止这种情况的一种方法是首先使用空对象(String.Empty,EventArgs.Empty)来避免空对象.另一个是抛出异常而不是返回null.

我刚刚开始学习F#,但看起来在那个环境中有更少的空对象.那么也许你真的不需要有很多null参考文献?

我在这里吠叫错了吗?

Rex*_*x M 26

传递非null只是为了避免NullReferenceException正在交易一个直接的,易于解决的问题("它会因为它为空而爆炸"),这是一个更加微妙,难以调试的问题("几个调用堆栈的东西"不是表现得像预期的那样,因为早些时候它得到了一些没有有意义的信息但不是空的对象").

NullReferenceException是一件很棒的事情!它失败,大声,快速,几乎总是快速,容易地识别和修复.这是我最喜欢的例外,因为我知道当我看到它时,我的任务只需要大约2分钟.将此与令人困惑的质量保证或客户报告进行对比,试图描述必须复制并追溯到原点的奇怪行为.呸.

这一切都归结为你作为一种方法或一段代码,可以合理地推断出调用你的代码.如果你被提交了一个空引用,并且你可以合理地推断出调用者的意思可能是null(例如,可能是一个空集合?)那么你绝对应该只处理空值.但是,如果您无法合理地推断如何处理null,或者调用者的意思是null(例如,调用代码告诉您打开文件并将该位置赋值为null),则应抛出ArgumentNullException .

在每个"网关"点维护这样的正确编码实践 - 代码中功能的逻辑界限 - NullReferenceExceptions应该更加罕见.

  • 为修复可能的错误而更改默认对象的"null"永远不会好.然而,更常见的是,返回"null"具有含义,但"null"本身不能表达这种含义.当您需要意义时,使用空对象或默认对象是一个很好的解决方案.硬错误很好,但是是错误的,应该这样考虑.围绕`null`进行编码不是错误,这意味着你的设计是错误的(或至少:可以改进),因为`null`显然只是变得有意义. (5认同)
  • 我会为你查找参考文献,但有600个字符我必须简短.Imo,"null"的意思是没有数据,这本身就是一个意义.但是,在代码中,尤其是 对于青少年,你会发现`null`的意思是"访客用户"或"null"的意思是"localhost",这是经过测试的,如果到处都是.这就是我所说的"意义",这就是"null"不应该代表的东西.`null`是"无数据","错误","无实例".这是一个含义,但却是另一个含义.请注意,这与Win32 API或C++中的NULL不同,它通常具有明确的含义,很多是许多人的烦恼. (2认同)

Jim*_*ans 7

我倾向于怀疑具有大量NULL的代码,并尝试在可能的情况下将它们重构为异常,空集合等等.

Martin Fowler的重构(第260页)中的"引入空对象"模式也可能有所帮助.Null对象响应真实对象的所有方法,但是以"做正确的事"的方式.因此,不要总是检查Order以查看order.getDiscountPolicy()是否为NULL,请确保Order在这些情况下具有NullDiscountPolicy.这简化了控制逻辑.


Chr*_*ris 5

Null 得到我的投票。再说一次,我是“快速失败”的心态。

String.IsNullOrEmpty(...)也很有帮助,我想它可以捕获任何一种情况:空字符串或空字符串。你可以为你传递的所有类编写一个类似的函数。

  • 你必须用 C++ 编程才能享受引用,我想你肯定会改变主意。 (2认同)