【问题标题】:Null object design pattern question空对象设计模式问题
【发布时间】:2008-11-25 19:56:45
【问题描述】:

我最近看了this youtube tutorial 的空对象设计模式。尽管其中有一些错误:例如不做任何事情的 NullCar 创建了一个无限循环,但这个概念得到了很好的解释。我的问题是,当可以为 null 的对象具有 getter 并在您的代码中使用时,您会怎么做?你怎么知道默认返回哪个值?或者我应该在所有对象中实现这个模式?如果我需要返回字符串或原语怎么办?我是从 Java 的角度说的。

编辑:我不会将空对象测试换成默认值测试吗?如果没有,为什么不呢?

【问题讨论】:

    标签: java design-patterns null-object-pattern


    【解决方案1】:

    Null 对象的目标是避免在代码中出现 Null 引用。 Null Object getter 返回的值取决于您的域。零或空字符串通常是合适的。

    如果我们将 Null Object 模式转换到现实生活中,您所问的问题类似于问“没人有多大年龄?”。

    也许您的设计可以改进,因为您似乎没有遵循tell, don't ask 原则。

    编辑:Null Object design pattern 通常在对象将行为委托给另一个对象时使用(例如在策略或状态设计模式中);正如 Tom Hawtin - tackline 评论的那样,将 Special Case Objects 用于返回值的对象。

    【讨论】:

    • 我认为更准确的说法是空对象模式的上下文更适合“告诉,不要问”类型。对于返回值类型,您更有可能选择特殊情况对象。可能。
    • 哇,一个禅道作为编程提示... :-)
    【解决方案2】:

    据我了解,这个想法是空对象的值尽可能接近“无”。不幸的是,这意味着您必须自己定义它。举个例子,当我不能传递一个空字符串时,我个人使用“”,我的空对象编号是-1(主要是因为默认情况下大多数数据库序列从 1 开始,我们将这些序列用于项目 id:s 很多所以 -1是死赠品,它是一个空对象),列表/地图/集合是Collections.EMPTY_SETEMPTY_MAPEMPTY_LIST等等。如果我有自定义类,我必须从中创建一个空对象,我会从中删除所有实际数据,看看它会将我带到哪里,然后应用我刚才提到的内容,直到它“空”。

    所以你真的不“知道”默认返回哪个值,你只需要自己决定。

    【讨论】:

      【解决方案3】:

      当可以为 null 的对象具有 getter 并在您的代码中使用时,您会怎么做?你怎么知道默认返回哪个值?

      您如何知道要实现哪些类?这是一个设计问题,取决于应用程序。

      一般来说,NullObject 模式的目的是在条件是与编程语言的空值进行比较的特殊情况下支持Replace Conditional with Polymorphism 重构。

      视频中示例的正确实现需要将driveCar 方法委托给Car 类。 SlowCarFastCar 类将执行循环,大概是通过基类中的共享实现,而 NullCar 将立即返回。

      在 Java 上下文中,NullCar.speed 属性可能是未装箱的 int。因此,将其设置为 null 不是一种选择。我可能会将属性隐藏在访问器后面,并让NullCar.getSpeed 引发异常。任何需要测试以避免此异常的客户端代码都将移入汽车类。

      委派所有直接依赖于可用速度值的操作是philippe 提到的面向对象设计的Tell Don't Ask 原则的应用

      【讨论】:

        【解决方案4】:

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

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

        请发表评论。

        【讨论】:

          【解决方案5】:

          它应该为你得到的类返回空对象。例如,如果您有一个类 A 的 getter 会返回类 B 的对象,那么对应的 NullA 的 getter 应该返回 NullB

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2015-11-20
            • 1970-01-01
            • 1970-01-01
            • 2011-04-03
            • 1970-01-01
            • 2011-06-30
            相关资源
            最近更新 更多