Java 인터페이스/실장 명명 규칙
작성한 클래스/인터페이스에 이름을 붙이는 방법은 무엇입니까?구현명에 추가할 구현정보가 없는 경우가 있다(인터페이스 등).FileHandler
및 클래스SqlFileHandler
.
이 경우, 통상, 인터페이스의 이름을 「통상」으로 지정합니다.Truck
그리고 실제 수업의 이름을 대라.TruckClass
.
이 점에 있어서 인터페이스와 클래스의 이름을 어떻게 붙입니까?
이름을 대세요Interface
그게 뭔지. Truck
.것은 아니다.ITruck
왜냐면 그건...ITruck
그것은 이다Truck
.
안Interface
자바에서는 타입입니다.그럼 당신은DumpTruck
,TransferTruck
,WreckerTruck
,CementTruck
등implements Truck
.
를 사용하고 있는 경우Interface
서브클래스 대신 그냥 던져주는Truck
에서와 같이List<Truck>
.놓는 것I
앞에는 헝가리식 표기법 tautology가 있어 코드에 입력하는 것 외에 아무것도 추가하지 않습니다.
모든 최신 Java IDE의 마크 인터페이스와 구현 및 이 바보 같은 표기법 없이.부르지 마TruckClass
그것은 tautology가 나쁜 것과 마찬가지로IInterface
동음이의학
구현의 경우 클래스입니다.이 규칙에 대한 유일한 진정한 예외는 항상 예외는 다음과 같을 수 있습니다.AbstractTruck
서브클래스만 볼 수 있기 때문에 절대 서브클래스에 캐스팅하지 마십시오.Abstract
class는 클래스가 추상적이라는 정보와 사용 방법에 대한 정보를 추가합니다.그래도 더 좋은 이름을 생각해 낼 수 있을 거야AbstractTruck
및 사용BaseTruck
또는DefaultTruck
그 대신abstract
정의에 있습니다.하지만 그 이후로는Abstract
클래스는 퍼블릭인터페이스의 일부가 되어서는 안 됩니다.규칙에 대한 허용 가능한 예외라고 생각합니다.컨스트럭터 만들기protected
이 분열을 넘어서는 데 큰 도움이 됩니다
그리고 그Impl
서픽스도 잡음일 뿐입니다.더 많은 동어법.인터페이스가 아닌 것은 모두 구현입니다.부분적인 구현인 추상 클래스도 마찬가지입니다.그런 바보 같은 짓은 안 할 거야?Impl
접미사를 붙일 수 있을까요?
그Interface
는 퍼블릭 메서드 및 속성이 지원하는 계약이며 유형 정보이기도 합니다.구현되는 모든 것Truck
의 유형입니다.Truck
.
Java 표준 라이브러리 자체를 참조하십시오.보이시나요?IList
,ArrayListImpl
,LinkedListImpl
아니, 봤지?List
그리고.ArrayList
,그리고.LinkedList
여기 이 질문에 대한 좋은 기사가 있습니다.이러한 어리석은 프레픽스/서픽스 명명 규칙도 모두 DRY 원칙에 위배됩니다.
또한, 만약 당신이 자신을 발견한다면DTO
,JDO
,BEAN
또는 객체에 대한 다른 바보 같은 반복 접미사를 사용할 경우, 그러한 접미사가 아닌 패키지에 속할 수 있습니다.적절하게 패키지화된 네임스페이스는 자체 문서화되어 대부분의 장소가 내부적으로 일관성 있게 준수하지 않는 매우 부적절한 독자 이름 지정 체계에서 불필요한 정보를 모두 줄입니다.
네가 생각해 낼 수 있는 모든 것이Class
유니크라는 이름은 그것을 접미사로 붙인다.Impl
그 후, 당신은 다시 생각해 볼 필요가 있다.Interface
조금도.그래서 어떤 상황에 처했을 때Interface
그리고 싱글.Implementation
그 자체만으로 특화되어 있지 않다.Interface
아마 필요없을 거야Interface
대부분의 경우.
그러나 일반적으로 유지보수성, 테스트성, 조롱을 위해서는 인터페이스를 제공하는 것이 가장 좋습니다.상세한 것에 대하여는, 다음의 회답을 참조해 주세요.
또, 인터페이스 실장 페어(Interface Implementation Pair)의 이 토픽에 관한 Martin Fowler의 이 흥미로운 기사를 참조해 주세요.
구현이 1개뿐이라면 인터페이스가 필요없다는 답변을 여기서 본 적이 있습니다.이는 Depency Injection/Inversion of Control 원칙에 위배됩니다(전화하지 마십시오. 전화 드리겠습니다).
따라서 코드를 단순화하고 삽입된 인터페이스 구현에 의존하여 쉽게 테스트할 수 있도록 하고 싶은 상황도 있습니다(프록시가 될 수도 있습니다.코드는 알 수 없습니다).2개의 실장(테스트용 모크)과 실제 실가동 코드에 삽입되는 실장)밖에 없는 경우에도 인터페이스의 불필요성은 없습니다.잘 문서화되어 있는 인터페이스는 계약을 확립합니다.또한 엄격한 테스트용 모의 실장에 의해서도 계약을 유지할 수 있습니다.
실제로 가장 엄격한 인터페이스 계약(null이 되어서는 안 되는 인수의 예외 등)을 구현하고 테스트에서 오류를 캐치하는 테스트를 확립할 수 있습니다.실가동 코드에서의 구현을 보다 효율적으로 실시합니다(모크에서 예외가 발생한 후 null이 되어서는 안 되는 인수를 체크하지 않음).예를 들어 이러한 테스트 후에 코드가 수정되었기 때문에 인수가 null이 아니라는 것을 알 수 있습니다).
의존관계 주입/IOC는 신입사원으로서는 이해하기 어려울 수 있지만, 그 가능성을 이해하게 되면 어디에서나 사용하고 싶어질 것입니다.또, 실제의 실장은 1개 뿐이지만, 항상 인터페이스를 만들고 있는 자신을 발견하게 될 것입니다.
이 1개의 실장(테스트용 모크는 Mock(InterfaceName)이라고 불릴 필요가 있다고 생각됩니다)에서는 Default(InterfaceName)라는 이름을 선호합니다.보다 구체적인 구현이 이루어지면 적절한 이름을 붙일 수 있습니다.이렇게 하면 특히 싫어하는 임팩트 접미사도 피할 수 있습니다(추상 클래스가 아니라면 당연히 "임플!"입니다).
또, 「Abstract(InterfaceName)」보다 「Base(InterfaceName)」를 선호합니다.이는 베이스 클래스가 나중에 인스턴스화되도록 하고 싶은 상황도 있지만, 지금은 「Abstract(InterfaceName)」라고 하는 이름으로 되어 있기 때문입니다.이 때문에, 클래스명이 항상 Base(InterfaceName)로 되어 있으면, 약간의 혼란이 생길 가능성이 있습니다.erfaceName)을 사용하여 추상 수식자를 삭제해도 클래스는 변경되지 않습니다.
인터페이스의 이름은 인터페이스가 나타내는 추상 개념을 기술해야 합니다.구현 클래스에는 특정 이름을 붙이기 위해 사용할 수 있는 특정 특성이 있어야 합니다.
구현 클래스가 1개밖에 없고, 그 구체적인 내용이 생각나지 않는 경우(이름을 붙이고 싶은 경우)-Impl
그럼 인터페이스를 가질 이유가 전혀 없는 것 같습니다.
Collections 클래스 등 Java Core/Sun에 의해 확립된 의사 규약을 따르는 경향이 있습니다.
List
- "개념" 객체의 인터페이스ArrayList
- 인터페이스의 구체적인 구현LinkedList
- 인터페이스의 구체적인 구현AbstractList
- 커스텀 구현을 지원하는 추상적인 "실행" 구현
AWT Event/Listener/Adapter 패러다임 이후 이벤트 클래스를 모델링하는 것과 동일한 작업을 수행하곤 했습니다.
Java에서도 충분히 기능하는 표준 C# 표기법은 모든 인터페이스에 프리픽스를 붙이는 것입니다.I
- 파일 핸들러 인터페이스는IFileHandler
트럭 인터페이스는ITruck
일관성이 있어 인터페이스와 클래스를 쉽게 구분할 수 있습니다.
"비교 가능" 또는 "직렬 가능"과 같이 인터페이스가 기술하는 계약을 나타내는 인터페이스 이름이 좋습니다."트럭"과 같은 명사는 트럭의 능력을 실제로 묘사하지 않습니다. 트럭의 능력은 무엇일까요?
표기법에 대해서:저는 모든 인터페이스가 "I"로 시작하는 프로젝트를 수행한 적이 있습니다. Java 표기법에는 다소 낯설지만 인터페이스를 쉽게 찾을 수 있습니다.이와는 별도로 "임플" 접미사는 합리적인 기본 이름입니다.
이것을 싫어하는 사람도 있고, 그 이상입니다.Java보다 NET 표기법을 사용하지만, 인터페이스의 이름을 대문자로 I 프리픽스로 지정할 수 있습니다.다음은 예를 제시하겠습니다.
IProductRepository - interface
ProductRepository, SqlProductRepository, etc. - implementations
이 명명 규칙에 반대하는 사람들은 코드 내의 인터페이스나 오브젝트 중 어느 쪽을 사용하는지 신경 쓰지 말아야 한다고 주장할 수 있지만, 저는 즉석에서 읽고 이해하는 것이 더 쉽다고 생각합니다.
구현 클래스에는 "Class" 접미사를 붙이지 않습니다.「클래스」(즉, 「클래스」)로 실제로 작업할 수 있기 때문에, 혼란이 생길 가능성이 있습니다.코드 내의 오브젝트)를 입력합니다만, 클래스 오브젝트로 작업하는 것이 아니라, 단지 오래된 오브젝트로 작업하는 것입니다.
두 가지 표기법을 모두 사용합니다.
인터페이스가 잘 알려진 패턴의 특정 인스턴스(예: 서비스, DAO)인 경우, "I"(예: UserService, AuditService, UserDao)는 모두 "I"(예: UserService, AuditService, UserDao)가 없어도 정상적으로 동작할 수 있습니다.이는 사후 수정이 메타 패턴을 결정하기 때문입니다.
단, 1회성 또는 2회성(통상은 콜백패턴용)이 있는 경우 클래스(IAsynchCallbackHandler, IUpdateListener, ICMputeDrone 등)와 구별하는 데 도움이 됩니다.이것들은 내부용으로 설계된 특수한 목적의 인터페이스입니다.가끔 IInterface는 오퍼랜드가 실제로 인터페이스라는 사실에 주의를 환기하기 때문에 언뜻 보면 바로 알 수 있습니다.
다른 경우에는 I를 사용하여 일반적으로 알려진 다른 구체적인 클래스(ISubject, IPrincipal vs Subject 또는 Principal)와의 충돌을 방지할 수 있습니다.
TruckClass
마치 하나의 클래스인 것처럼 들리다Truck
권장되는 해결책은 다음과 같습니다.Impl
서픽스가장 좋은 해결책은 구현 이름 안에 특정 구현에서 무슨 일이 일어나고 있는지(예:List
인터페이스 및 구현:ArrayList
또는LinkedList
(예를 들어 리모트 사용으로 인해 1개의 실장밖에 없고, (처음에 설명한 바와 같이) 인터페이스가 필요하게 되는 경우가 있습니다.Impl
해답입니다.
언급URL : https://stackoverflow.com/questions/2814805/java-interfaces-implementation-naming-convention
'programing' 카테고리의 다른 글
클리어, char 배열 c (0) | 2022.08.31 |
---|---|
malloc()는 내부적으로 어떻게 구현됩니까? (0) | 2022.08.30 |
Vuejs:는 요소를 숨기기.Vuejs:는 요소를 숨기기.keyup 답변? (0) | 2022.08.30 |
자바 캘린더를 사용하여 X일을 빼려면 어떻게 해야 하나요? (0) | 2022.08.30 |
다른 javascript 파일에서 Vuex Getters 호출 (0) | 2022.08.30 |