2011-05-14 74 views
1

有很多關於數據模型中的可變/不可變對象的說法。可變與不可變與業務邏輯對象

但是業務邏輯呢?例如:一個CD播放器。一個班負責播放CD。

// Immutable version: 
class Player 
{ 
    CD cd; 
    public Player(CD cd) { ... } 
} 

// Mutable version: 
class Player 
{ 
    CD cd; 
    public void ChangeCD(CD cd) { ... } 
} 

我可以想到兩個版本的幾個微妙的優點和缺點。例如,當玩家可變時,即使CD改變,其他物體也可以拿走玩家並保持有效。當玩家是不可變的時候,你需要一個包裝器對象(例如Command Pattern),當一個新玩家被創建時它會被更新。

哪個版本更適合哪種情況?有沒有一般的指導方針?

回答

1

這是第三個選項。

class Player 
{ 
    // private CD myCD <- no private field for the CD 
    public Player() {} 
    public void playCD (CD cd) {} 
} 

玩家不應該擁有CD對象。應該只是告訴這是一個CD對象,播放它。

一個更好的選擇是

class CDPlayer : DataPlayer 
{ 
    public Player() {} 
    public void playData (IData cd) {} 
} 

class CD : IData {} 

如果你減少你的CD和播放器,那麼你真的沒有想太多好好的,這之間的耦合量。

我相信你的例子在你的實際問題上有點缺陷。

+1

所以你會傳遞一個CD對象與每個方法 - 例如暫停(cd),尋求(cd,時間)?玩家沒有任何關於任何CD的狀態。看起來不錯,但是你會在這個設計中存儲CurrentPlaybackPosition? – LTR 2011-05-15 11:27:37

+0

@LTR取決於。我打算把CD上的數據直接加載到某種私有二進制緩衝區中。然後,您可以停下來,向前/向後走,並完全覆蓋該緩衝區。 – Raynos 2011-05-15 12:31:37