2012-07-23 45 views
4

在行使你的DDD技能,假設你有這樣的對象:在DDD中打包訪問權限?

class Person { 
    Set<Address> addresses = new HashSet<Address>(); 
} 

它是比較合適的,允許正常/全集合訪問:

Set<Address> getAddresses() { 
    return addresses; 
} 

這將允許呼叫者添加/刪除他們認爲合適的地址,或者,在這種情況下讓呼叫者通過Person對象更好:

Set<Address> getAddresses() { 
    return Collections.unmodifiableSet(addresses); 
} 

void addAddress(Address address) { 
    addresses.add(address); 
} 

void removeAddress(Address address) { 
    addresses.remove(address); 
} 

f第一種情況使我們避免了創建額外的方法;第二種情況允許Person對象知道其地址的變化(以防某種原因或某種原因)。

這裏有最佳做法嗎?

回答

3

我更喜歡第二種方法,但我相信,除了客戶中不可預料的驚喜以外,不可修改的套餐只會爲您購買很少的東西。

如果您希望向客戶端傳達此集合是不可變的,那麼您應該使用在其API中保留可變性的集合類型(而不是它的實現)。也就是說,調用一個聲明爲存在的方法並捕獲一個UnsupportedOperationException,就像找到一個與你有第一次約會的女人的單位。

我愛喬希布洛赫,但我認爲他搞砸了這一個。

0

我看不出2種方法的好處或壞處。這完全取決於你的班級願意提供什麼樣的功能。

1

我想說,一般來說,第二種方法更強大。使用不可修改的集合作爲回報可以防止外部人員改變Person類的內部狀態。如果Person類邏輯上擁有他們的地址,則其他人不應該在不通過Person類方法的情況下進行更改。

0

這一切都取決於您的要求。如果有充分的理由讓潛在的收藏品遠離課堂的客戶,那麼你就做到了。否則,通常沒有提供set/get方法的缺點。

0

無論哪種方式是好的,但爲了清楚起見,我會說出不同的基礎上返回的集合是否爲可變的方法:

Set<Address> getAddresses() { 
    return Collections.unmodifiableSet(addresses); 
} 

Set<Address> addresses() { 
    return addresses; 
}