Question

Je suis souvent dans une situation où je un concept représenté par une interface ou une classe, puis-je avoir une série de sous-classes / subinterfaces qui la prolongent.

Par exemple: Un générique « DoiGraphNode » Un « DoiGraphNode » représentant une ressource Un « DoiGraphNode » représentant une ressource Java Un "DoiGraphNode" avec un chemin associé, etc., etc.

Je peux penser à trois conventions de nommage, et apprécierait des commentaires sur la façon de choisir.


Option 1: Commencez toujours par le nom du concept

.

Ainsi:. DoiGraphNode, DoiGraphNodeResource, DoiGraphNodeJavaResource, DoiGraphNodeWithPath, etc

Pro: Il est très clair ce que je traite, il est facile de voir toutes les options que j'ai

Con: Pas très naturel? Tout semble même?


Option 2: Mettre les choses spéciales au début

.

Ainsi: DoiGraphNode, ResourceDoiGraphNode, JavaResourceDoiGraphNode, PathBaseDoiGraphNode, etc, etc.

Pro: Il est très clair quand je le vois dans le code

Con: Trouver il pourrait être difficile, surtout si je ne me rappelle pas le nom, le manque de cohérence visuelle


Option 3: Mettre les choses spéciales et enlever une partie du texte redondant

Ainsi: DoiGraphNode, ResourceNode, JavaResourceNode, GraphNodeWithPath

Pro: Pas grand-chose à écrire et lire Con: On dirait que cr * p, très incompatibles, peuvent entrer en conflit avec d'autres noms

Était-ce utile?

La solution

les nom pour ce qu'ils sont.

Si les nommer est difficile ou ambiguë, il est souvent un signe que la classe est en train de faire trop (responsabilité unique Principe).

Pour éviter les conflits de noms, choisissez vos espaces de noms appropriée.

Personnellement, j'utiliser 3

Autres conseils

Utilisez ce que vous voulez, il est une chose subjective. L'important est de préciser ce que représente chaque classe, et les noms doit être telle que les relations d'héritage sens. Je ne pense pas vraiment que c'est tout ce qui importe pour coder les relations dans les noms, bien; qui est ce que la documentation est pour (et si vos noms sont appropriés pour les objets, les gens devraient être en mesure de faire de bonnes suppositions quant à ce qui hérite de quoi).

Pour ce que ça vaut l'option, je l'habitude d'utiliser 3, et de mon expérience regardant l'option de code d'autres personnes 2 est probablement plus répandue que l'option 1.

Vous pouvez trouver quelques indications dans un document de normes de codage, par exemple, il est le document IDesign C # .

Personnellement, je préfère l'option 2. Ceci est généralement la façon dont les noms .NET Framework ses objets. Par exemple regarder les classes d'attributs. Ils finissent tous dans l'attribut (TestMethodAttribute). La même chose pour les gestionnaires d'événements. OnClickEventHandler est un nom recommandé pour un gestionnaire d'événements qui gère l'événement Click

J'essaie généralement de suivre cette conception dans mon propre code et les interfaces. Ainsi, un IUnitWriter produit un StringUnitWriter et un DataTableUnitWriter. De cette façon, je sais toujours ce que leur classe de base est et il lit plus naturellement. Code autodocumenté est l'objectif final pour tous les développeurs agiles il semble bien fonctionner pour moi!

Je nomme généralement semblable à l'option 1, surtout quand les classes seront utilisées polymophically. Mon raisonnement est que le bit le plus important de l'information apparaît en premier. (Par exemple le fait que la sous-classe est essentiellement ce que l'ancêtre est, avec (généralement) extensions 'ajouté'). J'aime cette option aussi parce que lorsque le tri des listes de noms de classe, les classes liées sont répertoriées ensemble. C'est à dire. Je nomme habituellement l'unité de traduction (nom de fichier) le même que le nom de classe les fichiers de classe afin connexes seront énumérés naturellement ensemble. De même ce qui est utile à la recherche incrémentale.

Bien que je tendais à utiliser l'option 2 plus tôt dans ma carrière de programmation, j'évite maintenant parce que vous dites qu'il est « inconsistant » et ne semblent pas très orthogonale.

J'utilise souvent l'option 3 lorsque la sous-classe fournit extension substantielle ou spécification, ou si le nom serait assez long. Par exemple, mes classes de nom du système de fichiers sont dérivées de chaîne mais ils prolonger considérablement la classe String et ont une différence significative utilisation / sens:

Directory_entry_name dérivé de chaîne ajoute des fonctionnalités étendues. File_name dérivé de Directory_entry_name a des fonctions plutôt spécialisées. DIRECTORY_NAME dérivé de Directory_entry_name possède également des fonctions assez spécialisées.

En outre avec l'option 1, je l'habitude d'utiliser un nom non qualifié pour une classe d'interface. Par exemple, je pourrais avoir une chaîne interence de classe:

  • Texte (une interface)
  • Text_abstract (abstraite (base) classe de généralisation)
  • Text_ASCII (classe concrète spécifique pour le codage ASCII)
  • Text_unicode (classe concrète spécifique pour le codage unicode)

Je aime bien que l'interface et la classe de base abstraite apparaissent automatiquement dans la première liste triée.

Troisième option suit plus logiquement du concept d'héritage. Puisque vous êtes spécialisé l'interface ou la classe, le nom doit montrer qu'il est de ne plus utiliser l'implémentation de base (le cas échéant).

Il existe une multitude d'outils pour voir ce qu'est une classe hérite de, donc un nom concis indiquant la fonction réelle de la classe vont aller plus loin que d'essayer d'emballer trop d'informations de type dans le nom.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top