서브 클래스의 명명을위한 모범 사례


10

나는 종종 인터페이스 나 클래스로 표현되는 개념을 가지고 있으며, 그런 다음 그것을 확장하는 일련의 서브 클래스/서브 인터페이스를 가지고있다. 예를 들어

: 일반적인 "DoiGraphNode" A "DoiGraphNode"등

I 관련된 경로로 자바 자원 A "DoiGraphNode"을 나타내는 자원 A "DoiGraphNode"등을 나타내는 세 가지 명명 규칙을 생각할 수 있으며 선택할 방법에 대한 의견을 환영합니다.


옵션 1 : 항상 개념의 이름으로 시작하십시오. 따라서

: 등 DoiGraphNode, DoiGraphNodeResource, DoiGraphNodeJavaResource, DoiGraphNodeWithPath,

프로 : 그것은 내가 처리하고있는 무슨 매우 분명하다, 내가

콘이 모든 옵션을 쉽게 알 수있다 : 없음 매우 자연스러운? 모두 똑같은가요?


옵션 2 : 처음부터 특수 재료를 넣으십시오. 따라서

: 등 DoiGraphNode, ResourceDoiGraphNode, JavaResourceDoiGraphNode, PathBaseDoiGraphNode, 등

프로 : 내가 코드에서 볼 때 매우 분명하다

단점 : 특히, 그것은 어려울 수 찾기 내가 이름을 기억하지 않는 경우, 시각적 일관성의 부족


옵션 3 : 특별한 물건을 넣고 중복 텍스트의 일부를 제거

따라서 : DoiGraphNode, ResourceNode, JavaResourceNode, GraphNodeWithPath

프로 : 쓰기 및 콘을 읽을 그렇게 많이하지 않음 : 다른 이름

당신이 원하는대로
4

이름을 옵션보다 아마 더 유행 옵션 3을 사용하고 내 경험에서 다른 사람의 코드 옵션 2를 찾고 있습니다.

이름을 지정하기가 어렵거나 모호한 경우에는 클래스가 너무 많이 수행하고 있다는 신호입니다 (단일 책임 원칙).

명명 충돌을 피하려면 네임 스페이스를 적절하게 선택하십시오.

Personnally, 나는 3 이상이 논리적으로 상속의 개념에서 다음 3

+1

세 번째 옵션도 선택했습니다. 처음 두 가지 경우에는 "구불 구불 한 긴 이름의 미로"로 끝날 위험이 있습니다. 어려움을 겪고 있거나 어떤 개념이 어떤 이름과 일치 하는지를 기억하는 경우도 있습니다. 22 feb. 092009-02-22 08:52:59


5

사용과 충돌 할 수 있습니다, 매우 일관성이 이러다 * p를, 같은데, 그것은 주관적인 것입니다. 중요한 것은 각 클래스가 나타내는 것을 명확히하고 이름이 상속 관계가 의미가 있어야한다는 것입니다. 그래도 실제로 이름에서 관계를 인코딩하는 것이 중요하다고 생각하지 않습니다. 그것이 문서화를위한 것입니다. (그리고 당신의 이름이 객체에 대해 적절하다면 사람들은 무엇으로부터 상속 받는지에 대해 좋은 추측을 할 수 있어야합니다). 그것은 가치가 무엇인지에 대한

, 나는 일반적으로 그들이 무엇을 위해 1


0

옵션을 사용하십시오. 인터페이스 나 클래스를 전문적으로 다루기 때문에 이름은 더 이상 기본 구현 (존재하는 경우)을 사용하지 않는다는 것을 보여 주어야합니다.

클래스가 상속하는 것을 볼 수있는 다양한 도구가 있으므로 클래스의 실제 기능을 나타내는 간결한 이름은 너무 많은 유형 정보를 이름에 채우는 것보다 멀리 갈 것입니다.


2

코딩 표준 문서에서 몇 가지 지침을 찾을 수 있습니다. 예를 들어 C# here에 대한 IDesign 문서가 있습니다.

개인적으로 나는 옵션 2를 선호합니다. 일반적으로 .NET Framework에서 해당 개체의 이름을 지정하는 방식입니다. 예를 들어 속성 ​​클래스를 살펴보십시오. 그것들은 모두 Attribute (TestMethodAttribute)로 끝납니다. EventHandler도 마찬가지입니다. OnClickEventHandler는 Click 이벤트를 처리하는 이벤트 핸들러에 권장되는 이름입니다.

나는 보통 내 자신의 코드와 인터페이스를 디자인 할 때 이것을 따르려고합니다. 따라서 IUnitWriter는 StringUnitWriter 및 DataTableUnitWriter를 생성합니다. 이 방법은 항상 기본 클래스가 무엇인지 알고 자연스럽게 읽습니다. 자체 문서화 코드는 모든 애자일 개발자의 최종 목표이므로 잘 작동하는 것 같습니다!


1

일반적으로 옵션 1과 비슷한 이름을 사용합니다. 특히 클래스가 다 변수로 사용될 때 특히 그렇습니다. 내 추론은 가장 중요한 정보 비트가 먼저 나열된다는 것입니다. (즉, 하위 클래스가 기본적으로 조상 인 것을 의미합니다. 확장자가 '추가됨'). 클래스 이름 목록을 정렬 할 때 관련 클래스가 함께 나열되기 때문에이 옵션이 마음에 든다. 즉, 일반적으로 번역 단위 (파일 이름)의 이름을 과 동일하게 지정하면 관련 클래스 파일이 자연스럽게 함께 나열됩니다. 마찬가지로 증분 검색에 유용합니다.

프로그래밍 경력 초기에 옵션 2를 사용하는 경향이 있지만, 나는 그것이 '불일치'하다고 말하고 매우 직관적으로 보이지 않기 때문에 지금 피하는 것이 좋습니다.

서브 클래스가 상당한 확장 또는 스펙을 제공하거나 이름이 다소 긴 경우에는 종종 옵션 3을 사용합니다. 예를 들어 는 내 파일 시스템 이름 클래스는 문자열 에서 유래하지만 그들은 크게 String 클래스를 확장하고 상당히 다른 사용/의미가 있습니다 : 문자열에서 파생

Directory_entry_name 광범위한 기능을 추가합니다. Directory_entry_name에서 파생 된 File_name은 다소 특수화 된 기능을 가지고 있습니다. Directory_entry_name에서 파생 된 Directory_name에는 다소 특수화 된 기능이 있습니다.

옵션 1과 함께, 나는 일반적으로 인터페이스 클래스에 대해 규정되지 않은 이름을 사용합니다. 예를 들어 내가 클래스 interence 체인이있을 수 있습니다 :

  • 텍스트 (인터페이스)
  • Text_abstract (추상 (기본) 일반화 클래스)
  • Text_ASCII
  • Text_unicode (코딩 ASCII에 대한 구체적인 구상 클래스) (유니 코드 코딩과 관련된 구체적인 클래스)

오히려 인터페이스와 추상 기본 클래스가 자동으로 정렬 된 목록에서 처음 나타나는 것처럼 보입니다.