【发布时间】:2015-11-01 08:50:09
【问题描述】:
这可能是一件非常简单的事情,但我似乎无法自己解决这个问题。使用组合时,访问“内部对象”方法的最佳方式是什么?我可以解决的每一种方法似乎都违反了一些 OO 原则或其他。
这是一个非常广泛的话题,但我会举一个例子来说明清楚。代码是用 java 编写的,但我相信这个问题几乎适用于任何使用 OOP 的语言。
Class Shelf {
private Book book;
}
Class Book {
public void turnPage() {
//do stuff
}
}
当您只能访问 Shelf 对象时,访问 Book 方法的最佳方式是什么?我读过的一些地方建议在 Shelf 中使用包装器方法,因为它遵循得墨忒耳法则。但是,这似乎并不是每种情况的最佳选择。
首先,许多内部对象的方法可能与主类无关,因此让主类为每个方法实现包装器没有任何意义,而且很可能会破坏单一责任原则。此外,如果内部对象用于大量其他类中的组合,都需要做同样的事情,则会导致大量不必要的代码重复,从而使您的代码变得不那么 DRY。
我的第一个直觉是有一个简单的 getBook() 方法,可以访问书籍以直接操作这些方法。将书从书架上拿下来并翻页更有意义,而不是让书架为你翻书。然而,这似乎打破了封装和得墨忒耳法则。如果我将 book 变量设为 public final,这同样适用。
我错过了什么吗?还是把事情复杂化了?我似乎无法理解这一点,所以我非常感谢一些帮助。
【问题讨论】:
标签: oop composition