2011-08-22 105 views
2

故事可由提名人被給予(ONE)。所以,我的提名人實體有以下方法:DDD漏封裝問題

public void GiveAward(StoryBase story) 
{ 
    if (story.HasAward())   
     throw new InvalidOperationException("..."); 

    if (BusinessUnit.HasAwardsToGive() == false) 
     throw new ... 

    story.SetAward(new Award(AwardType.Results)); 
} 

自己是不是有我的權利坐在我怎麼有這個迄今爲止實現的。 SetAward()是公開可見的,所以它可以從提名者之外的人那裏調用,但提名者必須知道故事是否已經被授予了獎勵。

任何想法都會很棒!

回答

1

這裏所期望的行爲是另一個建議。

故事作爲輸入提名者。現在

public class Story 
{ 
    public void GiveAward(Nominator nominator) 
    { 
     if (this.Award != null) 
      throw new ... 
     var award = nominator.CreateAwardForStory(this); 
     this.SetAward(award); // SetAward can now be private 
    } 
} 
public class Nominator 
{ 
    public Award CreateAwardForStory(Story story) 
    { 
     if (BusinessUnit.HasAwardsToGive() == false) 
      throw new ... 
     return new Award(AwardType.Results); 
    } 
} 

,如果我們假設CreateAwardForStory(...)功能保證返回一個新實例(這個名字意味着它不),該故事也含蓄地驗證了同樣的實例不給多個故事。

+0

這是有道理的。總是絆倒我的是確定在驗證需要發生時添加行爲的意義。我想它只是一種學習體驗。謝謝。 – Marco

2

SetAward來說,測試是否獲得獎勵是否更有意義?記住:tell, don't ask

+0

是的,但我忽略了一些邏輯。提名人擁有一個擁有所有可用獎勵類型的BusinessUnit,因此提名人需要與其業務部門進行覈對。 – Marco

+0

我很困惑,爲什麼BusinessUnit需要參與。它是否僅包含AwardTypes,還是以某種方式確定可以頒發多少獎項?無論如何,你在調用提名人之前不會做檢查嗎?爲什麼甚至試圖在沒有獎勵的情況下頒獎? –

+0

業務部門擁有一系列獎勵類型,就是這樣。在我的測試中,我需要確保無法頒發無效獎勵。 – Marco

1

而不是讓故事有獎,也許獎應該指向故事?

public class Award 
{ 
    public Award(Story awardedTo, Nominator awardedBy) 
    { ... } 
} 

不知道您的域(從而知道什麼是一個故事,一個獎項),我很難知道什麼是有意義的,但這種模式將允許一個故事來接收多個獎項。如果故事是一部電影,而獎項可以是金球獎或奧斯卡獎等,那麼這個模型也允許一個故事有多個獎項。但是由於您在原始代碼中明確禁止了該內容,因此可能在您的域中無效。

+0

正確,一個故事只允許一個獎項(兩種不同類型)。所以在我的數據庫(我知道...它的一個細節)我的故事表有一個1:1關係的StoryAwardId外鍵。 – Marco

0

你真的應該是繼告訴不問原則,只是將裁決並拋出異常,如果這是在StoryBase類

+0

對不起,我修改了我的問題。我沒有列出所有的邏輯。 – Marco