空对象与空对象
- 作者: 丶温柔的女汉子
- 来源: 51数据库
- 2022-10-21
问题描述
[ 这是 最佳实践的结果:函数应该返回 null 还是一个空对象? 但我试图变得非常一般.]
[ This is a result of Best Practice: Should functions return null or an empty object? but I'm trying to be very general. ]
在我见过的很多遗留(嗯...生产)C++ 代码中,有一种趋势是编写很多的NULL(或类似的) 检查以测试指针.当添加 NULL 时,其中许多会在发布周期结束时添加 - 检查提供了对指针取消引用导致的崩溃的快速修复 - 并且没有太多时间进行调查.
In a lot of legacy (um...production) C++ code that I've seen, there is a tendency to write a lot of NULL (or similar) checks to test pointers. Many of these get added near the end of a release cycle when adding a NULL-check provides a quick fix to a crash caused by the pointer dereference--and there isn't a lot of time to investigate.
为了解决这个问题,我开始编写采用 (const) 引用参数的代码,而不是(更)更常见的传递指针的技术.没有指针,不想检查 NULL(忽略实际有空引用的极端情况).
To combat this, I started to write code that took a (const) reference parameter instead of the (much) more common technique of passing a pointer. No pointer, no desire to check for NULL (ignoring the corner case of actually having a null reference).
在 C# 中,存在相同的 C++问题":希望根据 null (ArgumentNullException) 检查每个未知引用并快速修复 NullReferenceExceptions 通过添加一个 null 检查.
In C#, the same C++ "problem" is present: the desire to check every unknown reference against null (ArgumentNullException) and to quickly fix NullReferenceExceptions by adding a null check.
在我看来,防止这种情况的一种方法是首先通过使用空对象 (String.Empty, EventArgs.Empty) 来避免空对象.另一种方法是抛出异常而不是返回 null.
It seems to me, one way to prevent this is to avoid null objects in the first place by using empty objects (String.Empty, EventArgs.Empty) instead. Another would be to throw an exception rather than return null.
我刚刚开始学习 F#,但在那个环境中,空对象似乎少得多.所以也许你真的不需要有很多 null 引用浮动?
I'm just starting to learn F#, but it appears there are far fewer null objects in that enviroment. So maybe you don't really have to have a lot of null references floating around?
我在这里吠错树了吗?
推荐答案
我倾向于怀疑包含大量 NULL 的代码,并尝试在可能的情况下使用异常、空集合、Java Optionals 等重构它们.
I tend to be dubious of code with lots of NULLs, and try to refactor them away where possible with exceptions, empty collections, Java Optionals, and so on.
引入空对象"Martin Fowler 的 重构(第 260 页)中的模式可能也很有帮助.空对象响应真实对象会使用的所有方法,但以做正确的事"的方式.因此,与其总是检查 Order 以查看 order.getDiscountPolicy() 是否为 NULL,不如确保 Order 在这些情况下具有 NullDiscountPolicy.这简化了控制逻辑.
The "Introduce Null Object" pattern in Martin Fowler's Refactoring (page 260) may also be helpful. A Null Object responds to all the methods a real object would, but in a way that "does the right thing". So rather than always check an Order to see if order.getDiscountPolicy() is NULL, make sure the Order has a NullDiscountPolicy in these cases. This streamlines the control logic.
- C#通过fleck实现wss协议的WebSocket多人Web实时聊天(附源码)
- 团队城市未满足要求:MSBuildTools12.0_x86_Path 存在
- 使用 MSBuild.exe 在发布模式下构建 C# 解决方案
- 当我发布 Web 应用程序时,AfterPublish 脚本不运行
- 构建时 T4 转换的产品仅在下一个构建中使用
- ASP.NET Core Application (.NET Framework) for Windows x64 only error in project.assets.json
- 新的 .csproj 格式 - 如何将整个目录指定为“链接文件"到子目录?
- 如何将条件编译符号(DefineConstants)传递给 msbuild
- MSBuild 支持 Visual Studio 2017 RTM 中的 T4 模板
- NuGet 包还原找不到包,没有源
