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

Java 应用程序设计,如何在不造成混乱的情况下在遥远的类上调用方法?,java,class,oop,uml,software-design,Java,Class,Oop,Uml,Software Design,我有一个图形示例,让您理解我的意思: MasterClass希望使用类A、B和C,但B在A中,C在B中。 所以我知道如何解决这个问题的两种方法是: 1.类B将有直接调用类C方法的方法,类A将有调用B方法(包括C方法)的方法作为映像: 2.在解决方案2中,每个类都有一个getter,它将返回它们使用的类,以便其他类可以直接调用它们的方法,我的意思是,如果MasterClass想要在C上使用方法,它将从类a调用方法getClassB(),然后调用方法getClassC(): 可悲的是,我总是在这

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

MasterClass希望使用类A、B和C,但B在A中,C在B中。 所以我知道如何解决这个问题的两种方法是:

1.类B将有直接调用类C方法的方法,类A将有调用B方法(包括C方法)的方法作为映像:

2.在解决方案2中,每个类都有一个getter,它将返回它们使用的类,以便其他类可以直接调用它们的方法,我的意思是,如果MasterClass想要在C上使用方法,它将从类a调用方法getClassB(),然后调用方法getClassC():


可悲的是,我总是在这样的情况下结束,所以我不知道设计时这是一个非常普遍的情况,还是我不知道如何设计。在最后一种情况下,如果您能向我推荐一些资料,我将不胜感激,这样我就可以学习如何创建干净的模块化程序,因为我的很多程序最终都会有很多类相互连接。

根据我的经验,我想简单的答案是,如果您的意思是B和C实际上是在a和B(分别)中定义的,然后不要在那里定义它们,而是将它们定义为与Master和A处于同一级别的“外部”类。然后Master可以直接调用它们

正如您所知,让类通过属性/getter公开其他类是可行的,但这并不符合所谓的Demeter定律,这也是一种“特性嫉妒”,以及其他担忧。毕竟,您的类不是封装它们的内容,而是公开它们

通常,一个类应该只知道另一个类,以便在内部处理它。所以,如果Master需要C中的某些东西,这是通过两个嵌套级别定义的,这只是因为B中的某个方法将C的能力与B中的某些结合起来,然后A中的某个方法将B中的某些东西(因此也是C)与它自己的东西结合起来。。。然后那个主人打电话来


作为一项规则,我想说,除非在特殊情况下,否则保持类不嵌套是最容易管理的。

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

  • 如果
    B
    C
    是实现细节,则不应泄露它们。选项1,转发呼叫,是要选择的选项。这是有道理的。如果实现详细信息发生更改,您的转发方法可能会将这些更改隐藏到
    MasterClass
  • 如果
    B
    C
    是与
    A
    相关的类,并且处于相同的抽象级别,而且如果
    MasterClass
    可以合法地了解它们,那么选项2,直接访问,似乎是一个合理的选择,因为。如果这个类中的任何一个的接口会发生变化,那么影响将局限于直接使用它的类的实现

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

问题太广泛;没有正确的答案。根据上下文,答案有很多种。在阅读了这两个答案后,我意识到即使我知道OOP,我仍然需要关于如何设计它的知识,感谢您提到这些规则和良好实践,也许我最好的选择是读一本书,研究一下面向对象设计。我将开始寻找教授面向对象设计的书,我意识到我对它了解不多。