(157)Hide_Delegate
隱藏 【委託關係】
classDiagram
Person <.. ClientClass
Department <..ClientClass
class ClientClass{
// somthing
}
class Person{
getDepartment()
}
class Department{
getManager()
}
轉換成
classDiagram
Person <.. ClientClass
Department <..Person
class ClientClass{
// somthing
}
class Person{
getDepartment()
}
class Department{
// somthing
}
動機
【封裝】意味著每個物件都應該盡可能少了解系統的其他部分。如此一來,一旦發生變化,需要了解變化的物件就越少。這樣需求改變也比較容易維護。
範例
class Person{
Department _department;
public Department getDetatment(){
return _department;
}
public void set Department(Department arg){
_department = arg;
}
}
class Department{
private String _chargeCode;
private Person _manager;
public Department (Person manager){
_manager = manager;
}
public Person getManager(){
return _manager;
}
}
如果客戶希望知道某人的經理是誰,他必須先取得Department物件
manager = json.getDepartment().getManager();
這樣就對客戶揭漏了Department工作原理,客戶就知道Department用以追蹤【經理】這條資訊。如果對客戶隱藏Department,就可以減少耦合,修改建議為
public Person getManager(){
return _deparment.getManager();
}
後繼
這個狀況也可能導致最後有很多的委託關係的Function,也會有反向的關係
重構本身就是根據當時的狀況去變化,不需要太擔心過多的Function。