2012-02-22 46 views

回答

7

我認爲在DDD中命名有兩種方法:

1)基於刻板印象。這是你的名字中包含類定型的地方。例如:

QuestionsRepository, TaxCalculatingService etc 

2)基於域。在這種方法中,您只使用領域語言並省略類名稱中的任何刻板印象。例如:

Questions (or AllQuestions), TaxCalculator etc. 

實現類將被命名爲喜歡SqlQuestionsInMemoryQuestions

我嘗試了兩種,但我現在更喜歡第二種選擇,因爲它似乎更符合DDD思維。它看起來更具可讀性並且具有更好的信噪比。以下是從great article在倉庫報價由PhilCalçado:

倉庫作爲對象列表的概念是不是太難理解,但它是很常見的這些類與那些方法結束根本與列表無關。

在指導了許多團隊採用無處不在的語言和相關模式之後,我發現讓人們記住存儲庫不是DAO類的最好方法是從如何命名它們開始。

多年以前,羅德里戈·義島在爲存儲庫命名時告訴我他的約定。相反,更常見的命名風格的下方顯示:

class OrderRepository { 
    List<Order> getOrdersFor(Account a){...} 
} 

他提倡這樣的:

class AllOrders { 
    List<Order> belongingTo(Account a){...} 
} 

它看起來像一個小的變化,但它有很大幫助...

整篇文章非常值得一讀和書籤。

+0

我知道這可能是一個小細節,但實施類是否有後綴或前綴? SQLAllQuestions或AllQuestionsSQL?你喜歡哪個? – LuckyLuke 2012-02-22 20:14:05

+0

我個人會使用SqlAllQuestions,但我沒有看到沒有使用AllQuestionsSql的任何理由,可能會更好。正如你所說,這並不重要,因爲這個名字只會用在你的應用程序的'Composition Root'部分,你不會看到它很多(http://blog.ploeh.dk/2011/07/28/ CompositionRoot.aspx) – Dmitry 2012-02-22 20:22:11

+0

還有一件事。我閱讀了你的鏈接,這很棒,但是當你有AllQuestions界面並且你想列出所有問題時你會怎麼做? AllQuestions.everything()?在做CRUD時是否有任何約定或什麼? – LuckyLuke 2012-02-22 20:25:22

2

我個人使用FooService,​​,FooRepositoryFooRepositoryImpl

你可能會認爲,Impl後綴是噪音,但

  • 有通常只有一個實現,所以沒有FirstFooServiceSecondFooService
  • 混凝土FooXxxImpl類型無處使用的代碼除了在單元測試:依賴關係被注入,並且它們的類型是接口
+0

我使用'FooDao'而不是'FooRepository',因爲它的類型更短:) – Paul 2012-02-22 18:35:20

+0

由於您只有一個實現,因此我沒有看到需要FooService接口。接口的目的是模擬可能有更多實現的對象/組件。比如驗證規則,一些策略模式。我個人認爲有很多接口過度使用。另外,事實證明你的Impl sufix作爲你的實現告訴我你的實現並不是特定的。實現名稱應該包含實現細節。例如,List,LinkedList,ArrayList。我知道這種方法很常見,但這並不意味着它是好的。 – Vajda 2015-10-22 17:57:51

+0

我不再使用接口。請記住,這是2012年的答案。自那時以來,框架和嘲笑框架已經發展。 – 2015-10-22 19:10:05