2010-05-25 67 views
5

我有一些代码,看起来像:在这种情况下,我如何纠正功能嫉妒?

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()的结果,并保留我自己对这些对象的引用吗?

+0

谢谢!所有这些问题的答案都是有帮助的,所以我upvoted他们 – RMorrisey 2010-05-26 00:43:01

回答

5

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

“事实”是指客户应该拥有(或想拥有)其他东西的时候。这意味着其他事物的功能在错误的地方,或者请求功能在错误的地方。不幸的是,没有更全面的代码很难给出具体的例子。

然而,当你最终意识到什么是“问题”时,解决方案可能不是那么容易实现。这是一个无赖,但保持良好的斗争,并重新对这个解决方案无论如何!

+1

我意识到,在我的情况,孩子(我的UI组件的数据源)没有必须拥有或由他的父母组件管理,和他停下仅属于父时我开始在Client中使用他(另一个UI组件并行工作)。我把Child的建设拉到了一个拥有Parent和Client的更高阶层,并且把它交给了两者。 – RMorrisey 2010-05-26 00:46:17

3

谁在访问Client?你是否需要保持其parent私有,或者你应该公开这样的调用代码可以导航到所需功能的位置?

如果您担心完全暴露parent,另一种选择是从Parent中提取界面,并从Client中暴露该界面。

相关问题