Convenzione di denominazione delle classi C #: BaseClass o ClassBase o AbstractClass


117

Qual è l'approccio consigliato per denominare le classi di base? Sta anteponendo al nome del tipo " Base " o " Abstract " o dovremmo semplicemente aggiungere " Base " come suffisso?

Considera quanto segue:

tipo: ViewModelad esempio MainViewModel , ReportViewModel

classe base: BaseViewModelo ViewModelBaseoAbstractViewModel

Considera anche:

tipo: Productad es. VirtualProduct , ExpiringProduct

classe base: BaseProducto ProductBaseoAbstractProduct

Quale pensi sia più standard?

class Entity : EntityBase
{
}

o

class Entity : BaseEntity
{
}


possibile duplicato di Using "Base" in un nome di classe
nawfal

Risposte:


90

Ci sono esempi nel Framework con il suffisso Base, ad esempio System.Configuration.Provider.ProviderBase,System.Web.SessionState.SessionStateStoreProviderBase .

Ma non tutte le classi base astratte nel Framework seguono questa convenzione (ad es System.Data.Common.DbParameter.System.Data.Common.DbCommand ).

Personalmente eviterei di usare il suffisso a meno che non volessi sottolineare il fatto che si tratta di una classe astratta e ritenuto che altrimenti gli utenti della classe potrebbero aspettarsi che il nome indichi un'implementazione concreta.


" Avoiddenominazione delle classi base con un Basesuffisso se la classe è destinata all'uso nelle API pubbliche." Framework Design Guidelines, pagina 174
Yousha Aleayoub

47

Nessuno dei precedenti. Considera quale scopo fornisce la tua classe base; chiamalo così. Ad esempio, la classe base di Automobile e Bicicletta potrebbe essere Veicolo.

Se stai creando classi base solo per avere una classe base di una classe e senza scopo o motivo diverso da quello, probabilmente stai facendo qualcosa di sbagliato.


15
Non è sempre così e troverai molte classi Base * nel framework. CollectionBase, DictionaryBase ... ecc.
Chad Grant,

1
È un buon punto che gli oggetti del mondo reale dovrebbero adattarsi esattamente agli artefatti. L'astrazione dei beni comuni dovrebbe essere basata su Veicolo, le specifiche devono andare dietro ma anche esatte.
ruslander

45
Vale la pena notare che alcune delle classi in .NET Framework con un suffisso "Base" erano denominate prima della versione 1.0 e Microsoft non segue più quelle convenzioni ... ma non possono cambiare i nomi ora. Il libro di Microsoft Framework Design Guidelines, sezione 6.2 (che copre le classi di base), sconsiglia specificamente di utilizzare il suffisso "Base".
Warren Rumak

5
La pratica che ho visto usata più spesso in un certo numero di linguaggi OO in un certo numero di aziende è che "Base" designa classi base che devono essere ereditate solo da - non usate direttamente. Con il tuo esempio, una classe denominata "Veicolo" suona come qualcosa che può essere utilizzato e "guidato" - afferma di essere un veicolo. Tuttavia, se la classe base fosse denominata "Parti del veicolo" o "Elementi essenziali del veicolo" o "Kit del veicolo", sappiamo che non è qualcosa di direttamente utilizzabile, ma una base per una varietà di veicoli.
Slipp D. Thompson

4
Come menzionato da Warren, libro delle linee guida di progettazione di Microsoft Framework, sezione 6.2 sulle classi di base: msdn.microsoft.com/en-us/library/ms229003(v=vs.110).aspx Dicono di evitare il suffisso di base: "EVITARE la denominazione classi base con un suffisso "Base" se la classe è destinata all'uso in API pubbliche. "
cwills

5

Se stai parlando di classi di base virtuali, lo standard di Microsoft è ClassnameBase (come CollectionBase.)


3

Penso che sia una questione di scelta. Direi che se stai creando molte classi base, forse è meglio andare sempre con BaseClassname perché in questo modo puoi SEMPRE scoprire quali classi base puoi iniziare a utilizzare semplicemente digitando Base e ottenendo il resto dell'aiuto da Intellisense. E se avessi 20 classi Base e avessi aggiunto Base come suffisso e avessi dimenticato qual era il nome della classe base? Vuoi creare prima un diagramma delle classi da VS e scoprire quali classi di base sono disponibili? Va bene chiamarli ClassBase quando sono solo una o due classi.

Lo stesso vale per la decisione tra la funzione GetItems e ItemsGet. Direi almeno per motivi di leggibilità: scegli GetItems. Segui le convenzioni :)


1
Le classi "Base" sono un hack OO, vedi il commento di Paul . Sono spesso utili e talvolta necessari, ma sono comunque un hack. Se senti il ​​bisogno di cercare tutte le classi base disponibili, perché? Cosa condividono che crea il tuo bisogno di vederli tutti insieme? La risposta potrebbe aiutarti a trovare una denominazione migliore.
Iain

1
@ Abhishek: L'analogia con GetItemsnon funziona - "Get" è solo un verbo e quindi ha senso grammaticale inglese solo come prefisso, mentre "Base" funziona sia come aggettivo (prefisso) che come sostantivo (suffisso).
Slipp D. Thompson

1
@Iain: La ragione per cui le persone usano "Base" nei nomi delle classi non è per essere in grado di trovare tutte le classi di base - la logica è più vicina all'opposto. È così che la classe base di un certo numero di classi correlate si distingue da esse, molto nel modo in cui il prefisso "I" è inteso a distinguere un'interfaccia dalle classi che la adottano. Ho visto il prefisso / suffisso "Base" utilizzato più spesso quando la classe di base non è funzionale da sola, astratto per uso previsto, indipendentemente da un valore applicato abstract.
Slipp D. Thompson

@ SlippD.Thompson sì, "trova tutte le classi" è stata una risposta ad Abhishek. Ho risposto alla risposta di Paul.
Iain

2

Usiamo BaseEntity, ma penso che sia una tua preferenza. Vedo spesso l'altro.

Sii coerente nel tuo contesto, che si tratti del tuo progetto, spazio dei nomi o, se possibile, del tuo team. Diverse convenzioni sono peggiori di una cattiva convenzione IMHO.


2

Personalmente, consiglierei di non aggiungere affatto la parola base. Non sai mai quando dovrai cambiare il codice e non sarà più l'oggetto di base. Detto questo, l'abbiamo fatto in passato, abbiamo anteposto la parola Base sul davanti. Sembra scorrere meglio.


-1

BaseEntity assomiglia molto al caso del cammello: strName, bseEntity. Preferisco EntityBase poiché definisce prima l'oggetto, il che ti aiuterà a identificare la sua funzione più rapidamente.


10
Stai parlando della notazione ungherese, non dell'involucro del cammello. La notazione ungherese per caso era a forma di cammello, ma sono cose completamente diverse.
sliderhouserules

-5

Pensa sempre all'alfabeto quando dai un nome alle cose. Non mi piace davvero guardare un server SQL e ogni procedura memorizzata si chiama usp [qualcosa]. Sulla stessa linea, non abusare di Get e Set come nomi iniziali per una funzione. Invece di GetItems o PlaceOrder, pensa a denominarli come ItemsGet o OrderPlace.

Quindi, in generale, ClassnameBase / EntityBase sarebbe una scelta migliore.


9
Disaccordo; Leggibilità. GetItems ha molto più senso di ItemsGet.
Nathan Ridley,

2
Non sono d'accordo ... stesso motivo di cui sopra .. ma non
posso

Contrariamente agli altri commenti, marcc NON ha suggerito qualcosa come itemgsGet (). Ha scritto articoli ().
Hontvári Levente
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.