추상 클래스에 대한 명명 규칙


102

한때 Microsoft가 추진 한 지침은 추상 클래스에 "Base"접미사를 추가하여 그것이 추상이라는 사실을 없애는 것이 었습니다. 따라서, 우리가 같이 수업을 System.Web.Hosting.VirtualFileBase, System.Configuration.ConfigurationValidatorBase, System.Windows.Forms.ButtonBase, 그리고, 물론, System.Collections.CollectionBase.

하지만 최근에 프레임 워크의 많은 추상 클래스가이 규칙을 따르지 않는 것 같습니다. 예를 들어 다음 클래스는 모두 추상이지만이 규칙을 따르지 않습니다.

  • System.DirectoryServices.ActiveDirectory.DirectoryServer

  • System.Configuration.ConfigurationElement

  • System.Drawing.Brush

  • System.Windows.Forms.CommonDialog

그리고 그것이 바로 제가 몇 초 안에 드럼을 울릴 수있는 것입니다. 그래서 나는 내가 미쳤지 않았는지 확인하기 위해 공식 문서의 내용을 찾아 보았다. 클래스 라이브러리 개발을위한 디자인 지침 에서 MSDN 의 클래스, 구조체 및 인터페이스 이름을 찾았습니다 . 이상하게도 추상 클래스 이름 끝에 "Base"를 추가하는 지침에 대한 언급이 없습니다. 그리고이 가이드 라인은 프레임 워크 버전 1.1에 더 이상 제공되지 않습니다.

그래서 나는 그것을 잃고 있습니까? 이 지침이 존재 했습니까? 아무 말없이 그냥 버려 졌나요? 지난 2 년 동안 아무것도없이 긴 클래스 이름을 혼자서 만들었습니까?

누군가 여기에 뼈를 던졌습니다.

업데이트 나는 미쳤지 않습니다. 가이드 라인이 존재했습니다. Krzysztof Cwalina는 2005 년에 그것에 대해 불평합니다.


이 기사를 읽으면 Krzysztof는 "권장 사항 집합"을받는 것에 대해 불평 할뿐입니다. 이러한 권장 사항이 반드시 Microsoft의 공식적인 것은 아닙니다. 나는 MS 지침을 읽고 그들이 이것에 대해 권장하는 것을 본 기억이 있습니다.
John Rudy

1
나는 그 특정 기사를 본 기억이 처음이지만 그것을 읽었습니다. 실제로는 안심입니다. 나는 실제로 추천을 좋아 한 적이 없습니다. 여기서부터 많은 으르렁 거리는 소리를 구할 수 있습니다. :)
Mike Hofer

답변:



19

또한 추상 클래스에 사용할 정적 멤버가 몇 개 있으면 'Base'가 추악해질 수 있습니다.


14

그런 지침이 기억 나지 않습니다. 나는 당신이 의미있는 이름을 사용해야한다고 믿습니다. 때때로 추상 클래스는 접미사가 있어야한다고 생각하는 일부 클래스 (도구로서)에 공통 기능을 제공하도록 설계되었습니다. 그러나 어떤 경우에는 완전하지 않은 다형성 계층의 기반으로 사용하고 싶을 수 있습니다. 그런 경우에는 일반 클래스처럼 이름을 지정하는 것이 좋습니다.

보시다시피 ButtonBase를 매개 변수로 받아들이는 메서드를 선언하지 않을 것입니다. 하위 클래스에 최소한의 기능을 제공하도록 설계되었습니다. 그러나 ConfigurationElement를 다른 형태를 가지고 있지만 그 자체로는 완전하지 않은 엔티티로 취급 할 수 있습니다 (따라서 추상적입니다).


11

특히 누군가가 구체적인 구현을 만들기 위해 확장 할 수 있도록 구체적인 클래스와 추상 클래스를 모두 제공 할 때 Base가 여전히 필요합니다.
예 : Controller 및 ControllerBase (실제로 Controller도 추상적이지만 ControllerBase보다 훨씬 더 많은 기능을 제공함)

기본 접미사는 인터페이스에 대해 프로그래밍 할 때 추악하므로 추상 클래스가 인터페이스처럼 주로 사용되는 경우에는 사용하지 않는 Microsoft 지침이 적용된다고 생각합니다. 아마도 Public API가 의미하는 바일 것입니다.

요점은 Base 접미사를 사용하는 것보다 더 나은 대안이없는 경우가 있다는 것입니다.


4
나는 동의한다. 다른 소스의 콘텐츠를 구문 분석하는 피드 시스템에서 일하고 있습니다. 우리는 공개 API라는 이름의 인터페이스에서 사용 IFeedParser , 내부적으로 우리라는 이름의 공통 기능을 포함하는 기본 추상 클래스를 사용 BaseFeedParser
루이 Jarimba

1

나는 기본 접미어를 피하려는 경향을 이해하지만 일부 접미어 의 필요성도 이해합니다 . 이제이 기사 의 주석 에서는 "유형"을 접미사로 사용하지 않는 것보다 두 번째 선택으로 사용할 것을 제안합니다. 나는 이것이 헷갈 린다고 생각하지만, "그런 비 커밋적인 단어는 그것이 커밋되지 않은 클래스임을 나타내는 경향이있다"는 생각이 나에게 붙어 있었다.

대안으로 : 나는 객체를 "특정 인종 또는 가족의 또는 소속"( 위키 낱말 사전 : -kind )으로 나타 내기 위해 접미사로 "종류"를 사용하는 것을 선호합니다 .

예 : DataProvider그리고 ReflectiveDataProvider둘 다DataProviderKind

예를 들어 "canis lupus"가 "Canoidea"과에 속하는 Biology에서 영감을 얻었으며, 이는 매우 대략적으로 "dog-ish"로 번역됩니다.


1

Microsoft는 다음과 같이 말합니다.

https://docs.microsoft.com/en-us/dotnet/standard/design-guidelines/names-of-classes-structs-and-interfaces

"✓ 파생 클래스의 이름을 기본 클래스 이름으로 끝내는 것을 고려하십시오. 이것은 매우 읽기 쉽고 관계를 명확하게 설명합니다. 코드에서 이에 대한 몇 가지 예는 다음과 같습니다. 예외의 일종 인 ArgumentOutOfRangeException 및 그러나이 가이드 라인을 적용 할 때는 합리적인 판단을하는 것이 중요합니다. 예를 들어, Button 클래스는 Control이 이름에 나타나지 않지만 일종의 Control 이벤트입니다. "

일반적으로 이것은 이름에 "Base"를 사용하는 것을 암시 적으로 배제합니다.

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