- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
似乎有越来越多的人说您永远不应该返回 null,而应该始终使用 Null 对象模式。在使用集合/映射/数组或调用诸如 isAuthenticated()、which is shown here 等 boolean 函数时,我可以看到 NOP 的用处。 .
我在这方面没有找到任何令人信服的东西。在我尝试整理我的想法时,请耐心等待。
我的理解是,您不是返回一个空对象,而是返回一个已“归零”的有效对象。
例如,客户端会调用来获取一个对象:
Car car = getCar();
如果不使用 NOP,您需要在调用任何方法之前检查从 getCar() 返回的对象是否为 null:
if (car != null){
color = car.getColor();
doScreenStuff(color);
}
使用 NOP,而不是 getCar()
返回 null,它现在返回一个已有效“归零”的 Object。所以现在我们不再需要执行 if (car != null)
并且可以只请求颜色。所以,我想当我们调用颜色时,我们的“归零”对象会返回“无”。
这有什么帮助?似乎向前移动并在空对象上调用方法会导致与检查 null 一样多的痛苦。现在,当需要显示信息时,我们需要检查颜色是否为“无”,高度是否为 0,或者您拥有的任何其他值。所以本质上,不是在处理开始时检查汽车是否为空,而是在之后检查我们拥有的汽车对象是真车还是替代品。 IE。我们不想显示一堆空对象,所以我们需要一些方法来过滤掉我们所有的空对象。
这个过滤是一个额外的步骤,就像调用 if (car != null) 一样。唯一的区别是,通过检查 null,我们可以通过抛出异常来在发现汽车对象为 null 时立即停止处理,而使用 NOP,我们调用空对象上的方法并继续运行,直到时间到了显示对象,此时我们过滤掉空对象。此外,您需要知道空对象返回的值。 IE。 getColor() 是否返回“none”或“empty”。
显然我忽略了某些东西。提前致谢。
最佳答案
MattPutnam 的回答是正确的,我支持它。我要补充一点:“空对象”的概念,当您分析它时,似乎可以归结为 monoid 的数学概念。 .你可以这样想:一个幺半群是一种同时具有这两个东西的类型:
a.op(b).op(c)
与 a.op(b.op(c))
相同.空对象模式的经典示例是返回一个空列表或数组而不是 null。嗯,列表是一个幺半群,追加作为操作,空列表作为中性元素。
现在,您在 Car
中遇到的问题例如 Car
不是真正的幺半群;没有“空车”或“空车”的概念,也没有真正明智的操作可以用来组合两个 Car
合而为一。
因此,您得到的正确建议是使用 Java 8 Optional
之类的东西。 .诀窍是无论是什么类型T
是,Optional<T>
是一个幺半群:
empty
,则选择第一个值,否则选择第二个值”:
x || empty = x
empty || x = x
Optional.empty()
, 因为 Optional.empty().orElse(anything)
与 anything
相同.所以基本上,Optional<T>
是一个将空对象添加到像 Car
这样的类型的包装器。没有一个。 Optional<T>.orElse(T value)
方法是“选择第一个非 empty
值”幺半群的略微重构版本。
关于java - 空对象模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30717957/
我的一位教授给了我们一些考试练习题,其中一个问题类似于下面(伪代码): a.setColor(blue); b.setColor(red); a = b; b.setColor(purple); b
我似乎经常使用这个测试 if( object && object !== "null" && object !== "undefined" ){ doSomething(); } 在对象上,我
C# Object/object 是值类型还是引用类型? 我检查过它们可以保留引用,但是这个引用不能用于更改对象。 using System; class MyClass { public s
我在通过 AJAX 发送 json 时遇到问题。 var data = [{"name": "Will", "surname": "Smith", "age": "40"},{"name": "Wil
当我尝试访问我的 View 中的对象 {{result}} 时(我从 Express js 服务器发送该对象),它只显示 [object][object]有谁知道如何获取 JSON 格式的值吗? 这是
我有不同类型的数据(可能是字符串、整数......)。这是一个简单的例子: public static void main(String[] args) { before("one"); }
嗨,我是 json 和 javascript 的新手。 我在这个网站找到了使用json数据作为表格的方法。 我很好奇为什么当我尝试使用 json 数据作为表时,我得到 [Object,Object]
已关闭。此问题需要 debugging details 。目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and the
我听别人说 null == object 比 object == null check 例如: void m1(Object obj ) { if(null == obj) // Is thi
Match 对象 提供了对正则表达式匹配的只读属性的访问。 说明 Match 对象只能通过 RegExp 对象的 Execute 方法来创建,该方法实际上返回了 Match 对象的集合。所有的
Class 对象 使用 Class 语句创建的对象。提供了对类的各种事件的访问。 说明 不允许显式地将一个变量声明为 Class 类型。在 VBScript 的上下文中,“类对象”一词指的是用
Folder 对象 提供对文件夹所有属性的访问。 说明 以下代码举例说明如何获得 Folder 对象并查看它的属性: Function ShowDateCreated(f
File 对象 提供对文件的所有属性的访问。 说明 以下代码举例说明如何获得一个 File 对象并查看它的属性: Function ShowDateCreated(fil
Drive 对象 提供对磁盘驱动器或网络共享的属性的访问。 说明 以下代码举例说明如何使用 Drive 对象访问驱动器的属性: Function ShowFreeSpac
FileSystemObject 对象 提供对计算机文件系统的访问。 说明 以下代码举例说明如何使用 FileSystemObject 对象返回一个 TextStream 对象,此对象可以被读
我是 javascript OOP 的新手,我认为这是一个相对基本的问题,但我无法通过搜索网络找到任何帮助。我是否遗漏了什么,或者我只是以错误的方式解决了这个问题? 这是我的示例代码: functio
我可以很容易地创造出很多不同的对象。例如像这样: var myObject = { myFunction: function () { return ""; } };
function Person(fname, lname) { this.fname = fname, this.lname = lname, this.getName = function()
任何人都可以向我解释为什么下面的代码给出 (object, Object) 吗? (console.log(dope) 给出了它应该的内容,但在 JSON.stringify 和 JSON.parse
我正在尝试完成散点图 exercise来自免费代码营。然而,我现在只自己学习了 d3 几个小时,在遵循 lynda.com 的教程后,我一直在尝试确定如何在工具提示中显示特定数据。 This code
我是一名优秀的程序员,十分优秀!