추상 클래스에 "Abstract"접두사를 추가해야합니까? [닫은]


20

이라는 추상 클래스가 있다고 가정하십시오 Task.

AbstractTask대신 이름을 지정해야한다는 표준 또는 규칙이 있습니까?


: 여기에 나열되지 규칙 명명 oracle.com/technetwork/java/codeconventions-135099.html 이 링크 불구하고, 어떤 제안을 : stackoverflow.com/questions/1006332/...는 당신이라고 할 수 당신이 한 경우 그것은 끔찍한 일이 없을 것이다.
FrustratedWithFormsDesigner

C #에서 표준 규칙은 '* Base'를 사용하여 Suffix에 적용됩니다.
Den

답변:


26

Bloch의 Effective Java (항목 18)에 따르면 Abstract 접두사는 특수한 경우에 사용되는 규칙입니다.

내보내는 각각의 중요하지 않은 인터페이스와 함께 추상 스켈 레탈 구현 클래스를 제공하여 인터페이스와 추상 클래스의 장점을 결합 할 수 있습니다. ... 일반적으로, 골격 구현을 AbstractInterface라고합니다. 여기서 Interface 는 구현하는 인터페이스의 이름입니다.

그러나 Bloch는 SkeletalInterface라는 이름이 의미가 있다고 지적했지만

이제 추상 컨벤션이 확정되었습니다.

다른 답변이 지적했듯이 일반적 으로이 명명 규칙을 모든 추상 클래스에 적용 할 이유가 없습니다.


15

컨벤션이 없습니다. 개발자로서 더 빠르고 더 나은 코드를 작성하고 다른 사람들이 귀하의 코드를 이해하는 데 도움이되는 것은 무엇입니까?

코드를보고 관리 할 사람들에게 물어보십시오. 그들은 오히려 무엇을 볼 것입니까? 그들에게 무엇이 더 쉬울까요? 그런 다음 원하는 것을 기준으로 이름을 지정하십시오.

또 다른 참고로, Java 프로그래밍 언어에 대한 코드 규약 : 9. 명명 규약 에서는 요구 사항이 없습니다.

클래스 이름은 명사이어야하며 대문자로 된 각 내부 단어의 첫 글자와 대소 문자를 혼합해야합니다. 수업 명을 단순하고 설명하기 쉽게 유지하십시오. 전체 단어를 사용하지 않는 두문자어 및 약어를 사용하십시오 (약어가 URL 또는 HTML과 같은 긴 형식보다 훨씬 널리 사용되지 않는 한).


13

아닙니다. Intellisense는 그것이 추상적인지를 사소하게 말해 줄 것이므로 여기서 DRY를 위반하고 있습니다.


21
-1 abstract클래스 이름을 추가 한다고해서 DRY가 위반되는 것은 아니며 모든 사람이 인텔리전스를 사용하는 것은 아닙니다. 예를 들어, 웹 페이지에서 코드를 읽는 중이거나 일반 텍스트 편집기 나 외부 diff 도구에서보고있는 패치의 일부인 경우 어떻게해야합니까?
Bryan Oakley

10
@Bryan : 물론 DRY를 위반합니다. abstract class AbstractName? 분명히 "추상"이 두 번 있습니다. Intellisense를 사용하지 않으면 문제가됩니다. 다른 사람들은 모두 제정신 도구를 사용하여 코드를 봅니다.
DeadMG

13
"모두"? 내가 아는 대부분의 사람들은 emacs와 vi를 사용하고 몇몇은 일식을 사용합니다. 무언가가 "당신의 문제"라고 말하는 것이 정확히 팀워크의 정의는 아닙니다. 내 열악한 요점은 담요 규칙을 설정할 수 없으며 그것이 끝났다는 것입니다. 팀마다 요구 사항이 다르기 때문에 모든 사람이 인텔리전스 지원을 필요로하는 것은 아닙니다. 또한 내가 말했듯이 기본 편집기 또는 IDE 이외의 도구에서 코드를 볼 때가 여러 번 있습니다.
Bryan Oakley

1
+1은 DRY를 위반합니다. Intellisense에 의존하는 것은 약간 강력하지만 기본 클래스를 사용하는 사람은 SOLID의 일부로 무엇을 확장하고 있는지 확인해야합니다.
Gary Rowe

8
@BryanOakley 왜 공개 및 최종도 넣지 않겠습니까? 그러면 클래스 이름은 PublicAbstractPersonThatImplementsInterfaceHuman과 같습니다. 흠, 잘 모르겠습니다. 그러나 나는 보편적 인 협약과 같은 것이 없다는 것에 동의합니다. 팀의 총 생산성을 높이는 것을 사용하십시오.
Apoorv Khurasia

9

이것은 다소 선호의 문제 (그러나 경계선 나쁜 습관)이지만 대부분의 사람들은 클래스의 이름으로 한정자의 일부를 보는 것을 좋아하지 않습니다.

대부분의 IDE는 정보를 쉽게 사용할 수 있도록하기 때문에 이름에 넣을 필요는 없으며 정보를 생략하는 것이 더 깨끗합니다. 변수 이름 지정에 대한 헝가리 표기법을 생각 나게하며 오늘날 요즘 나쁜 형태로 간주됩니다. 나는 단순히 그것을 호출하는 것이 좋습니다 Task.


9

.NET에서 "Base"를 접미사로 사용하여 추상 기본 클래스를 나타내는 경우가 종종 있습니다. 이것이 Java에서 일반적인 관행인지 여부에 대해서는 다른 답변을 연기합니다.


1
"Base"및 "Impl"접미어는 +1입니다. 그것들은 구조적 요점을 만듭니다 (추상적 인 클래스가 무언가의 기초가 될 것입니다).
vski 2016 년

7
@ vski : 아니오, 나는 매우 동의하지 않습니다 : 그들은 엉덩이에 쓸모없는 고통입니다. 일반적으로 인터페이스를 설명하는 일반적인 이름으로 인터페이스 또는 기본 클래스의 이름을 지정하고 더 빠른 이름으로 구체적인 구현을하는 것이 좋습니다.
haylem

3
인터페이스 뒤의 기본 클래스에 ... Base를 사용하는 경향이 있습니다. 좋은 이름은 이미 인터페이스에 의해 사용되었으며 기본 클래스는 클라이언트 코드에 의해 사용되지 않습니다.
starblue

1
@Haylem 많은 Java 디자인 패턴은 하나의 예상 구현으로 인터페이스를 사용합니다. 이러한 경우 Impl은 매우 유용한 접미사입니다.
funkybro 2016 년

Impl 사용에 대해서는 Default vs Impl을 참조하십시오-Impl에서 멀리 떨어지십시오! Base를 접미사 (예 : TaskBase)로 사용한다는 것은 기본 클래스가 언어 구성이 아니라 패턴이라는 것을 의미합니다.
Gary Rowe

8

제 생각에, 엔티티 이름은 타입 구조에 대한 정보를 전달해서는 안되며 의미에 대한 정보를 전달해서는 안됩니다. 따라서 추상화가 런타임 목표의 일부가 아닌 경우 클래스를 "AbstractSomething"으로 정의하는 것은 의미가 없습니다. 기본 추상 클래스라는 것은 프로그래머가 볼 수 있으며 이름에 반영 될 필요는 없습니다.

그러나 추상 팩토리의 구현을 AbstractFactory라고 부르는 것이 완벽하다면 클래스의 의도와 관련이 있기 때문입니다.

일반적으로, 학급 목표에 대한 대부분의 정보를 전달하는 데 도움이되는 명명 규칙을 선호하십시오.

마찬가지로에서 삭제하십시오 SomethingImpl. 우리는 그것이 기본 클래스가 아닌 구현이라는 것을 신경 쓰지 않습니다. 클래스 계층 구조가 상속을 위해 올바르게 설계된 경우 누군가가 상속 할 수 있습니다. 더 많은 "Impl"접미사 또는 기타 아티팩트를 추가하는 것은 가치가 없을 것입니다. "인터페이스"접미사 또는 "I"접두사를 추가해도 값이 없습니다.

치다:

IVehicle <-- IMotoredVehicle <-- AbstractCar <-- CarImpl

반대로 :

Vehicle <-- MotoredVehicle <-- Car <-- DefaultCar
                                   <-- Ferrari
                                   <-- Trabi

나는 후자를 선호한다.


이것은 어떤면 에서 헝가리어 표기법끔찍한 오용 과 비슷하지만 후자 사람들이 변수 유형의 지표로 변수 앞에 접두사를 개발자에게 요구하도록 잘못 해석했기 때문에 나쁜 표현을 주었다고 잘못 지적했습니다. 이것은 때로는 용도를 가질 수 있지만 (주로 유형 정의를 찾기가 게으른 경우) 쓸모가 없습니다. 헝가리 표기법에 대한 Simonyi의 독창적 인 아이디어는 개발자가 유형이 아닌 엔티티의 기능을 개발자에게 상기시키기 위해 니모닉으로 사용하는 것이 었습니다.


3

일반적으로 구문에서 명백한 이름에 속성을 포함시키지 않는 것이 좋습니다. Java에서는 적절하게 이름이 지정된 abstract키워드 로 추상 클래스를 표시해야 하므로 이름에 포함하지 않을 것입니다. 예를 들어 C ++에서 경우는 분명하지 않지만 적어도 추상 클래스를 잘못 사용하면 컴파일러에서 알려줍니다. 파이썬과 마찬가지로 다시 추상 클래스의 이름을 명시 적으로 지정하는 것은 나쁜 생각이 아닙니다.

규칙에 대한 일반적인 예외는 이름이 모호한 경우입니다. 어떤 이유로 든 구체적인 하위 클래스가있는 경우 Task(다른 예에서는 더 합리적이지만 어쨌든),을 사용하십시오 AbstractTask.


... 또는 클래스 List와 같은 인터페이스 AbstractList(구현 하는 인터페이스 ).

3
protected abstract SomeClass { }

이것은 이것이 추상 클래스라는 것을 말해줍니다. 접두사를 추가하는 것은 타우 톨 로지 및 반 패턴 이며 대부분의 경우 적합하지 않습니다 package local. 예를 들어 예외에 대해 설명하는 링크를 참조하십시오 .

대부분의 경우 Abstract클래스가 공개 API의 일부가되어서는 안됩니다. 클래스가 실제로 좋은 이유가 있어야하고 좋은 이유가 아닌 다른 이름을 제공해야하는 경우 AbstractSomeClass입니다.

대부분의 경우 좀 더 설명적인 이름을 얻을 수 없다면 다시 디자인해야 할 것입니다.


0

내 5 센트, 아마도 당신은 아마도 추상 클래스의 구현을 가질 것이고 아마도 'SomeSpecificTask', 'TaskWithBubbles', 'StrangeTask'등으로 명명 될 것입니다. 따라서 추상 'Task'와 그들 사이에 이름 충돌이 없을 것입니다.

또한 '추상'이라는 단어는 비즈니스 도메인 엔터티가 아닌 언어 구문에 관한 것이므로 이름의 일부로 사용하지 않는 것이 좋습니다.

다른 한편으로, 하나의 대답에서 나는 J.Bloch Effective Java에서 발췌 한 것을 보았습니다. 그렇습니다. 그러나 어쨌든 공식 Java 코드 규칙에서는 그것에 대해 아무것도 없습니다.


public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E>- 인터페이스의 이름이기 때문에 클래스 List의 이름으로 사용할 수 없습니다 AbstractList. 인터페이스를 구현하는 것이 추상 클래스 (인터페이스를 구현하는 것)를 확장하거나 확장하지 않을 수있는 잘 알려진 관행이며 공식 Java 코드의 일부입니다.

-1

팀에서 일하는 경우 전체 팀은 추상 클래스 앞에 "Abstract"를 붙여야하는지 여부를 결정해야합니다.

본인이 직접 작업하는 경우 본인이나이 사이트의 다른 사람이 아닌 전적으로 귀하에게 달려 있습니다.



-2

추상 AbstractSyntaxTree클래스 를 작성하려면 어떻게해야 합니까? 아니면 그냥 초록 SyntaxTree?

그것은 종래의 것이 아니며 사람들을 쉽게 혼란스럽게 할 수 있습니다.


-2

나는 이것을했다. AbstractOperation이라는 내 추상 클래스에 접두사로 'Abstract'를 추가했습니다. 내가 한 이유는 Operation이라는 추상 클래스가 아닌 다른 패키지가 있었기 때문에 나중에 팀과 프로그래머가 둘 사이의 혼란을 피하는 데 도움이되었습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.