2012-05-20 80 views
1

假設您已經有一個歌曲的域模型類。 Song的節奏屬性(一個int)應該總是一個正數。這個需求是否應該是領域模型的一部分或者是外部的(比如在SongManager /業務邏輯層類中)?簡單域對象屬性值

比方說,你已經實現了它,像這樣:

class Song { 
    private int tempo; 
    // ... 

    public void setTempo(int tempo) { 
    if (tempo > 0) { 
     this.tempo = tempo; 
    } else { 
     // what? 
    } 

    } 

} 

你更換// what?以上:

  1. 沒有。給定一個歌曲實例s,s.setTempo(-10)不會修改對象的狀態。
  2. 將速度設置爲某個最小值,例如1
  3. 馬克setTempoelse子句中籤throws InvalidTempoExceptionthrow它。這樣,控制器或其他組件負責捕捉無效速度值,並決定如何處理異常。
  4. 拋出運行時 InvalidTempoException。
  5. 將節奏屬性提取到Tempo類中,其中封裝了「必須大於0」。
  6. 別的東西。

我問,因爲我最近一直在探索常見的「分層架構」方法,特別是領域層。

+0

雖然#3的氣味是顯而易見的(不必趕鴨每'setTempo'調用的檢查除外)是有辦法利用這使得躲開例外本質上「冒泡」一些驗證層? – ybakos

回答

1

如果Song對零速或負速度值無效,這當然應該是Song內的不變模型。

如果嘗試使用無效值,則應該拋出異常 - 這會確保您沒有Song處於無效狀態。

+0

運行時或經過? – ybakos

+0

@ybakos - 我回答的語言無關的方式,因爲你沒有用具體的語言標記你的問題。從你的評論我猜你是在問一個Java的實現。我沒有針對該特定語言的答案。但是,這是在屬性存在且可能會被修改時在_runtime_處發生的事情。 – Oded

2

宋的有節奏的屬性(一個int)應該永遠是一個 正數

如果這是爲Song的正確初始化的要求,那麼你應該拋出一個相應的異常如IllegalArgumentException

+0

在Java中,IllegalArgumentException是一個運行時異常。我明白這是正確的(這是IllegalArgumentException的意圖),但爲什麼不拋出一個檢查異常,而不是確保它被捕獲? – ybakos

+0

這不應該被捕獲。如果'Song'應該爲了一個特定的不變被認爲是正確的初始化那麼這應該是一個運行時異常 – Cratylus

2

這個需求應該是域模型的一部分還是外部的(比如在SongManager /業務邏輯層類中)?

與域相關的邏輯應該存在於域模型中。稱經理經常是一個信號,你不知道在哪裏放置代碼以及如何正確命名。

沒有。給定一個Song實例s,s.setTempo(-10)不會修改該對象的狀態。

情況下你需要試圖設置的速度,如果你有過那將要傳遞的參數難以控制,忽略失敗設定的速度可以接受的。這就像使用UDP協議 - 如果失敗就沒關係。只有我會相應地命名 - 例如s.trySetTempo(-10)。

設置速度在一定的最小值,例如1.

即像第一殼體的延伸部。只有當需要將歌曲速度默認爲接近於零時,我纔想到任何商業案例。

用選中的標記setTempo拋出InvalidTempoException並將其拋入else子句中。這樣,控制器或其他組件負責捕捉無效速度值,並決定如何處理異常。 拋出一個運行時InvalidTempoException。

拋出一個異常意味着任何試圖設置節奏的東西都會負責正確的輸入,因爲永遠不應該有預期的異常。通常你還必須編寫canSetTempo(或類似isTempoChangeable)指示器方法,這樣外界可以在嘗試實際處理之前打開它。

將節奏屬性提取到一個Tempo類中,其中封裝了「必須大於0」。

這取決於你的域的形狀。如果其他任何東西(如SoundSample類,MidiClip類)需要使用節奏概念,這可能是一個好主意。另外 - 如果它與您的業務幾乎無關,並且只是污染了Song類中更有趣的邏輯,那麼封裝節奏可能會很好。


我個人很喜歡域模型在動作可用時提供答案,但動作本身會引發錯誤。這也可以做出更好的用戶體驗。負責改變節奏的字段和按鈕將不會出現/被禁用 - 即時反饋表明某些事情還不能完成。

+0

與檢查異常另一個缺陷:它調用任何方法'setTempo'是心疼與捕捉或迴避除外。 – ybakos

+0

@ybakos我發現不真實。異常不應該發生。如果他們這樣做 - 對一個全局處理程序來說就足夠了。 –