이름은 의미를 전달할 기회가 있습니다. 왜 Impl과 함께 그 기회를 버리겠습니까?
우선, 구현이 하나 뿐인 경우 인터페이스를 사용하지 마십시오. 이 명명 문제를 만들고 아무것도 추가하지 않습니다. 더 나쁜 것은 사용자와 다른 모든 개발자가 항상 인터페이스 만 사용하도록주의하지 않으면 API에서 일치하지 않는 메소드 서명에 문제가 발생할 수 있습니다.
주어진 모든 인터페이스 는 두 개 이상의 구현을 갖 거나 가질 수 있다고 가정 할 수 있습니다 .
지금 하나만 가지고 있고 다른 방법이 어떻게 다른지 모르는 경우 기본을 시작하는 것이 좋습니다.
지금 두 가지가 있다면 목적에 따라 각각 이름을 지정하십시오.
예 : 최근에 우리는 구체적인 클래스 Context (데이터베이스를 참조)를 가졌습니다 . 오프라인 상태 인 컨텍스트를 표현할 수 있어야했기 때문에 Context라는 이름이 새 인터페이스에 사용되었으며 (이전 API와의 호환성을 유지하기 위해) 새로운 구현 인 OfflineContext 가 작성되었습니다 . 그러나 원본 이름이 무엇으로 바뀌었을까요? 맞습니다, ContextImpl (이크).
이 경우 DefaultContext 는 괜찮을 것이고 사람들은 그것을 얻을 수 있지만 가능한 한 설명 적이지는 않습니다. 결국 오프라인 이 아닌 경우 무엇입니까? 그래서 우리는 OnlineContext 와 함께 갔다 .
특수 사례 : 인터페이스에서 "I"접두사 사용
다른 답변 중 하나는 인터페이스에서 I 접두사를 사용하는 것이 좋습니다. 바람직하게는이 작업을 수행 할 필요 가 없습니다 .
그러나 사용자 정의 구현을 위해 인터페이스가 모두 필요하지만 자주 사용되는 기본 구현 이 있으며 기본 이름이 너무 단순하여 인터페이스 만 포기하면 추가를 고려할 수 있습니다. 인터페이스에 대한 "I"(여전히 당신과 당신의 팀에 맞지 않으면 괜찮습니다).
예 : 많은 객체가 "EventDispatcher"일 수 있습니다. API를 위해서는 인터페이스를 준수해야합니다. 그러나 위임을위한 기본 이벤트 디스패처도 제공하려고합니다 . DefaultEventDispatcher은 잘 될 것이다, 그러나 그것은 긴 조금, 그리고 당신이 자주의 이름을 볼 수있을 위하여려고하는 경우에, 당신은 수있는 기본 이름을 사용하는 것을 선호 하는 EventDispatcher를 콘크리트 클래스 및 구현 하여 IEventDispatcher를 사용자 정의 구현을 위해 :
/* Option 1, traditional verbose naming: */
interface EventDispatcher { /* interface for all event dispatchers */ }
class DefaultEventDispatcher implements EventDispatcher {
/* default event dispatcher */
}
/* Option 2, "I" abbreviation because "EventDispatcher" will be a common default: */
interface IEventDispatcher { /* interface for all event dispatchers */ }
class EventDispatcher implements IEventDispatcher {
/* default event dispatcher. */
}