你如何命名知識庫和服務接口及其實現類?如何命名存儲庫和服務接口?
例如我有一個名爲Question
的模型。你會怎樣命名這個存儲庫(接口和實現)和服務(接口/實現)。
閱讀這些帖子後: Java Interfaces/Implementation naming convention 和Interface naming in Java我重新考慮我已經做了:)
你如何命名知識庫和服務接口及其實現類?如何命名存儲庫和服務接口?
例如我有一個名爲Question
的模型。你會怎樣命名這個存儲庫(接口和實現)和服務(接口/實現)。
閱讀這些帖子後: Java Interfaces/Implementation naming convention 和Interface naming in Java我重新考慮我已經做了:)
我認爲在DDD中命名有兩種方法:
1)基於刻板印象。這是你的名字中包含類定型的地方。例如:
QuestionsRepository, TaxCalculatingService etc
2)基於域。在這種方法中,您只使用領域語言並省略類名稱中的任何刻板印象。例如:
Questions (or AllQuestions), TaxCalculator etc.
實現類將被命名爲喜歡SqlQuestions
或InMemoryQuestions
。
我嘗試了兩種,但我現在更喜歡第二種選擇,因爲它似乎更符合DDD思維。它看起來更具可讀性並且具有更好的信噪比。以下是從great article在倉庫報價由PhilCalçado:
倉庫作爲對象列表的概念是不是太難理解,但它是很常見的這些類與那些方法結束根本與列表無關。
在指導了許多團隊採用無處不在的語言和相關模式之後,我發現讓人們記住存儲庫不是DAO類的最好方法是從如何命名它們開始。
多年以前,羅德里戈·義島在爲存儲庫命名時告訴我他的約定。相反,更常見的命名風格的下方顯示:
class OrderRepository {
List<Order> getOrdersFor(Account a){...}
}
他提倡這樣的:
class AllOrders {
List<Order> belongingTo(Account a){...}
}
它看起來像一個小的變化,但它有很大幫助...
整篇文章非常值得一讀和書籤。
我個人使用FooService
,,FooRepository
和FooRepositoryImpl
。
你可能會認爲,Impl
後綴是噪音,但
FirstFooService
和SecondFooService
FooXxxImpl
類型無處使用的代碼除了在單元測試:依賴關係被注入,並且它們的類型是接口我使用'FooDao'而不是'FooRepository',因爲它的類型更短:) – Paul 2012-02-22 18:35:20
由於您只有一個實現,因此我沒有看到需要FooService接口。接口的目的是模擬可能有更多實現的對象/組件。比如驗證規則,一些策略模式。我個人認爲有很多接口過度使用。另外,事實證明你的Impl sufix作爲你的實現告訴我你的實現並不是特定的。實現名稱應該包含實現細節。例如,List,LinkedList,ArrayList。我知道這種方法很常見,但這並不意味着它是好的。 – Vajda 2015-10-22 17:57:51
我不再使用接口。請記住,這是2012年的答案。自那時以來,框架和嘲笑框架已經發展。 – 2015-10-22 19:10:05
我知道這可能是一個小細節,但實施類是否有後綴或前綴? SQLAllQuestions或AllQuestionsSQL?你喜歡哪個? – LuckyLuke 2012-02-22 20:14:05
我個人會使用SqlAllQuestions,但我沒有看到沒有使用AllQuestionsSql的任何理由,可能會更好。正如你所說,這並不重要,因爲這個名字只會用在你的應用程序的'Composition Root'部分,你不會看到它很多(http://blog.ploeh.dk/2011/07/28/ CompositionRoot.aspx) – Dmitry 2012-02-22 20:22:11
還有一件事。我閱讀了你的鏈接,這很棒,但是當你有AllQuestions界面並且你想列出所有問題時你會怎麼做? AllQuestions.everything()?在做CRUD時是否有任何約定或什麼? – LuckyLuke 2012-02-22 20:25:22