2012-02-22 4 views
6

저장소 및 서비스 인터페이스와 해당 구현 클래스의 이름을 어떻게 지정합니까?저장소 및 서비스 인터페이스의 이름을 지정하는 방법은 무엇입니까?

예를 들어 나는 Question이라는 모델을 가지고 있습니다. 저장소 (인터페이스 및 구현) 및 서비스 (인터페이스/구현)의 이름은 무엇입니까?

이 게시물을 읽은 후 : Java Interfaces/Implementation naming conventionInterface naming in Java 내가 이미 :)

답변

7

DDD에서 명명하는 데 대략 두 가지 방법이 있다고 생각합니다.

1) 스테레오 타입 기반. 여기에 이름에 클래스 스테레오 타입이 포함됩니다. 예 :

QuestionsRepository, TaxCalculatingService etc 

2) 도메인 기반. 이 접근법에서는 도메인 언어 만 사용하고 클래스 이름에는 어떤 고정 관념도 생략합니다. 예를 들어 :

Questions (or AllQuestions), TaxCalculator etc. 

구현 클래스는 SqlQuestions 또는 InMemoryQuestions 같은 이름을 지정해야합니다.

나는 둘 다 시도했지만 DDD 마인드에 더 잘 맞는 것처럼 보이는 두 번째 옵션을 선호합니다. 그것은 더 가독성이 있고 더 나은 신호대 잡음비를 가지고 있습니다.

개체의 목록과 같은 저장소의 개념은 이해하기 너무 단단하지 않다 그러나 그 클래스는 방법으로 끝낼하는 것이 매우 일반적이다 : 필 CALCADO하여 저장소에 great article에서 인용되는 다음 목록과 전혀 관련이 없습니다.

유비쿼터스 언어 및 관련 패턴을 채택하는 데 많은 팀을지도 한 후, 나는 리포지토리가 DAO와 같은 수업이 아니라는 것을 기억하게하는 가장 좋은 방법은 이름으로 시작한다는 것을 알게되었습니다.

몇 년 전에 Rodrigo Yoshima는 저장소 이름을 지정할 때 그의 대회에 대해 이야기했습니다. 대신보다 일반적인 명명 스타일의 아래에 표시 :

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

그는이 촉진 :

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

그것은 작은 변화처럼 보이지만 그것은 많은 도움이 ...

전체 기사는 읽고 읽고 북마크 할 가치가 있습니다.

+0

이것이 사소한 세부 사항 일 수 있지만 구현 클래스에 접미사 또는 접두사가 있어야한다는 것을 알고 있습니다. SQLAllQuestions 또는 AllQuestionsSQL? 당신은 무엇을 선호합니까? – LuckyLuke

+0

나는 개인적으로 SqlAllQuestions를 사용할 것이지만, AllQuestionsSql을 사용하지 않는 이유는 보이지 않는다. 이 이름은 응용 프로그램의 'Composition Root'부분에서만 사용되므로 많이 볼 수 없기 때문에 별 문제가되지 않습니다 (http://blog.ploeh.dk/2011/07/28/). CompositionRoot.aspx) – Dmitry

+0

한 가지 더. 귀하의 링크를 읽었을 때 좋았지 만, AllQuestions 인터페이스가 있고 모든 질문을 나열하고 싶다면 어떻게해야합니까? AllQuestions.everything()? CRUD를 할 때 관습이나 무언가가 있습니까? – LuckyLuke

2

을 한 일을 재고 개인적으로 FooService, FooServiceImpl, FooRepositoryFooRepositoryImpl를 사용합니다.

당신은 Impl 접미사 소음이라고 주장 수도 있지만

  • 일반적으로 하나의 구현이, 그래서 콘크리트 FooXxxImpl 종류의 단위 테스트를 제외하고는 코드에서 아무 곳에도 사용하지 아니 FirstFooServiceSecondFooService
  • 없다 : 종속성이 주입되고 그 유형이 인터페이스입니다.
+0

입력하기가 더 짧기 때문에'FooRepository' 대신'FooDao'를 사용합니다 : – Paul

+0

FooService 인터페이스가 필요하지 않습니다. 구현이 하나뿐이기 때문입니다. 인터페이스의 목적은 더 많은 구현을 가질 가능성이있는 객체/컴포넌트를 모델링하는 것입니다. validationRule과 같은 몇 가지 전략 패턴. 나는 개인적으로 많은 인터페이스 과용이 있다고 생각한다. 또한 Imple sufix를 구현 한 사실로 인해 구현이 어쨌든 구체적이지는 않습니다. 구현 이름은 구현 세부 사항을 포함해야합니다. 예 : List, LinkedList, ArrayList. 나는이 접근법이 일반적이라는 것을 알고 있지만, 그것이 좋은 것을 의미하지는 않습니다. – Vajda

+0

더 이상 인터페이스를 사용하지 않습니다. 이것이 2012 년의 해답임을 기억하십시오. 프레임 워크와 조롱 프레임 워크는 그 이후로 발전해 왔습니다. –

관련 문제