Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在这种情况下,如何纠正功能嫉妒?_Java_Oop_Refactoring - Fatal编程技术网

Java 在这种情况下,如何纠正功能嫉妒?

Java 在这种情况下,如何纠正功能嫉妒?,java,oop,refactoring,Java,Oop,Refactoring,我有一些代码看起来像: class Parent { private Intermediate intermediateContainer; public Intermediate getIntermediate(); } class Intermediate { private Child child; public Child getChild() {...} public void intermediateOp(); } class Child { public void

我有一些代码看起来像:

class Parent {
 private Intermediate intermediateContainer;
 public Intermediate getIntermediate();
}

class Intermediate {
 private Child child;
 public Child getChild() {...}
 public void intermediateOp();
}

class Child {
 public void something();
 public void somethingElse();
}

class Client {
 private Parent parent;

 public void something() {
  parent.getIntermediate().getChild().something();
 }

 public void somethingElse() {
  parent.getIntermediate().getChild().somethingElse();
 }

 public void intermediate() {
  parent.getIntermediate().intermediateOp();
 }
}
我知道这是“功能嫉妒”代码气味的一个例子。问题是,最好的解决方法是什么?我的第一反应是对父母采取以下三种方法:

parent.something();
parent.somethingElse();
parent.intermediateOp();
…但我觉得这样做会重复代码,并且会使父类的API变得混乱(父类已经很忙了)


我是否要存储getIntermediate()和/或getChild()的结果,并保留我自己对这些对象的引用?

根据我的经验,按照您的建议执行(使所有方法只调用“下一级”)将有助于说明您应该对API所做的更改。因此,是的,尽管API很混乱,但还是要进行这些更改,您可能会发现处理这些问题的适当方法

“事实”是某个东西在它应该(或想要)拥有其他东西的时候拥有了一个客户机。这意味着要么其他事物的功能在错误的位置,要么请求该功能的事物在错误的位置。不幸的是,如果没有更全面的代码,很难给出具体的例子


然而,当您最终意识到“问题”是什么时,解决方案可能并不那么容易实现。这是一个令人沮丧的问题,但无论如何,要继续努力,朝着这个解决方案进行重构

这不完全是功能嫉妒,而是这些类之间的高度耦合问题,明确违反了德米特定律。不过,您第一次想到将这些方法直接放在父对象上是一个好主意。客户端不需要像那样通过堆栈调用


如果你担心家长太忙,可能你有太多的功能在那里,它应该分为一些较小的类。类应该是单一用途的。

谁在访问
客户端?您是否需要将其
父项
保持私有,还是应该公开它,以便调用代码可以导航到所需功能所在的位置


如果您担心将
父级
完全公开,另一个选择是从
父级
提取接口,然后从
客户端
公开接口,谢谢!所有这些答案都很有帮助,所以我对他们进行了投票,我意识到在我的例子中,Child(我UI组件的数据源)不必由他的父组件拥有或管理,当我开始在客户端中使用他时,他不再只属于父组件(另一个并行工作的UI组件)。我把孩子的结构提升到一个更高的阶层,既拥有父母又拥有客户,并把它传给了父母和客户。