2011-05-17 84 views
0

我有一個關於最佳實踐的快速問題,如果getter和setter是特定情況下的最佳選項。這種情況是當我有'A'類實例化類'B'和'C'時。 A類包含B類和C類的公共getter和setter以訪問,所以數據是集中的。父類中的獲取者和設置者

這是最佳實踐還是最好通過參數傳遞數據到類B和C?

感謝

克里斯

回答

0

簡短的回答:它取決於:

長:如果你的B和C類封裝了可能在類A以外可能有用的數據和/或功能,並且A是B和C的「唯一」客戶端,那麼讓它們成爲可實例化,獨立於A,並使用像012這樣的setter來設置爲A.。這樣,其他類可以出於任何原因使用B和C.在運行時(例如通過像JohnReeeves所述的控制反轉框架所述),在具有增強功能的實例被引入類A時,您也可以利用繼承。

如果它們只在類A的上下文中有意義,則封裝只有A直接使用的功能,將它們從外部世界隱藏並通過類A方法/屬性進行參數化。這讓你可以自由地改變B和C的實現方式,這樣外面的代碼都不會生氣。 A是一個公共接口,B和C是內部實現。

而且通常情況下,您可以越好地隱藏自己的執行情況,讓外部世界只知道它需要知道才能正常工作的那麼少。

因此,想一想A,B和C的接觸目標,他們彼此之間以及與外界之間的關係,並且讓你決定。

0

是。這樣B和C類的範圍就減少了,只能通過A來訪問。

4

就我個人而言,我會推薦構建您的應用程序,以便通過類B和C所需的所有數據。這將消除他們對A類的依賴,從而減少耦合和複雜性;例如:

public class A { 
    private var b : B; 

    public function A() { 
     b = new B(); 
     b.someData = "some data that b requires"; 
    } 
} 

你可以然後進一步通過由被稱爲Inversion of Control一個工藝去除B類的從一類的實例化改善此。你讓B級A類的依賴這種方式

public class A { 
    private var b : B; 

    public function A(b : B) { 
     this.b = b; 
    } 
} 

這就允許外部客戶提前配置在B實例的時候讓你的項目結構更加靈活,後來改變:

public class Client { 
    public function Client() { 
     var b : B = new B(); 
     b.someData = "The Client is now Configuring B"; 

     var a : A = new A(b); 
    } 
}