1

假设我们有Book一个包含year_published公共字段的类。如果我想实现 NullObject 设计模式,我需要定义NullBook行为相同Book但不做任何事情的类。

NullBook问题是,分配字段时的行为应该是什么?

Book book = find_book(id_value);  //this method returns a NullBook instance because it cannot find the book
book.year_published = 2016;  //What should we do here?!
4

2 回答 2

1

您应该做的第一件事是将您的属性设为私有。

class NullBook {
    private year_published;
    // OR solution2 private year_published = null;

    public setYearPublished(year_published) {
        this.year_published = null;
        // OR solution2 do nothing!
    }
}

您还可以在父类中定义私有字段,因此孩子必须实现 setter 才能访问该字段

class Book {
  private year_published;

  public setYearPublished(year_published) {
     this.year_published = year_published;
  }
}

class NullBook extends Book {
    public setYearPublished(year_published) {
        parent::setYearPublished(null);
    }
}

为什么要使用 getter 和 setter? https://stackoverflow.com/a/1568230/2377164

于 2016-09-13T02:15:10.197 回答
1

事情是:模式是关于平衡的。是的,一般来说,不返回 null 而是让 else 返回是一种很好的做法;但是好吧:返回的内容应该仍然有意义!

在某种程度上,我看不出拥有“NullBook”对应用程序的设计有何帮助。特别是当您允许访问各种内部字段时。您准确地问了正确的问题:这样的“NullBook”的出版年份、作者或……应该是什么?!例如,当某些代码对来自不同“来源”的书籍进行“查找”时会发生什么;然后尝试按出版年份对这些书籍进行排序。您肯定不希望您的 NullBook 成为此类数据的一部分。

因此,我看不到拥有这个类的价值,相反:我认为它创造了“有趣”错误的可能性;因此我的回答是:退后一步,重新考虑你是否真的需要这门课。

除了空替换对象还有其他选择:也许您的语言允许 Optionals;或者,您修改那些可能返回 null ... 以返回书籍集合/数组的方法;并且有疑问:该列表/数组只是空的。

长话短说:允许其他类直接访问私有字段更像是一种导入设计的味道;所以你不应该太专注于 NullObjects,而另一方面却如此轻易地放弃了诸如信息隐藏之类的重要事情。

于 2016-09-13T04:02:03.397 回答