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组件)。我把孩子的结构提升到一个更高的阶层,既拥有父母又拥有客户,并把它传给了父母和客户。