Les conventions de nommage pour les classes abstraites
Je me souviens que, à un moment, la ligne directrice poussé par Microsoft a été d'ajouter de la "Base" suffixe de classe abstraite, pour éviter le fait que c'était abstrait. Par conséquent, nous avons des classes comme System.Web.Hosting.VirtualFileBase
, System.Configuration.ConfigurationValidatorBase
, System.Windows.Forms.ButtonBase
, et, bien sûr, System.Collections.CollectionBase
.
Mais j'ai remarqué que, de la fin, beaucoup de classes abstraites dans le Cadre ne semble pas être la suite de cette convention. Par exemple, les classes suivantes sont toutes abstrait, mais de ne pas suivre cette convention:
-
System.DirectoryServices.ActiveDirectory.DirectoryServer
-
System.Configuration.ConfigurationElement
-
System.Drawing.Brush
-
System.Windows.Forms.CommonDialog
Et c'est exactement ce que j'ai pu tambour en quelques secondes. Je suis donc allé chercher jusqu'à ce que la documentation officielle avait à dire, pour s'assurer que je n'étais pas folle. J'ai trouvé le Les noms de Classes, Structures, Interfaces sur MSDN à l' Les lignes Directrices de conception pour le Développement de Bibliothèques de Classe. Bizarrement, je ne trouve aucune mention de la directive pour ajouter de la "Base" à la fin d'une classe abstraite du nom. Et les lignes directrices ne sont pas disponibles pour la version 1.1 du Framework.
Alors, suis-je le perdre? A cette directive jamais exister? Il a simplement été abandonnée sans un mot? Ai-je été la création de longs noms de classe tout par moi-même depuis deux ans pour rien?
Quelqu'un me jeter un os ici.
Mise à jour
Je ne suis pas fou. La ligne directrice de l'existence. Krzysztof Cwalina saisines à ce sujet en 2005.
- Si vous lisez ce morceau, Krzysztof simplement se plaint d'avoir reçu "un ensemble de recommandations" -- pas nécessairement que ces recommandations ont été Microsoft-officiel. Je me souviens de la lecture de la MS de lignes directrices et de les voir recommandons à cet égard.
- Je l'ai fait lire, même si c'est la première fois que je me souviens jamais avoir vu l'article en question. C'est un soulagement, en fait. Je n'ai jamais réellement aimé la recommandation. Ça va me faire gagner beaucoup de grogne à partir d'ici. 🙂
Vous devez vous connecter pour publier un commentaire.
Dans Cadre Des Lignes Directrices De Conception p 174 états:
Aussi : http://blogs.msdn.com/kcwalina/archive/2005/12/16/BaseSuffix.aspx
Aussi, si la classe abstraite a quelques membres statiques qui sera utilisée la "Base" peut devenir laid.
Je ne me souviens pas d'une telle directive. Je crois que vous devriez utiliser l'appellation qui fait sens. Parfois, la classe abstraite est uniquement conçu pour fournir des fonctionnalités communes pour certaines classes (comme d'un outil), qui, je pense, devrait avoir le suffixe. Toutefois, dans certains cas, vous voulez l'utiliser comme la base d'un polymorphisme de la hiérarchie qui n'est pas complet en lui-même. Dans ces cas, je suggère de nommage comme une classe normale.
Comme vous le voyez, vous n'aurez probablement pas déclarer une méthode qui accepte un ButtonBase comme paramètre. Il est conçu pour fournir un minimum de fonctionnalités pour les sous-classes. Toutefois, vous pouvez traiter un
ConfigurationElement
comme une entité qui a des formes différentes, mais il n'est pas complet sur elle-même (et donc qu'elle est abstraite)Parfois de Base est toujours nécessaire, surtout quand vous offrira à la fois un béton de classe et une classe abstraite pour quelqu'un d'étendre à créer une mise en œuvre concrète.
par exemple, le Contrôleur et ControllerBase
(en fait, le Contrôleur est aussi abstrait, mais fournit signifigantly plus de fonctionnalités que ControllerBase)
Suffixe de la Base est laid lors de la programmation à l'encontre d'une interface, donc je pense que Microsoft directive de ne pas l'utiliser s'applique lorsque la classe abstraite est principalement utilisé comme une interface. Probablement ce qu'ils entendent par API Publique.
Le point est qu'il y a des cas où il n'y a pas de meilleure alternative à l'aide du suffixe de la Base.
Je comprends l'envie d'éviter de Base et le Suffixe, mais je comprends aussi le besoin de certains Suffixe. Maintenant, un Commentaire de cet article suggère d'utiliser "Type" comme Suffixe comme second choix de ne pas utiliser du tout. Je pense que c'est déroutant, mais l'Idée que "la non-incarcération mot tendrait à indiquer que c'est un non-engagés classe" coincé avec moi.
Comme une Alternative: je préfère le à l'aide de "Genre" comme suffixe à l'état de l'objet comme “appartenant à une race ou à la famille” (Wiktionnaire: -genre).
Exemple:
DataProvider
etReflectiveDataProvider
sont à la foisDataProviderKind
Inspirés par la Biologie ou, par exemple, "canis lupus" appartient à la famille "Canoidea", ce qui se traduit approximativement par "chien-ish".
Microsoft unis, à:
https://docs.microsoft.com/en-us/dotnet/standard/design-guidelines/names-of-classes-structs-and-interfaces
"✓ ENVISAGER de mettre fin à la nom des classes dérivées avec le nom de la classe de base. C'est très lisible et explique la relation clairement. Quelques exemples de cela dans le code sont: ArgumentOutOfRangeException, qui est une sorte d'Exception, et SerializableAttribute, qui est un type d'Attribut. Cependant, il est important de faire preuve de jugement dans l'application de cette directive; par exemple, le Bouton de classe est une sorte de Contrôle de l'événement, bien que le Contrôle n'apparaît pas dans son nom."
Généralement parlant, cette implicitement les règles d'utilisation "de Base" dans le nom.