Java에서 인터페이스 이름 지정
대부분의 OO 언어는 그들의 인터페이스 이름 앞에 대문자 I을 붙이는데, 왜 자바는 이것을 하지 않는가?이 관례를 따르지 않은 근거는 무엇이었습니까?
사용자 인터페이스와 사용자 구현을 원하는 경우 Java에서 다음 두 가지 옵션을 선택하십시오.
- 클래스 = 사용자, 인터페이스 = 사용자 인터페이스
- 클래스 = 사용자임플, 인터페이스 = 사용자
대부분의 언어로 된 경우:
클래스 = 사용자, 인터페이스 = IUser
이제, 당신은 항상 사용자 구현을 위해 가장 설명적인 이름을 선택할 수 있다고 주장할 수 있지만, 자바에서는 사물에 대한 POJO 접근법을 추진하고 있고 대부분의 IOC 컨테이너는 DynamicProxies를 광범위하게 사용한다.이 두 가지를 함께 사용하면 단일 POJO 구현에 많은 인터페이스가 제공될 수 있다.
그래서, 내 질문은 "특히 자바 프레임워크가 어디를 향하고 있는 것처럼 보이는지 볼 때 더 넓은 인터페이스 명명 규칙을 따를 가치가 있는가?"로 요약된다.
인터페이스에는 접두사를 사용하지 않는 것이 좋다.
그 접두사는 가독성을 해친다.
클라이언트에서 인터페이스를 사용하는 것이 프로그램하는 가장 표준적인 방법이기 때문에 인터페이스 이름은 가능한 짧고 쾌적해야 한다.수업을 시행하는 것은 그들의 사용을 억제하기 위해 더 추악해야 한다.
추상 클래스에서 인터페이스로 변경할 때 접두사 I가 있는 코딩 규칙은 클래스의 모든 발생 이름을 --- 좋지 않음!
다음 사이에 정말로 차이가 있는가?
class User implements IUser
그리고
class UserImpl implements User
이름 짓기 규칙만 얘기한다면?
개인적으로 나는 와의 인터페이스보다 앞서지 않는 것을 선호한다.I
나는 인터페이스에 코딩을 하고 싶기 때문에 명명 규칙의 측면에서 그것이 더 중요하다고 생각한다.인터페이스를 호출하는 경우IUser
그리고 그 반의 모든 소비자들은 그것이 무엇인지 알 필요가 있다.IUser
만약 당신이 학급에 전화한다면.UserImpl
그러면 오직 학급과 너의 DI 컨테이너만이 그들에 대해 안다.Impl
부품과 소비자들은 단지 그들이 작업하고 있다는 것을 안다.User
.
한편, 내가 어쩔 수 없이 사용했던 시간들은Impl
더 나은 이름은 그 자체로 드물고 그 사이에 있지 않기 때문에 구현에 따라 이름이 지정되기 때문이다. 예를 들어, 그것이 중요한 부분이기 때문이다.
class DbBasedAccountDAO implements AccountDAO
class InMemoryAccountDAO implements AccountDAO
자바가 일반적으로 아이유서 규약을 사용하지 않는 몇 가지 이유가 있을 수 있다.
Object-Oriented 접근법의 일부는 클라이언트가 인터페이스를 사용하고 있는지 아니면 구현 클래스를 사용하고 있는지 알 필요가 없다는 것이다.그러므로, 이븐 리스트는 인터페이스고 스트링은 실제 클래스인데, 그 둘 다 방법이 통과될 수 있다. - 인터페이스를 시각적으로 구분하는 것은 말이 되지 않는다.
일반적으로 클라이언트 코드에서 인터페이스 사용을 선호할 것이다(예를 들어, List to ArrayList 등).따라서 인터페이스가 예외로 두드러지게 되는 것은 이치에 맞지 않는다.
자바 명명 규칙은 헝가리식 접두사보다 실제 의미가 있는 긴 이름을 선호한다.가능한 한 코드를 읽을 수 있게 한다. 목록은 목록을 나타내고 사용자는 IUser가 아닌 사용자를 나타낸다.
봄을 포함한 많은 오픈소스 프로젝트에서 사용되는 또 다른 협약도 있다.
interface User {
}
class DefaultUser implements User {
}
class AnotherClassOfUser implements User {
}
나는 개인적으로 "I" 접두사가 선택적 관례라는 단순한 이유로 마음에 들지 않는다.그래서 내가 이것을 채택한다면 IOPConnection은 IOPConnection을 위한 인터페이스를 의미하는가?클래스에 "I" 접두사가 없는 경우 인터페이스가 아닌 경우여기서 답은 아니다. 왜냐하면 관례는 항상 지켜지지 않고, 그것을 감시하는 것은 협약 자체가 절약하는 더 많은 일을 만들어 낼 것이기 때문이다.
다른 포스터에서 말했듯이, 일반적으로 인터페이스가 유형이 아닌 기능을 정의하도록 하는 것이 바람직하다.나는 "사용자"와 같은 것을 "실행"하지 않는 경향이 있는데, 이것이 바로 "이유"인 이유다.아이유서"는 여기서 설명하는 방식으로는 별로 필요하지 않은 경우가 많다.나는 종종 클래스를 명사, 접점을 형용사로 본다.
class Number implements Comparable{...}
class MyThread implements Runnable{...}
class SessionData implements Serializable{....}
때때로 형용사는 말이 되지 않지만, 나는 여전히 일반적으로 행동, 행동, 능력, 속성 등을 모델링하기 위해 인터페이스를 사용한다.활자가 아닌
또한, 한 명의 사용자만 만들고 User라고 부른다면 IUser 인터페이스가 있는 이유가 무엇인가?그리고 공통 인터페이스를 구현해야 하는 몇 가지 다른 유형의 사용자가 있다면, 인터페이스에 "I"를 추가하면 구현 이름을 선택할 때 어떤 것이 절약되는가?
좀 더 현실적인 예로는 어떤 유형의 사용자가 특정 API에 로그인할 수 있어야 한다고 생각한다.로그인 인터페이스를 정의한 다음 SuperUser, DefaultUser, AdminUser, AdministrationContact, succlasses와 함께 "User" 부모 클래스를 가질 수 있으며, 그 중 일부는 필요에 따라 로그인(Loginable?) 인터페이스를 구현하거나 구현하지 않을 수 있다.
밥 리는 프레젠테이션에서 이렇게 말했다.
구현이 하나만 있는 경우 인터페이스의 요점은 무엇인가?
먼저 하나의 구현, 즉 인터페이스 없이 시작하십시오.나중에 여기서 인터페이스가 필요하므로 클래스를 인터페이스로 변환하십시오.
그러면 명백해진다: 당신의 원래 클래스는 User라고 불렸다.당신의 인터페이스는 이제 User라고 불린다. 아마도 당신은 UserProdImpl과 UserTestImpl을 가지고 있을 것이다.응용프로그램을 잘 설계한 경우, 사용자를 인스턴스화하는 클래스를 제외한 모든 클래스는 변경되지 않으며, 갑자기 인터페이스를 통과하는 것을 알아차리지 못한다.
따라서 -> 인터페이스 사용자 구현 UserImpl.
C#에서는 그렇다.
public class AdminForumUser : UserBase, IUser
자바라면 이렇게 말할 것이다.
public class AdminForumUser extends User implements ForumUserInterface
그 때문에, 상속과 인터페이스 구현 사이에는 분명한 차이가 있기 때문에 인터페이스에 대한 규약이 자바에서 거의 중요하다고 생각하지 않는다.나는 당신이 일관성이 있는 한 당신이 원하는 어떤 명명 규칙을 선택하고 사람들에게 이것이 인터페이스라는 것을 보여주기 위해 무언가를 사용한다고 말하고 싶다.몇 년 동안 자바를 해 본 적은 없지만 모든 인터페이스는 각자의 디렉토리에 있을 것이고, 그것이 관례였습니다.전혀 문제가 없었지
내 경험상, "I" 규약은 특히 인터페이스 자체가 클래스의 추상적인 개념이 아닐 때 클래스에 계약을 제공하려는 인터페이스에 적용된다.
예를 들어, 당신의 경우, 나는 단지 단지 볼 것을 기대했을 뿐이다.IUser
만약 당신이 가지고 싶은 유일한 사용자가User
.만약 당신이 다른 유형의 사용자들을 가질 계획이라면 -NoviceUser
ExpertUser
, 등 - 나는 다음과 같은 것을 볼 수 있을 것으로 예상한다.User
인터페이스(및, 아마도,AbstractUser
다음과 같은 몇 가지 공통 기능을 구현하는 클래스get/setName()
).
기능을 정의하는 인터페이스도 기대할 수 있다.Comparable
Iterable
, 등 - 그렇게 이름을 붙이는 것, 그렇지 않은 것.IComparable
또는IIterable
.
좋은 OO 원칙을 따르면, 당신의 코드는 구체적인 수업보다는 추상화에 의존해야 한다.예를 들어, 일반적으로 다음과 같은 방법을 쓰는 것이 좋다.
public void doSomething(Collection someStuff) {
...
}
이것보다:
public void doSomething(Vector someStuff) {
...
}
만약 당신이 이 아이디어를 따라간다면, 나는 당신이 "User"와 "BankAccount"와 같은 인터페이스 이름을 붙이면 당신의 코드를 더 읽을 수 있을 것이라고 주장한다.IUser", "UserInterface" 또는 기타 변형.
실제 콘크리트 등급에 신경 써야 할 코드 조각은 콘크리트 등급이 건설되는 곳뿐이다.다른 모든 것은 인터페이스를 사용하여 작성되어야 한다.
만약 이렇게 한다면, "UserImpl"과 같은 "못된" 구체적인 클래스 이름은 코드의 나머지 부분으로부터 안전하게 숨겨져야 하며, 이것은 "nice" 인터페이스 이름을 사용하여 즐겁게 계속할 수 있다.
=v= "I" 접두사는 위켓 프레임워크에서도 사용되는데, 여기서 나는 금방 익숙해졌다.일반적으로, 나는 번거로운 Java 클래스 이름을 짧게 하는 어떤 관습도 환영한다.그러나 모든 것이 디렉토리와 자바독에서 "나"에 따라 알파벳으로 표기되는 것은 번거로운 일이다.
위켓 코딩 관행은 많은 컨트롤/위젯 인스턴스가 인라인 방식 선언과 함께 익명 내부 클래스로 구성된다는 점에서 Swing과 유사하다.짜증스럽게도, 스윙이 구현 클래스에 접두사("J")를 사용하는 것은 스윙 인 스윙과 180° 다르다.
"임플" 접미사는 맹글리 약어로 국제화가 잘 되지 않는다.만약 우리가 적어도 "임파"를 가지고 갔더라면 그것은 더 귀여웠을 것이다."임플"은 IOC, 특히 Spring을 위해 사용되기 때문에 우리는 지금으로서는 그것을 고수하고 있다.하지만 하나의 코드베이스의 3가지 다른 부분에서 3가지 다른 규약을 따르는 것은 약간 정신분열을 일으킨다.
이것이 진정한 의미에서 더 광범위한 명명 규칙인가?나는 C++ 쪽에 더 있고, 자바와 후손에 대해서는 별로 관심이 없다.얼마나 많은 언어 커뮤니티가 I 컨벤션에 사용하니?
여기에 언어에 독립적인 상점 표준 이름 지정 규칙이 있으면 사용하십시오.그렇지 않은 경우 언어 이름 지정 규칙을 따르십시오.
참조URL: https://stackoverflow.com/questions/541912/interface-naming-in-java
'programing' 카테고리의 다른 글
Vuex / Vue를 사용하여 비동기 데이터 검색을 처리하는 방법 (0) | 2022.05.19 |
---|---|
Vuejs에서 DOM 요소 사이의 거리를 계산하는 가장 좋은 방법은 무엇인가? (0) | 2022.05.19 |
Vuex Store 모듈에서 Vue.js 플러그인 사용 (0) | 2022.05.19 |
Android에서 파일 읽기/쓰기 문자열 (0) | 2022.05.19 |
Android Studio가 올바른 Jvm을 찾을 수 없음(MAC OS와 관련) (0) | 2022.05.18 |