空对象设计模式问题

5
我最近观看了这个关于空对象设计模式的youtube教程。尽管其中存在一些错误,比如什么也不做的NullCar会创建一个无限循环,但是概念解释得很好。我的问题是,当可以为空的对象具有getter并在您的代码中使用时,您该怎么办?如何确定默认返回哪个值?或者我应该在所有对象中实现此模式吗?如果我需要返回字符串或原始数据类型怎么办?我从Java的角度来谈论。 编辑:我不是在用默认值测试来交换空对象测试吗?如果不是,为什么不是?
5个回答

8
Null对象的目的是避免在代码中出现空引用。Null Object获取器返回的值取决于你的域。零或空字符串通常是合适的。
如果我们把Null对象模式转化到现实生活中,你所问的类似于问“没有人有多大年纪?”。
也许你的设计可以改进,因为你似乎没有遵循告诉,不要问原则。
编辑:Null Object设计模式通常用于一个对象将行为委托给另一个对象(如策略或状态设计模式);正如Tom Hawtin - tackline所评论的那样,对于返回值的对象,请使用特殊情况对象

我认为更准确的评论是,Null对象模式的上下文最好与“告诉,不要问”类型相匹配。对于返回值类型,您更有可能会走向特殊情况对象。也许。 - Tom Hawtin - tackline
2
哇,一个禅宗道教作为编程提示... :-) - PhiLho

4
据我理解,空对象的值应尽可能接近于“无”。不幸的是,这意味着您必须自己定义它。例如,我个人在无法传递空字符串时使用“”,对于我来说,null对象数字为-1(主要是因为默认情况下大多数数据库序列从1开始,我们经常使用这些项目ID,因此-1是一个明显的提示它是一个null对象),对于列表/映射/集合,它是Collections.EMPTY_SETEMPTY_MAPEMPTY_LIST等等。如果我有一个自定义类需要创建空对象,我会将其所有实际数据删除,然后观察结果并应用上述方法,直到它变为空对象。
所以,您真的不知道默认返回哪个值,只能自己决定。

3
当可以为 null 的对象具有 getter 并在您的代码中使用时,您应该怎么做?如何知道默认返回哪个值?
您如何知道要实现哪些类?这是一个设计问题,取决于应用程序。
一般来说,NullObject 模式的目的是支持使用多态替换条件语句重构,在编程语言的空值比较的特殊情况下运作。
视频中示例的正确实现需要将 driveCar 方法委托给 Car 类。SlowCar 和 FastCar 类将通过基类中的共享实现执行循环,并且 NullCar 将立即返回。
在Java环境中,NullCar.speed属性可能是一个未装箱的int。因此,将其设置为null不是一种选择。我可能会将该属性隐藏在访问器后面,并使NullCar.getSpeed引发异常。任何需要测试以避免此异常的客户端代码都将转移到汽车类中。
将直接依赖于速度值可用的所有操作委托给应用告诉,不要问面向对象设计原则,由philippe提到。

0

应该返回你正在获取的类的 null 对象。例如,如果你有一个类 A,它有一个 getter 返回一个类 B 的对象,那么相应的 NullA 的 getter 应该返回 NullB


0

在代码中,Null设计模式的集成点应该是什么?我认为DAO对象是这种设计模式的第一级客户端,因为它们在数据库中查找实体并简单地返回它。

这些对象的可空性检查会污染服务层或命令层中实际访问和使用它们的代码。

请发表评论。


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