在对端的对象上调用方法'一个程序

时间:2014-11-23 13:48:09

标签: class oop object design-patterns

 我一直在培养创建大型面向对象程序(30多个课程)的技能。  在阅读一本名为“干净代码”的精彩书籍后,我试图让我的代码尽可能干净。  我遇到的一个问题是从“跨程序”调用对象上的方法

  说我有5节课。     `ClassA的     ClassB的     ClassC     D类     ClassE`

    ClassA的一个实例包含一个ClassB的实例,它又包含一个classC的实例,所以

    `ClassA> ClassB> ClassC`

    我不是说这是继承链,而是在classA的构造函数中创建了ClassB的实例,依此类推。

    现在,说ClassD> ClassE以类似的方式。 ClassD使用包含ClassE实例的实例变量进行实例化。

    这一切都很好,而且课程很小,只处理一项工作,而且看起来都很干净。

    但是,假设在程序中的某个时刻我需要classC的实例来调用ClassE实例上的方法。     这两个对象位于程序的“对面”可以这么说。然而,方法调用是必要的。

    我看到它有三个选项     

            
  1. 使classE的实例成为全局变量,以便classD AND classC可以访问它(以及程序中的任何其他内容)。我认为这是一种糟糕的形式,因为全局变量通常被视为坏消息
  2.         
  3. 在顶层创建ClassE实例,然后将其作为参数传递给ClassA,ClassB和ClassC的构造函数。这样做的问题在于,如果不止一次发生这种情况,我最终会得到很长的构造函数参数列表,并且将ojects传递给像这样的构造函数链似乎很多工作
  4.         
  5.             移动ClassE的对象以由ClassC实例化。问题在于它更强烈地与ClassD结合,只需要在ClassC的整个程序运行中调用一次。         
  6.     

    那么在这些情况下我该怎么做?我有什么资源可以读到这个。我知道我可以使用观察者模式来处理与此类似的情况,但是当它仅用于一个方法调用它似乎过度,因为我会在整个程序中使事物可观察到。我希望我的代码尽可能干净!

    提前致谢:)

2 个答案:

答案 0 :(得分:2)

三个字:Single Responsibility Principle。如果你担心你的类有太多的构造函数参数,可能是因为这个类需要处理太多不同的东西。如果你把课程集中在一起,它们就会很小。

您正确地指出了您所描述的第三种解决方案中的耦合问题。耦合问题也出现在第一个解决方案中(取决于全局变量,以后更难找到/诊断)。所以第二个选项似乎是最好的 - 只要你重构代码以保持你的类简单。

答案 1 :(得分:1)

你可以阅读得墨忒耳定律(维基百科上的简短说明:http://en.wikipedia.org/wiki/Law_of_Demeter或更长但写得很好的例子http://www.ccs.neu.edu/research/demeter/demeter-method/LawOfDemeter/paper-boy/demeter.pdf

  • 根据您的示例的上下文/内容,您可以例如:将D类构建为E类(或类似的Facade / adapter)的包装器。这意味着,如果您的类c有时需要与E实例通信,则通过它的D类实例进行操作。
  • 另一种方法是向需要的对象提供对类E实例的引用。
  • 如果所有对象都在与E的同一个实例进行通信,那么您也可以考虑单个模式,其中只有一个类的实例。但是这个实例或多或少是全球可用的。

提供更多背景信息,我们可以进一步发展。

编辑:顺便说一句。德米特小伙子的有趣解释可以在这里找到: http://www.daedtech.com/visualization-mnemonics-for-software-principles


编辑Nr.2(您的评论):ad。 1.)也许你可以通过一种方式来实现你的D类,这种方式可以减轻你直接与E对象交谈的其他类。相反,他们要求他们的D实例做某事(不知道D将调用委托给E)。根据您的尝试,这可能是您的选择。
广告Singleton。)是和否.Singleton的主要用途是保证(如果正确实现)只存在单个对象的一个​​实例。如果您正在谈论配置设置,这可能不是必需的。但你是对的,基本上这个东西是一个全局变量,具有所有它的缺点。您的对象D听起来好像它是不可变的,因为它在程序运行时不会改变它的状态所以问题可能不是你创建一个复杂的动态行为而是你创造了太多依赖。
只是另一个链接/原则让你思考: What is Inversion of Control?