NullObject 模式:如何处理字段?
NullObject Pattern: How to handle fields?
假设我们有 Book
class 其中包含 year_published
public 字段。如果我想实现 NullObject 设计模式,我将需要定义 NullBook
class 其行为与 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?!
您应该做的第一件事是将您的属性设为私有。
class NullBook {
private year_published;
// OR solution2 private year_published = null;
public setYearPublished(year_published) {
this.year_published = null;
// OR solution2 do nothing!
}
}
您还可以在父级 class 中定义私有字段,因此子级必须实现 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 和 setters?
事实是:模式是关于平衡的。是的,通常好的做法是不要 return null,但要 return;但是好吧:returned 应该仍然有意义!
并且在某种程度上,我看不出 "NullBook" 对您的应用程序设计有多大帮助。特别是当您允许访问各种内部字段时。您问的问题完全正确:出版年份、作者或……这样的 "NullBook" 应该是什么?!
例如,当一段代码对来自不同 "sources" 的书执行 "lookup" 时会发生什么;然后尝试按出版年份对这些书进行排序。您肯定不希望您的 NullBook 成为此类数据的一部分。
因此,我看不到拥有这个 class 的价值,相反:我认为它可能会产生 "interesting" 错误;因此我的回答是:退后一步,重新考虑你是否真的需要 class。
有空替换对象的替代方法:也许您的语言允许 Optionals;或者,您将那些可能 return null ... 的方法修改为 return a collection/array 本书;并且有疑问:list/array 只是空的。
长话短说:允许其他 classes 直接访问私有字段更重要的是 design smell;所以你不应该太专注于空对象,而另一方面却很容易放弃 信息隐藏 等重要的东西。
假设我们有 Book
class 其中包含 year_published
public 字段。如果我想实现 NullObject 设计模式,我将需要定义 NullBook
class 其行为与 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?!
您应该做的第一件事是将您的属性设为私有。
class NullBook {
private year_published;
// OR solution2 private year_published = null;
public setYearPublished(year_published) {
this.year_published = null;
// OR solution2 do nothing!
}
}
您还可以在父级 class 中定义私有字段,因此子级必须实现 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 和 setters?
事实是:模式是关于平衡的。是的,通常好的做法是不要 return null,但要 return;但是好吧:returned 应该仍然有意义!
并且在某种程度上,我看不出 "NullBook" 对您的应用程序设计有多大帮助。特别是当您允许访问各种内部字段时。您问的问题完全正确:出版年份、作者或……这样的 "NullBook" 应该是什么?! 例如,当一段代码对来自不同 "sources" 的书执行 "lookup" 时会发生什么;然后尝试按出版年份对这些书进行排序。您肯定不希望您的 NullBook 成为此类数据的一部分。
因此,我看不到拥有这个 class 的价值,相反:我认为它可能会产生 "interesting" 错误;因此我的回答是:退后一步,重新考虑你是否真的需要 class。
有空替换对象的替代方法:也许您的语言允许 Optionals;或者,您将那些可能 return null ... 的方法修改为 return a collection/array 本书;并且有疑问:list/array 只是空的。
长话短说:允许其他 classes 直接访问私有字段更重要的是 design smell;所以你不应该太专注于空对象,而另一方面却很容易放弃 信息隐藏 等重要的东西。