C # 클래스 명명 규칙 : BaseClass 또는 ClassBase 또는 AbstractClass


117

기본 클래스 이름 지정에 권장되는 접근 방식은 무엇입니까? 유형 이름 앞에 " Base "또는 " Abstract "를 붙입니까? 아니면 "Base"를 접미사로 붙이 겠습니까?

다음을 고려하세요:

유형 : ViewModel예 : MainViewModel , ReportViewModel

기본 클래스 : BaseViewModel또는 ViewModelBase또는AbstractViewModel

다음 사항도 고려하십시오.

유형 : Product예 : VirtualProduct , ExpiringProduct

기본 클래스 : BaseProduct또는 ProductBase또는AbstractProduct

어느 것이 더 표준이라고 생각하십니까?

class Entity : EntityBase
{
}

또는

class Entity : BaseEntity
{
}


답변:


90

예를 들어 기본 접미사와 프레임 워크의 사례가있다 System.Configuration.Provider.ProviderBase, System.Web.SessionState.SessionStateStoreProviderBase.

그러나 결코 프레임 워크의 모든 추상 기본 클래스는이 규칙을 따릅니다 (예를 들어 System.Data.Common.DbParameter, System.Data.Common.DbCommand).

개인적으로 나는 그것이 추상 클래스라는 사실을 강조하고 싶지 않고 클래스의 사용자가 이름이 구체적인 구현을 나타내는 것으로 기대할 수 있다고 생각 하지 않는 한 접미사 사용을 피할 것입니다.


" 클래스가 공용 API에서 사용되도록 의도 된 경우 접미사로 Avoid기본 클래스 이름 지정 Base." 프레임 워크 디자인 지침, 페이지 174
Yousha Aleayoub

47

위의 어느 것도 없습니다. 기본 클래스가 제공하는 목적을 고려하십시오. 이름을 지정하십시오. 예를 들어, Automobile and Bicycle의 기본 클래스는 Vehicle이 될 수 있습니다.

한 클래스의 기본 클래스를 갖기 위해 기본 클래스를 만들고 그 이외의 목적이나 이유가 없다면 아마도 뭔가 잘못하고있을 것입니다.


15
항상 그런 것은 아니며 프레임 워크에서 많은 Base * 클래스를 찾을 수 있습니다. CollectionBase, DictionaryBase .... etc
Chad Grant

1
현실 세계의 개체가 인공물에 정확히 맞아야한다는 점이 좋습니다. 공유지의 추상화는 차량과 같은 기반이어야하며 세부 사항은 뒤쳐 져야하지만 정확해야합니다.
ruslander

45
"Base"접미사가있는 .NET Framework의 일부 클래스는 버전 1.0 이전에 이름이 지정되었으며 Microsoft는 더 이상 이러한 규칙을 따르지 않습니다 ....하지만 지금은 이름을 변경할 수 없습니다. Microsoft의 Framework Design Guidelines 책, 섹션 6.2 (기본 클래스를 다룹니다)는 "Base"접미사를 사용하지 않도록 특별히 권장합니다.
Warren Rumak

5
여러 회사에서 여러 OO 언어에서 가장 자주 사용되는 관행은 "Base"가 직접 사용되지 않고 상속 만되는 기본 클래스를 지정한다는 것입니다. 예를 들어 "Vehicle"이라는 클래스는 사용할 수 있고 "구동"할 수있는 것처럼 들립니다. 자체적으로 차량이라고 주장합니다. 그러나 기본 클래스의 이름이 "Vehicle Parts", "Vehicle Essentials"또는 "Vehicle Kit"인 경우 직접 사용할 수있는 것이 아니라 다양한 차량의 기본 클래스라는 것을 알고 있습니다.
Slipp D. Thompson 2014

4
Warren (Microsoft Framework Design Guidelines book, section 6.2 on Base Classes : msdn.microsoft.com/en-us/library/ms229003(v=vs.110).aspx) 에서 언급했듯이 Base 접미사를 피하라고 말합니다. "AVOID naming 클래스가 공용 API에서 사용하도록 의도 된 경우 "Base"접미사가있는 기본 클래스. "
cwills

5

가상 기본 클래스에 대해 이야기하는 경우 Microsoft의 표준은 ClassnameBase (CollectionBase와 유사)입니다.


3

나는 그것이 선택의 문제라고 생각합니다. 많은 기본 클래스를 만드는 경우 항상 BaseClassname을 사용하는 것이 더 낫습니다. 그러면 Base를 입력하고 나머지 도움을 받아 사용할 수있는 기본 클래스를 항상 찾을 수 있기 때문입니다. Intellisense. 20 개의 Base 클래스가 있고 Base를 접미사로 추가했는데 기본 클래스의 이름이 무엇인지 잊어 버린 경우 어떻게해야합니까? VS에서 먼저 클래스 다이어그램을 만들고 사용 가능한 기본 클래스를 확인 하시겠습니까? 하나 또는 두 개의 클래스 일 때 ClassBase라는 이름을 지정하는 것이 좋습니다.

GetItems와 ItemsGet 함수 간의 결정도 마찬가지입니다. 가독성을 위해 최소한 말하고 싶습니다-GetItems로 가십시오. 규칙을 따르십시오 :)


1
'Base'클래스는 OO 해킹 입니다. Paul의 의견을 참조하십시오 . 종종 도움이되고 때로는 필요하지만 여전히 해킹입니다. 사용 가능한 모든 기본 클래스를 찾을 필요가 있다고 느끼면 그 이유는 무엇입니까? 그들은 모두 함께 볼 필요가있는 무엇을 공유합니까? 대답은 더 나은 이름을 찾는 데 도움이 될 수 있습니다.
Iain

1
@Abhishek :에 대한 비유는 GetItems작동하지 않습니다.“Get”은 동사 일 뿐이므로 영어 문법적 의미를 접두사로만 사용하는 반면“Base”는 형용사 (접두사) 또는 명사 (접미사)로 작동합니다.
Slipp D. Thompson 2014

1
@Iain : 사람들이 클래스 이름에 "Base"를 사용하는 이유는 모든 기본 클래스를 찾을 수 없기 때문입니다. 근거는 그 반대에 가깝습니다. "I"접두사가 인터페이스를 채택하는 클래스와 구별하는 방식에서 많은 관련 클래스의 기본 클래스가 그들과 눈에 띄도록하기 위해서입니다. 기본 클래스가 자체적으로 작동하지 않을 때 가장 자주 사용되는 "Base"접두사 / 접미사를 보았습니다 abstract. 강제 .
Slipp D. Thompson 2014

@ SlippD.Thompson 네, '모든 수업 찾기'는 Abhishek에 대한 응답이었습니다. 나는 폴의 대답에 답했다.
Iain

2

우리는 BaseEntity를 사용하지만 자신이 선호하는 것으로 생각합니다. 나는 자주 다른 것을 본다.

컨텍스트 내에서 일관성을 유지하십시오. 프로젝트, 네임 스페이스 또는 가능한 경우 팀이 되십시오. 다른 규칙은 나쁜 규칙 IMHO보다 나쁩니다.


2

개인적으로 base라는 단어를 추가하지 않는 것이 좋습니다. 언제 코드를 변경해야하는지 알 수 없으며 더 이상 기본 개체가 아닙니다. 즉, 과거에이 작업을 수행했으며 앞에 Base라는 단어를 접두사로 붙였습니다. 더 잘 흐르는 것 같습니다.


-1

BaseEntity는 낙타 케이스 (strName, bseEntity)와 매우 유사합니다. 주제를 먼저 정의하기 때문에 EntityBase를 사용하면 기능을 더 빨리 식별 할 수 있습니다.


10
낙타 케이스가 아닌 헝가리 표기법에 대해 이야기하고 있습니다. 헝가리 표기법은 우연히 낙타 케이스 였지만 완전히 다른 것입니다.
sliderhouserules

-5

이름을 지을 때 항상 알파벳순으로 생각하십시오. 저는 SQL 서버를 보는 것을 정말 좋아하지 않으며 모든 저장 프로 시저의 이름은 usp [something]입니다. 같은 줄에서 Get 및 Set를 함수의 선행 이름으로 과도하게 사용하지 마십시오. GetItems 또는 PlaceOrder 대신 ItemsGet 또는 OrderPlace로 이름을 지정하는 것을 고려하십시오.

따라서 일반적으로 ClassnameBase / EntityBase가 더 나은 선택이 될 것입니다.


9
동의하지 않는다; 가독성. GetItems는 ItemsGet보다 훨씬 더 의미가 있습니다.
Nathan Ridley

2
동의하지 않습니다 ... 위와 같은 이유 ..하지만 투표 할 수 없습니다 ... :(
Mugunth

다른 주석과 달리 marcc는 itemgsGet ()과 같은 것을 제안하지 않았습니다. 그는 items ()를 썼습니다.
Hontvári Levente 2015
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.