2010-05-25 82 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中暴露該界面。