应用程序设计,如何在不造成混乱的情况下调用远处 类 上的方法?

Application Design, How to call methods on far away classes without creating a mess?

我有一个图形示例,以便您理解我的意思:

大师Class想用classA、B、C,但是B在A里面,C在B里面。 所以我知道如何解决这个问题的两种方法是:

1.Class B 将有方法直接调用 Class C 方法,class A 将有方法调用 B 方法(包括 C 方法)作为图像:

2.On 解决方案二每个 class 都有一个 getter 什么会 return 他们使用的 class 所以另一个 class es可以直接调用他们的方法,我的意思是,如果MasterClass要在C上使用方法,它会从ClassA调用方法getClassB(),然后调用方法get ClassC():

可悲的是,我总是遇到这样的情况,所以我不知道这是设计时很常见的情况,还是我不知道如何设计。在最后一种情况下,如果您能推荐我 material 我将不胜感激,这样我就可以学习如何创建干净和模块化的程序,因为我的很多程序最终都有很多 classes 相互连接。

根据我的经验,我想简短的回答是,如果你的意思是 B 和 C 实际上是在 A 和 B 内部定义的(分别),那么不要在那里定义它们,而是 class es是“外”的,跟Master和A是同级的,然后Master可以直接调用。

让 classes 通过属性/getter 公开其他 classes 是可行的,如您所知,但不遵循所谓的 Demeter 法则,并且是一种除了其他问题之外,还有“嫉妒”。毕竟,你的 classes 不是封装它们的内容,而是暴露它们。

一般来说,一个 class 应该知道另一个 class 只是为了在内部对它做一些事情。因此,如果 Master 需要来自 C 的某些东西,这是通过两层嵌套定义的,那只是因为 B 上的某些方法将 C 的功能与 B 的某些功能汇总在一起,然后 A 上的某些方法从 B 中汇总了一些东西(因此 C ) 有它自己的东西...然后 Master 调用。

通常我会说,除非在特殊情况下,保持 classes 不嵌套是最容易管理的。

您应该问自己的第一个问题是,这些 class 是否是实现细节,或者,如果它们与 class 相关联,MasterClass 可以独立合法地与之交互:

  • 如果 BC 是实现细节,你不应该泄露它们。选项 1,转移呼叫,是选择的选项。这是由 principle of least knowledge 证明的。如果实施细节发生变化,您的转发方法可以将这些更改隐藏到 MasterClass.
  • 如果 BC 是 class 与 A 关联并且处于同一抽象级别,而且如果 MasterClass 可以合法地必须了解它们,那么选项 2,直接访问,似乎是一个合理的选择,因为 interface segregation principle。如果此 class 中任何一个的接口发生变化,影响将仅限于直接使用它的 classes 的实现。

因此没有统一的答案:您需要逐案分析这些 class 之间关系的性质。有帮助的是考虑接口更改的可接受后果。