我有一個關於最佳實踐的快速問題,如果getter和setter是特定情況下的最佳選項。這種情況是當我有'A'類實例化類'B'和'C'時。 A類包含B類和C類的公共getter和setter以訪問,所以數據是集中的。父類中的獲取者和設置者
這是最佳實踐還是最好通過參數傳遞數據到類B和C?
感謝
克里斯
我有一個關於最佳實踐的快速問題,如果getter和setter是特定情況下的最佳選項。這種情況是當我有'A'類實例化類'B'和'C'時。 A類包含B類和C類的公共getter和setter以訪問,所以數據是集中的。父類中的獲取者和設置者
這是最佳實踐還是最好通過參數傳遞數據到類B和C?
感謝
克里斯
簡短的回答:它取決於:
長:如果你的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的接觸目標,他們彼此之間以及與外界之間的關係,並且讓你決定。
是。這樣B和C類的範圍就減少了,只能通過A來訪問。
就我個人而言,我會推薦構建您的應用程序,以便通過類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);
}
}