Convenção de nomenclatura de classes C #: BaseClass, ClassBase ou AbstractClass

117

Qual é a abordagem recomendada para nomear classes base? É prefixar o nome do tipo com " Base " ou " Abstrato " ou apenas sufixá-lo com "Base"?

Considere o seguinte:

tipo: ViewModelpor exemplo , MainViewModel , ReportViewModel

classe base: BaseViewModelou ViewModelBaseouAbstractViewModel

Considere também:

tipo: Productpor exemplo , VirtualProduct , ExpiringProduct

classe base: BaseProductou ProductBaseouAbstractProduct

Qual você acha que é mais padrão?

class Entity : EntityBase
{
}

ou

class Entity : BaseEntity
{
}
Soni Ali
fonte

Respostas:

90

Há exemplos na quadro com o sufixo Base, por exemplo System.Configuration.Provider.ProviderBase, System.Web.SessionState.SessionStateStoreProviderBase.

Mas de forma alguma todas as classes básicas abstratas no Framework seguem essa convenção (por exemplo System.Data.Common.DbParameter, System.Data.Common.DbCommand).

Pessoalmente, eu evitaria usar o sufixo, a menos que quisesse enfatizar o fato de que é uma classe abstrata e sentir que, de outra forma, os usuários da classe podem esperar que o nome indique uma implementação concreta.

Joe
fonte
" Avoidnomeando classes base com um Basesufixo se a classe se destina ao uso em APIs públicas." Framework Design Guidelines, página 174
Yousha Aleayoub
47

Nenhuma das acima. Considere o propósito que sua classe base oferece; nomeie assim. Por exemplo, a classe base de Automóvel e Bicicleta pode ser Veículo.

Se você está criando classes básicas apenas para ter uma classe básica de uma classe, e sem nenhum propósito ou razão além disso, provavelmente você está fazendo algo errado.

Paul Sonier
fonte
15
Nem sempre é o caso e você encontrará muitas classes Base * no framework. CollectionBase, DictionaryBase .... etc
Chad Grant
1
Bem, os objetos do mundo real devem caber exatamente nos artefatos. A abstração dos bens comuns deve ser baseada como um veículo, os detalhes devem ser posteriores, mas também exatos.
ruslander
45
É importante notar que algumas das classes no .NET Framework com um sufixo "Base" foram nomeadas antes da versão 1.0 e a Microsoft não segue mais essas convenções ... mas eles não podem alterar os nomes agora. O livro Framework Design Guidelines da Microsoft, seção 6.2 (que cobre as classes básicas), recomenda especificamente o uso do sufixo "Base".
Warren Rumak
5
A prática que tenho visto ser usada com mais frequência em várias linguagens OO em várias empresas é que "Base" designa classes básicas que devem ser herdadas apenas - não usadas diretamente. Com o seu exemplo, uma classe chamada “Veículo” soa como algo que pode ser usado e “conduzido” - ela afirma ser um veículo. No entanto, se a classe base fosse denominada “Peças do veículo” ou “Fundamentos do veículo” ou “Kit do veículo” - sabemos que não é algo diretamente utilizável, mas uma base para uma variedade de veículos.
Slipp D. Thompson
4
Conforme mencionado por Warren, livro Microsoft Framework Design Guidelines, seção 6.2 em classes base: msdn.microsoft.com/en-us/library/ms229003(v=vs.110).aspx Eles dizem para evitar o sufixo base: "EVITAR nomenclatura classes base com um sufixo "Base" se a classe se destinar ao uso em APIs públicas. "
cwills
5

Se você está falando sobre classes base virtuais, o padrão da Microsoft é ClassnameBase (como CollectionBase).

Sim - aquele Jake.
fonte
3

Eu acho que é uma questão de escolha. Eu diria que se você está criando muitas classes base, então talvez seja melhor ir com BaseClassname sempre porque dessa forma você SEMPRE poderá descobrir quais classes base você pode começar a usar apenas digitando Base e obtendo o resto da ajuda de Intellisense. E se você tivesse 20 classes base e incluísse Base como sufixo e esquecesse qual era o nome da classe base? Você deseja criar um diagrama de classes primeiro no VS e descobrir quais classes base estão disponíveis? Não há problema em nomeá-los ClassBase quando são apenas uma ou duas classes.

O mesmo vale para a decisão entre a função GetItems e ItemsGet. Eu diria que pelo menos para facilitar a leitura - vá para GetItems. Siga as convenções :)


fonte
1
Classes 'básicas' são um hack OO, veja o comentário de Paul . Eles geralmente são úteis e às vezes necessários, mas ainda são um hack. Se você sente necessidade de procurar todas as classes base disponíveis, por que isso? O que eles compartilham que cria sua necessidade de vê-los todos juntos? A resposta pode ajudá-lo a encontrar um nome melhor.
Iain
1
@Abhishek: A analogia com GetItemsnão funciona— “Get” é apenas um verbo e, portanto, só faz sentido gramatical em inglês como um prefixo, enquanto “Base” funciona como um adjetivo (prefixo) ou substantivo (sufixo).
Slipp D. Thompson
1
@Iain: O motivo pelo qual as pessoas usam “Base” em nomes de classes não é para poder encontrar todas as classes básicas - a lógica é mais próxima do oposto. É para que a classe base de uma série de classes relacionadas se destaque delas, da mesma forma que o prefixo “I” se destina a distinguir uma interface das classes que a adotam. Já vi o prefixo / sufixo “Base” usado com mais frequência quando a classe base não é funcional por conta própria - abstrato pelo uso pretendido, independentemente de um imposto abstract.
Slipp D. Thompson
@ SlippD.Thompson sim, 'encontre todas as classes' foi uma resposta a Abhishek. Eu respondi na resposta de Paul.
Iain
2

Usamos BaseEntity, mas acho que é sua preferência. Freqüentemente vejo o outro.

Basta ser consistente com seu contexto, seja seu projeto, namespace ou, se possível, sua equipe. Diferentes convenções são piores do que uma má convenção IMHO.

Gary.Ray
fonte
2

Pessoalmente, eu não recomendo adicionar a palavra base. Você nunca sabe quando terá que alterar o código e ele não será mais o objeto base. Dito isso, já fizemos isso no passado, prefixamos a palavra Base na frente. Parece fluir melhor.

kemiller2002
fonte
-1

BaseEntity se parece muito com camel case - strName, bseEntity. Eu escolheria EntityBase, pois define o assunto primeiro, o que ajudará a identificar sua função mais rapidamente.

Mike Robinson
fonte
10
Você está falando sobre notação húngara, não invólucro de camelo. A notação húngara por acaso é feita de camelo, mas são coisas completamente diferentes.
sliderhouserules
-5

Sempre pense em colocar em ordem alfabética ao nomear as coisas Eu realmente não gosto de olhar para um servidor SQL e todo procedimento armazenado é denominado usp [algo]. Na mesma linha, não abuse de Get e Set como nomes principais para uma função. Em vez de GetItems ou PlaceOrder, pense em nomeá-los como ItemsGet ou OrderPlace.

Portanto, em geral, ClassnameBase / EntityBase seria uma escolha melhor.

marcc
fonte
9
Discordo; Legibilidade. GetItems faz muito mais sentido do que ItemsGet.
Nathan Ridley
2
Discordo ... mesma razão acima .. mas não foi possível votar contra ... :(
Mugunth
Ao contrário dos outros comentários, marcc NÃO sugeriu algo como itemgsGet (). Ele escreveu itens ().
Hontvári Levente