이라는 추상 클래스가 있다고 가정하십시오 Task
.
AbstractTask
대신 이름을 지정해야한다는 표준 또는 규칙이 있습니까?
이라는 추상 클래스가 있다고 가정하십시오 Task
.
AbstractTask
대신 이름을 지정해야한다는 표준 또는 규칙이 있습니까?
답변:
Bloch의 Effective Java (항목 18)에 따르면 Abstract 접두사는 특수한 경우에 사용되는 규칙입니다.
내보내는 각각의 중요하지 않은 인터페이스와 함께 추상 스켈 레탈 구현 클래스를 제공하여 인터페이스와 추상 클래스의 장점을 결합 할 수 있습니다. ... 일반적으로, 골격 구현을 AbstractInterface라고합니다. 여기서 Interface 는 구현하는 인터페이스의 이름입니다.
그러나 Bloch는 SkeletalInterface라는 이름이 의미가 있다고 지적했지만
이제 추상 컨벤션이 확정되었습니다.
다른 답변이 지적했듯이 일반적 으로이 명명 규칙을 모든 추상 클래스에 적용 할 이유가 없습니다.
컨벤션이 없습니다. 개발자로서 더 빠르고 더 나은 코드를 작성하고 다른 사람들이 귀하의 코드를 이해하는 데 도움이되는 것은 무엇입니까?
코드를보고 관리 할 사람들에게 물어보십시오. 그들은 오히려 무엇을 볼 것입니까? 그들에게 무엇이 더 쉬울까요? 그런 다음 원하는 것을 기준으로 이름을 지정하십시오.
또 다른 참고로, Java 프로그래밍 언어에 대한 코드 규약 : 9. 명명 규약 에서는 요구 사항이 없습니다.
클래스 이름은 명사이어야하며 대문자로 된 각 내부 단어의 첫 글자와 대소 문자를 혼합해야합니다. 수업 명을 단순하고 설명하기 쉽게 유지하십시오. 전체 단어를 사용하지 않는 두문자어 및 약어를 사용하십시오 (약어가 URL 또는 HTML과 같은 긴 형식보다 훨씬 널리 사용되지 않는 한).
아닙니다. Intellisense는 그것이 추상적인지를 사소하게 말해 줄 것이므로 여기서 DRY를 위반하고 있습니다.
abstract
클래스 이름을 추가 한다고해서 DRY가 위반되는 것은 아니며 모든 사람이 인텔리전스를 사용하는 것은 아닙니다. 예를 들어, 웹 페이지에서 코드를 읽는 중이거나 일반 텍스트 편집기 나 외부 diff 도구에서보고있는 패치의 일부인 경우 어떻게해야합니까?
abstract class AbstractName
? 분명히 "추상"이 두 번 있습니다. Intellisense를 사용하지 않으면 문제가됩니다. 다른 사람들은 모두 제정신 도구를 사용하여 코드를 봅니다.
.NET에서 "Base"를 접미사로 사용하여 추상 기본 클래스를 나타내는 경우가 종종 있습니다. 이것이 Java에서 일반적인 관행인지 여부에 대해서는 다른 답변을 연기합니다.
제 생각에, 엔티티 이름은 타입 구조에 대한 정보를 전달해서는 안되며 의미에 대한 정보를 전달해서는 안됩니다. 따라서 추상화가 런타임 목표의 일부가 아닌 경우 클래스를 "AbstractSomething"으로 정의하는 것은 의미가 없습니다. 기본 추상 클래스라는 것은 프로그래머가 볼 수 있으며 이름에 반영 될 필요는 없습니다.
그러나 추상 팩토리의 구현을 AbstractFactory라고 부르는 것이 완벽하다면 클래스의 의도와 관련이 있기 때문입니다.
일반적으로, 학급 목표에 대한 대부분의 정보를 전달하는 데 도움이되는 명명 규칙을 선호하십시오.
마찬가지로에서 삭제하십시오 SomethingImpl
. 우리는 그것이 기본 클래스가 아닌 구현이라는 것을 신경 쓰지 않습니다. 클래스 계층 구조가 상속을 위해 올바르게 설계된 경우 누군가가 상속 할 수 있습니다. 더 많은 "Impl"접미사 또는 기타 아티팩트를 추가하는 것은 가치가 없을 것입니다. "인터페이스"접미사 또는 "I"접두사를 추가해도 값이 없습니다.
치다:
IVehicle <-- IMotoredVehicle <-- AbstractCar <-- CarImpl
반대로 :
Vehicle <-- MotoredVehicle <-- Car <-- DefaultCar
<-- Ferrari
<-- Trabi
나는 후자를 선호한다.
이것은 어떤면 에서 헝가리어 표기법 의 끔찍한 오용 과 비슷하지만 후자 는 사람들이 변수 유형의 지표로 변수 앞에 접두사를 개발자에게 요구하도록 잘못 해석했기 때문에 나쁜 표현을 주었다고 잘못 지적했습니다. 이것은 때로는 용도를 가질 수 있지만 (주로 유형 정의를 찾기가 게으른 경우) 쓸모가 없습니다. 헝가리 표기법에 대한 Simonyi의 독창적 인 아이디어는 개발자가 유형이 아닌 엔티티의 기능을 개발자에게 상기시키기 위해 니모닉으로 사용하는 것이 었습니다.
일반적으로 구문에서 명백한 이름에 속성을 포함시키지 않는 것이 좋습니다. Java에서는 적절하게 이름이 지정된 abstract
키워드 로 추상 클래스를 표시해야 하므로 이름에 포함하지 않을 것입니다. 예를 들어 C ++에서 경우는 분명하지 않지만 적어도 추상 클래스를 잘못 사용하면 컴파일러에서 알려줍니다. 파이썬과 마찬가지로 다시 추상 클래스의 이름을 명시 적으로 지정하는 것은 나쁜 생각이 아닙니다.
규칙에 대한 일반적인 예외는 이름이 모호한 경우입니다. 어떤 이유로 든 구체적인 하위 클래스가있는 경우 Task
(다른 예에서는 더 합리적이지만 어쨌든),을 사용하십시오 AbstractTask
.
protected abstract SomeClass { }
이것은 이것이 추상 클래스라는 것을 말해줍니다. 접두사를 추가하는 것은 타우 톨 로지 및 반 패턴 이며 대부분의 경우 적합하지 않습니다 package local
. 예를 들어 예외에 대해 설명하는 링크를 참조하십시오 .
대부분의 경우 Abstract
클래스가 공개 API의 일부가되어서는 안됩니다. 클래스가 실제로 좋은 이유가 있어야하고 좋은 이유가 아닌 다른 이름을 제공해야하는 경우 AbstractSomeClass
입니다.
대부분의 경우 좀 더 설명적인 이름을 얻을 수 없다면 다시 디자인해야 할 것입니다.
내 5 센트, 아마도 당신은 아마도 추상 클래스의 구현을 가질 것이고 아마도 'SomeSpecificTask', 'TaskWithBubbles', 'StrangeTask'등으로 명명 될 것입니다. 따라서 추상 'Task'와 그들 사이에 이름 충돌이 없을 것입니다.
또한 '추상'이라는 단어는 비즈니스 도메인 엔터티가 아닌 언어 구문에 관한 것이므로 이름의 일부로 사용하지 않는 것이 좋습니다.
다른 한편으로, 하나의 대답에서 나는 J.Bloch Effective Java에서 발췌 한 것을 보았습니다. 그렇습니다. 그러나 어쨌든 공식 Java 코드 규칙에서는 그것에 대해 아무것도 없습니다.
나는 Java 개발자 (INAJD?)가 아니며 그러한 것들에 대한 표준 명명법을 모르지만, Task
그대로 존재할 수있을 정도로 추상적 이라고 생각 합니다.