Convention de dénomination des classes C #: s'agit-il de BaseClass ou ClassBase ou AbstractClass

117

Quelle est l'approche recommandée pour nommer les classes de base? Est-ce qu'il préfixe le nom du type avec " Base " ou " Abstract " ou devrions-nous simplement le suffixer avec "Base"?

Considérer ce qui suit:

de type: ViewModelpar exemple MainViewModel , ReportViewModel

classe de base: BaseViewModelou ViewModelBaseouAbstractViewModel

Considérez également:

type: Productpar exemple VirtualProduct , ExpiringProduct

classe de base: BaseProductou ProductBaseouAbstractProduct

Selon vous, lequel est le plus standard?

class Entity : EntityBase
{
}

ou

class Entity : BaseEntity
{
}
Soni Ali
la source

Réponses:

90

Il existe des exemples dans le cadre avec le suffixe de base, par exemple System.Configuration.Provider.ProviderBase, System.Web.SessionState.SessionStateStoreProviderBase.

Mais en aucun cas toutes les classes de base abstraites du Framework ne suivent cette convention (par exemple System.Data.Common.DbParameter, System.Data.Common.DbCommand).

Personnellement, j'éviterais d'utiliser le suffixe à moins que je ne veuille souligner le fait qu'il s'agit d'une classe abstraite et que je pense que sinon les utilisateurs de la classe pourraient s'attendre à ce que le nom indique une implémentation concrète.

Joe
la source
" Avoidnommer les classes de base avec un Basesuffixe si la classe est destinée à être utilisée dans les API publiques." Framework Design Guidelines, page 174
Yousha Aleayoub
47

Aucune de ces réponses. Considérez le but de votre classe de base; nommez-le comme ça. Par exemple, la classe de base Automobile et Vélo pourrait être Véhicule.

Si vous créez des classes de base juste pour avoir une classe de base d'une classe, et sans but ou raison autre que cela, vous faites probablement quelque chose de mal.

Paul Sonier
la source
15
Ce n'est pas toujours le cas et vous trouverez de nombreuses classes Base * dans le framework. CollectionBase, DictionaryBase .... etc
Chad Grant
1
Bon point, les objets du monde réel doivent correspondre exactement aux artefacts. L'abstraction des communs doit être basée comme Véhicule, les spécificités doivent passer derrière mais aussi exactes.
ruslander
45
Il convient de noter que certaines des classes du .NET Framework avec un suffixe «Base» ont été nommées avant la version 1.0 et Microsoft ne suit plus ces conventions ... mais ils ne peuvent pas changer les noms maintenant. Le livre Framework Design Guidelines de Microsoft, section 6.2 (qui couvre les classes de base), recommande spécifiquement de ne pas utiliser le suffixe «Base».
Warren Rumak
5
La pratique que j'ai vue le plus souvent utilisée dans un certain nombre de langages OO dans un certain nombre d'entreprises est que «Base» désigne des classes de base qui ne sont destinées qu'à être héritées - pas à être utilisées directement. Avec votre exemple, une classe nommée «Véhicule» ressemble à quelque chose qui peut être utilisé et «conduit» - elle prétend être un véhicule. Cependant, si la classe de base était nommée «Pièces de véhicule» ou «Essentiels du véhicule» ou «Kit de véhicule» - nous savons que ce n'est pas quelque chose directement utilisable, mais une base pour une variété de véhicules.
Slipp D.Thompson
4
Comme mentionné par Warren, livre Microsoft Framework Design Guidelines, section 6.2 sur les classes de base: msdn.microsoft.com/en-us/library/ms229003(v=vs.110).aspx Ils disent d'éviter le suffixe de base: «ÉVITER la dénomination classes de base avec un suffixe "Base" si la classe est destinée à être utilisée dans les API publiques. "
cwills
5

Si vous parlez de classes de base virtuelles, la norme de Microsoft est ClassnameBase (comme CollectionBase.)

Oui - ce Jake.
la source
3

Je pense que c'est une question de choix. Je dirais que si vous créez beaucoup de classes de base, il est peut-être préférable d'utiliser toujours BaseClassname parce que de cette façon, vous pouvez TOUJOURS savoir quelles classes de base vous pouvez commencer à utiliser en tapant simplement Base et en obtenant le reste de l'aide. Intellisense. Et si vous aviez 20 classes de base et que vous ajoutiez Base comme suffixe et que vous oubliez quel était le nom de la classe de base? Voulez-vous d'abord créer un diagramme de classes à partir de VS et découvrir quelles classes de base sont disponibles? C'est bien de les nommer ClassBase quand il ne s'agit que d'une ou deux classes.

Il en va de même pour la décision entre GetItems et la fonction ItemsGet. Je dirais que pour des raisons de lisibilité au moins - optez pour GetItems. Suivez les conventions :)


la source
1
Les classes 'Base' sont un hack OO, voir le commentaire de Paul . Ils sont souvent utiles et parfois nécessaires, mais ils sont toujours un hack. Si vous ressentez le besoin de rechercher toutes les classes de base disponibles, pourquoi? Que partagent-ils qui crée votre besoin de les voir tous ensemble? La réponse pourrait vous aider à trouver une meilleure dénomination.
Iain
1
@Abhishek: L'analogie avec GetItemsne fonctionne pas - «Get» n'est qu'un verbe et n'a donc qu'un sens grammatical anglais comme préfixe, alors que «Base» fonctionne à la fois comme adjectif (préfixe) ou comme nom (suffixe).
Slipp D.Thompson
1
@Iain: La raison pour laquelle les gens utilisent «Base» dans les noms de classe n'est pas d'être en mesure de trouver toutes les classes de base - la logique est plus proche du contraire. C'est pour que la classe de base d'un certain nombre de classes apparentées se démarque, tout comme le préfixe «I» est censé distinguer une interface des classes qui l'adoptent. J'ai vu le préfixe / suffixe «Base» utilisé le plus souvent lorsque la classe de base n'est pas fonctionnelle en elle-même - abstraite par usage prévu, indépendamment de l'application abstract.
Slipp
@ SlippD.Thompson ouais, «trouver toutes les classes» était une réponse à Abhishek. J'ai répondu sur la réponse de Paul.
Iain
2

Nous utilisons BaseEntity, mais je pense que c'est votre propre préférence. Je vois souvent l'autre.

Soyez juste cohérent dans votre contexte, que ce soit votre projet, votre espace de noms ou si possible, votre équipe. Différentes conventions sont pires qu'une mauvaise convention IMHO.

Gary Ray
la source
2

Personnellement, je recommanderais de ne pas ajouter du tout le mot base. Vous ne savez jamais quand vous devrez changer le code et ce ne sera plus l'objet de base. Cela étant dit, nous l'avons fait dans le passé, nous avons préfixé le mot Base sur le devant. Cela semble mieux couler.

kemiller2002
la source
-1

BaseEntity ressemble beaucoup à camel case - strName, bseEntity. Je choisirais EntityBase car il définit d'abord le sujet, ce qui vous aidera à identifier sa fonction plus rapidement.

Mike Robinson
la source
10
Vous parlez de notation hongroise, pas de boyau camel. Il se trouve que la notation hongroise était simplement en chameau, mais ce sont des choses complètement différentes.
sliderhouserules
-5

Pensez toujours à classer par ordre alphabétique lorsque vous nommez des choses. Je n'aime vraiment pas regarder un serveur SQL et chaque procédure stockée est appelée usp [quelque chose]. Dans le même ordre d'idées, n'abusez pas de Get et Set comme noms principaux pour une fonction. Au lieu de GetItems ou PlaceOrder, pensez à les nommer ItemsGet ou OrderPlace.

Donc, en général, ClassnameBase / EntityBase serait un meilleur choix.

marcc
la source
9
Être en désaccord; Lisibilité. GetItems a beaucoup plus de sens que ItemsGet.
Nathan Ridley
2
Pas d'accord ... même raison que ci-dessus ... mais impossible de voter contre ...: (
Mugunth
Contrairement aux autres commentaires, marcc n'a PAS suggéré quelque chose comme itemgsGet (). Il a écrit des éléments ().
Hontvári Levente