我一直在培养创建大型面向对象程序(30多个课程)的技能。 在阅读一本名为“干净代码”的精彩书籍后,我试图让我的代码尽可能干净。 我遇到的一个问题是从“跨程序”调用对象上的方法
说我有5节课。 `ClassA的 ClassB的 ClassC D类 ClassE`
ClassA的一个实例包含一个ClassB的实例,它又包含一个classC的实例,所以
`ClassA> ClassB> ClassC`
我不是说这是继承链,而是在classA的构造函数中创建了ClassB的实例,依此类推。
现在,说ClassD> ClassE以类似的方式。 ClassD使用包含ClassE实例的实例变量进行实例化。
这一切都很好,而且课程很小,只处理一项工作,而且看起来都很干净。
但是,假设在程序中的某个时刻我需要classC的实例来调用ClassE实例上的方法。 这两个对象位于程序的“对面”可以这么说。然而,方法调用是必要的。
我看到它有三个选项
那么在这些情况下我该怎么做?我有什么资源可以读到这个。我知道我可以使用观察者模式来处理与此类似的情况,但是当它仅用于一个方法调用它似乎过度,因为我会在整个程序中使事物可观察到。我希望我的代码尽可能干净!
提前致谢:)
答案 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)
提供更多背景信息,我们可以进一步发展。
编辑:顺便说一句。德米特小伙子的有趣解释可以在这里找到: 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?