Quiconque de trouver de nommage des classes et des méthodes de l'une des parties les plus difficiles dans la programmation?
Donc je suis en train de travailler sur cette classe qui est censé demander de l'aide de la documentation à partir d'un fournisseur par le biais d'un service web. J'essaie de le nommer DocumentRetriever
, VendorDocRequester
, DocGetter
, mais ils n'ont tout simplement pas l'air bon. J'ai fini la navigation à travers dictionary.com pendant une demi-heure à essayer de trouver un mot adéquat.
De commencer la programmation avec de mauvais noms, c'est comme avoir un très mauvais jour de cheveux le matin, le reste de la journée se passe en descente à partir de là. Feel me?
- Pourquoi voulez-vous une classe, une fois que vous avez clairement besoin seulement d'une fonction? Assurez-vous que vous découvrez steve-yegge.blogspot.com/2006/03/... pour le verbe comme nom de classe de problème.
- Ou, aller de l'avant & refactoriser lorsque vous avez enfin savoir ce qu'il doit être appelé.
- Si les noms sont un problème pour vous, ne pas faire de la programmation orientée objet. Je veux dire, ne pas l'utiliser largement. Si vous êtes d'écrire un bout de code qui récupère un document et le processus, ne vous forcez pas à séparer la récupération et le traitement de deux classes, car le plus cool C# les gars le faire. Vous pouvez même écrire à la fois la récupération et le traitement dans une méthode, et juste ajouter un petit commentaire au-dessus de chacun d'eux.
- De quoi êtes-vous de nommage?: méthode: utiliser des verbes, comme get, set, enregistrer, etc. classes et variables: utilisation des noms, comme document, l'utilisateur, le contexte, etc. interfaces: utilisez les adjectifs, comme imprimable, clonable, itératif, etc. Après la lecture de ce thread, j'aime bien Spolsky de suggestion pour les classes et les variables (il utilise des noms) et TravisO de suggestion pour les méthodes (il utilise des verbes). Aussi ne pas rendre les objets qui se terminent par " er " .
- "Il y a deux problèmes difficiles dans l'informatique: l'invalidation du cache, des conventions de nommage, et silencieux de dépassement".
- La version que j'ai entendu il y a 2 problèmes difficiles en informatique: nommage, et décalage par 1 erreur."
- J'ai entendu dire que l'un de trop. La formulation ci-dessus, j'ai entendu de mon père, et je l'aime, que c'est un peu plus nuancée.
- Voir, le deuxième point est auto-référentielle de la phrase, subtilement ce qui implique qu'il est à seulement 1 problème difficile. Par le processus d'élimination, c'est à gauche avec de nommage.
- En fait, je l'ai entendu comme "tout-en-un", pas de "compenser-en-un". Dans ce cas, on pourrait faire valoir que le problème difficile qui est à gauche est en fait l'invalidation du cache. De toute façon, il semble que l'original a une certaine nuance que je n'avais pas vu avant, donc merci pour ça.
- Et projets. Surtout dans le monde de la SOIE, de nommage des projets est peut-être même le plus dur de tous.
Vous devez vous connecter pour publier un commentaire.
Ce que vous faites maintenant est très bien, et je vous recommande de vous en tenir à votre cours syntaxe: la
contexte + verbe + comment
J'utilise cette méthode pour le nom de fonctions/méthodes, SQL stockées procs, etc. En accord avec cette syntaxe, il gardera votre Intellisense/Code Volets beaucoup plus soigné. Donc, vous voulez EmployeeGetByID() EmployeeAdd(), EmployeeDeleteByID(). Lorsque vous utilisez un plus grammaticalement correcte de la syntaxe comme GetEmployee(), AddEmployee() vous verrez que cela devient vraiment salissant si vous avez plusieurs est dans la même classe que sans rapport avec les choses vont être regroupés.
J'apparente cela à de nommage des fichiers avec des dates, vous voulez dire 2009-01-07.journal pas 1-7-2009.journal parce que, après vous avez un tas d'entre eux, l'ordre devient totalement inutile.
InvalidateObsoleteQueries
?QueriesInvalidateObsolete
est dur à lire et n'a pas de sens. En outre, en C#, en particulier avec Resharper, l'ordre alphabétique n'est pas pertinent. Si vous commencez à taper "emp", Resharper vous donneraGetEmployee
,SetEmployee
, et mêmePopulateInactiveEmployeesList
.Une bonne convention de nommage doit minimiser le nombre de noms que vous pouvez utiliser pour toute variable donnée, classe, une méthode ou une fonction. Si il y a un seul nom possible, vous n'aurez jamais de difficulté à se souvenir d'elle.
De fonctions et de classes singleton, je scrute la fonction pour voir si sa fonction de base est de transformer une sorte de chose en une autre chose. J'utilise ce terme de façon très lâche, mais vous découvrirez un grand nombre de fonctions que vous écrivez essentiellement de prendre quelque chose dans un formulaire et de produire quelque chose sous une autre forme.
Dans votre cas, il semble que votre classe transforme une Url dans un Document. C'est un peu bizarre de penser de cette façon, mais tout à fait correct, et quand vous commencez à regarder pour ce motif, vous le verrez partout.
Quand je trouve ce modèle, j'ai toujours le nom de la fonction x
From
y.Depuis votre fonction transforme une Url dans un Document, je voudrais nommer il
Ce modèle est remarquablement commun. Par exemple:
Vous pouvez également utiliser
UrlToDocument
si vous êtes plus à l'aise avec cette commande. Si vous dites xFrom
y ou yTo
x est probablement une question de goût, mais je préfère leFrom
l'ordre parce que de cette façon, le début du nom de la fonction déjà vous indique quel type il retourne.Choisir une convention et s'y tenir. Si vous êtes prudent d'utiliser les mêmes noms que vos noms de classe dans votre x
From
y fonctions, il sera beaucoup plus facile de se rappeler les noms que vous avez utilisé. Bien sûr, ce modèle ne fonctionne pas pour tout, mais il ne fonctionne pas lorsque vous écrivez du code qui peut être considéré comme "fonctionnelle".Une leçon que j'ai apprise, c'est que si vous ne pouvez pas trouver un nom pour une classe, il y a presque toujours quelque chose de mal avec cette classe:
Parfois il n'y a pas un bon nom pour une classe ou d'une méthode, il nous arrive à tous. Souvent, cependant, l'incapacité à trouver un nom peut-être une allusion à quelque chose de mal avec votre conception. Est-ce que votre méthode ont trop de responsabilités? Est-ce que votre classe encapsuler une idée cohérente?
Thread 1:
Filetage 2:
Il n'y a pas de Fil.le sommeil(...) nulle part ici.
Je consacre beaucoup de temps, ainsi vous soucier de l'noms de tout ce qui peut être donné un nom quand je suis à la programmation. Je dirais qu'il paie très bien. Parfois, quand je suis coincé, je laisse pour un moment et pendant une pause-café, je demande un peu autour de lui si quelqu'un a une bonne suggestion.
Pour votre classe, je vous suggère de
VendorHelpDocRequester
.VendorHelpDocRequester.request()
). Je préfère juste le pluriel comme " VendorHelpDocs.demande()'Le livre Le Code Complet de Steve Mcconnell a un beau chapitre sur le nommage des variables/classes/fonctions/...
Je pense que c'est un effet secondaire.
C'est pas l'appellation qui est dur. Ce qui est difficile est que le processus de nommage vous de faire face à l'horrible fait que vous n'avez aucune idée de ce que l'enfer vous êtes en train de faire.
En fait je viens d'entendre cette citation hier, par le biais de la Signal contre le Bruit blog à 37Signals, et j'ai certainement d'accord avec elle:
"Il y a seulement deux choses dures dans l'Informatique: l'invalidation du cache et de nommer les choses."
— Phil Karlton
Il est bon que c'est difficile. C'est de vous forcer à réfléchir au problème, et ce que la classe est en fait censé faire. Ces noms peuvent aider à mener à bien la conception.
Convenu. Je tiens à garder mes noms de types et variables aussi descriptif que possible sans être trop horriblement long, mais parfois il y a juste un certain concept que vous ne pouvez pas trouver un bon mot pour.
Dans ce cas, il m'aide toujours à demander à un collègue pour l'entrée - même s'ils ne sont pas en fin de compte aider, il est généralement utile de moi pour au moins l'expliquer à haute voix et de poser mes roues tournent.
J'étais juste écrit sur des conventions de nommage, le mois dernier: http://caseysoftware.com/blog/useful-naming-conventions
L'essentiel:
verbAdjectiveNounStructure - avec la Structure et de l'Adjectif comme des parties optionnelles
Pour verbes, je m'en tiens à des verbes d'action: enregistrer, supprimer, informer, mettre à jour, ou de générer. De temps en temps, j'utilise "processus", mais seulement pour faire spécifiquement référence à des files d'attente ou de travail de l'arriéré.
Pour noms, j'utilise la classe ou de l'objet en cours d'interagir avec. Dans web2project, c'est souvent des Tâches ou des Projets. Si c'est le Javascript qui interagissent avec la page, il peut être du corps ou de la table. Le point est que le code décrit clairement l'objet, il est en interaction avec.
La structure est facultatif parce qu'il est unique à la situation. Une liste peut que l'écran demande d'une Liste ou d'un Tableau. Une des fonctions de base utilisées dans la Liste des Projets pour web2project est tout simplement getProjectList. Il ne modifie pas les données sous-jacentes, juste la représentation des données.
La adjectifs sont quelque chose d'autre entièrement. Ils sont utilisés comme modificateurs pour le nom. Quelque chose d'aussi simple que de getOpenProjects peut être facilement mis en œuvre avec un getProjects et un paramètre de commutateur, mais cela a tendance à générer des méthodes qui nécessitent un peu de compréhension des données sous-jacentes et/ou de la structure de l'objet... pas nécessairement quelque chose que vous voulez encourager. En étant plus explicite et de fonctions spécifiques, vous pouvez complètement envelopper et masquer la mise en œuvre du code de l'utiliser. N'est-ce pas l'un des points de OO?
Plus que juste la dénomination d'une classe, la création d'un package approprié de la structure peut être difficile, mais gratifiant défi. Vous devez envisager de séparer les préoccupations de vos modules et comment ils se rapportent à la vision de l'application.
Envisager la mise en page de votre application:
Je me risquerais à deviner qu'il y a beaucoup de choses à l'intérieur de quelques classes. Si vous étiez à refactoriser ce dans une plus MVC-identifiés approche, et de permettre aux petites classes pour gérer des tâches, vous pourriez vous retrouver avec quelque chose comme:
Votre classe les noms de compter sur l'espace de noms de fournir contexte complet. Les classes elles-mêmes peuvent être intrinsèquement liées à l'application sans avoir besoin de préciser explicitement de la sorte. Les noms de classe sont plus simples et plus faciles à définir en tant que résultat!
Un très important suggestion: s'il vous plaît ne vous une faveur et de ramasser une copie de, Tête la Première, les Modèles de Conception. C'est un fantastique, facile-livre de lecture qui vous aidera à organiser votre application et à mieux écrire le code. Appréciant les modèles de conception vous aidera à comprendre que beaucoup de problèmes ont déjà été résolus, et vous serez en mesure d'intégrer les solutions dans votre code.
Leo Brodie, dans son livre "la Pensée de Suite", a écrit que la tâche la plus difficile pour un programmeur a été nommant les choses bien, et il a déclaré que le plus important outil de programmation est un dictionnaire des synonymes.
Essayez d'utiliser le dictionnaire des synonymes à http://thesaurus.reference.com/.
Au-delà, n'utilisez pas de la Notation hongroise JAMAIS, éviter les abréviations, et être cohérent.
Meilleurs vœux.
En bref:
Je suis d'accord que les bons noms sont importants, mais je ne pense pas que vous avez à les trouver avant de mettre en œuvre à tous les coûts.
Bien sûr de son mieux pour avoir un bon nom droite dès le début. Mais si vous ne pouvez pas venir avec un en 2 minutes, le changement de nom plus tard coûtera moins de temps et est le bon choix à partir d'une productivité point de vue.
Long:
Généralement, c'est souvent pas la peine de penser trop longtemps sur un nom avant de mettre en œuvre. Si vous implémentez votre classe, en le nommant "Toto" ou "Dsnfdkgx", tandis que la mise en œuvre de vous voir ce que vous devriez avoir un nom.
Surtout avec Java+Eclipse, le fait de renommer les choses n'est pas de douleur, comme il soigneusement les poignées de toutes les références dans toutes les classes, vous avertit des collisions de nom, etc. Et aussi longtemps que la classe n'est pas encore dans le référentiel de contrôle de version, je ne pense pas qu'il ya quelque chose de mal avec le renommage 5 fois de suite.
Fondamentalement, c'est une question de la façon dont vous pensez à ce sujet le refactoring. Personnellement, je l'aime, si elle agace mes coéquipiers parfois, comme ils le croient en jamais toucher un système en cours d'exécution. Et de tout ce que vous pouvez restructurer, en changeant les noms de est un de la plus inoffensive des choses que vous pouvez faire.
Pourquoi ne pas HelpDocumentServiceClient sorte de bouchée, ou HelpDocumentClient...il n'a pas d'importance, c'est un vendeur le fait est que c'est un client à un service web qui traite avec l'Aide des documents.
Et oui nommage est dur.
Il y a seulement un nom judicieux pour la classe:
Ne laissez pas les détails de l'application, vous distraire de la signification.
HelpLibrary
pour la classe, mais c'est au moins aussi bon. Il paye pour lire à travers les réponses d'abord!Investir dans un bon outil de refactoring!
Je m'en tiens à l'essentiel: VerbNoun(arguments). Exemples: GetDoc(docID).
Il n'y a pas besoin d'obtenir la fantaisie. Il sera facile de comprendre une année à partir de maintenant, si c'est vous ou quelqu'un d'autre.
Pour moi, je ne m'inquiète pas combien de temps une méthode ou un nom de classe est aussi longue que son descriptif et dans la bonne bibliothèque. Disparu depuis longtemps sont les jours où vous devez vous souvenir où chaque partie de l'API réside.
Intelisense existe pour toutes les langues principales. Par conséquent, lors de l'utilisation d'un 3ème partie API, j'aime utiliser ses intelisense pour la documentation, par opposition à l'aide de la "réelle" de la documentation.
Avec cela à l'esprit, je suis fine pour créer un nom de méthode comme
StevesPostOnMethodNamesBeingLongorshort
Long mais tant pis. Qui n'est pas l'utilisation de 24 pouces écrans ces jours!
Je suis d'accord que la nomenclature est un art. Il devient un peu plus facile si votre classe est à la suite d'un certain "assorti, modèle" (usine, etc).
C'est l'une des raisons d'avoir une norme de codage. Avoir un standard tend à aider à venir avec des noms si nécessaire. Il permet de libérer votre esprit de l'utiliser pour d'autres choses plus intéressantes! (-:
Je vous recommande la lecture du chapitre correspondant de Steve McConnell Code Complet (Lien Amazon) qui va dans plusieurs règles pour aider la lisibilité et la même facilité de maintenance.
HTH
acclamations,
Rob
Nope, le débogage est la chose la plus difficile chose pour moi! 🙂
DocumentFetcher? C'est difficile à dire sans contexte.
Il peut aider à agir comme un mathématicien et d'emprunter ou d'inventer un lexique pour votre domaine que vous allez: installez-vous sur les courts de la plaine des mots qui suggèrent le concept sans en épelant chaque fois. Trop souvent je vois à long latinate des phrases qui se acronymes, faire vous avez besoin d'un dictionnaire pour les acronymes de toute façon.
La langue que vous utilisez pour décrire le problème, c'est la langue que vous devriez utiliser pour les variables, méthodes, objets, classes, etc. Vaguement, les noms correspondent à des objets et des verbes match méthodes. Si vous êtes en manque de mots pour décrire le problème, il manque aussi une compréhension complète (spécification) du problème.
Si c'est juste le choix entre un ensemble de noms, alors il devrait être guidé par les conventions que vous utilisez pour construire le système. Si vous êtes un nouveau spot, découvert par les précédentes conventions, alors c'est toujours la peine de dépenser un peu d'effort à essayer de les étendre (correctement, de façon constante) pour couvrir cette nouvelle affaire.
En cas de doute, dormir là-dessus et choisissez la première et la plus évidente nom, le lendemain matin 🙂
Si vous vous réveillez un jour et de réaliser que vous aviez tort, alors changez-le immédiatement.
Paul.
BTW: Document.fetch() est assez évidente.
Je trouve que j'ai le plus de problèmes dans des variables locales. Par exemple, je veux créer un objet de type DocGetter. Donc, je sais que c'est un DocGetter. Pourquoi ai-je besoin de lui donner un autre nom? J'ai l'habitude de finir en lui donnant un nom tel que dg (pour DocGetter) ou temp ou quelque chose de tout aussi descriptifs.
N'oubliez pas de motifs de conception (et pas seulement du GoF) sont un bon moyen de fournir un vocabulaire commun et leurs noms doivent être utilisés chaque fois que l'on s'adapte à la situation. Cette volonté d'aider les nouveaux arrivants qui sont familiers avec la nomenclature de comprendre rapidement l'architecture. C'est cette classe que vous travaillez sur censés agir comme un Proxy, ou même une Façade ?
Ne pas le vendeur de la documentation de l'objet? Je veux dire, que l'on est tangible, et non pas seulement comme certains anthropomorphization d'une partie de votre programme. Donc, vous pourriez avoir un
VendorDocumentation
classe avec un constructeur qui va chercher l'information. Je pense que si un nom de classe contient un verbe, souvent, quelque chose a mal tourné.J'ai vraiment l'impression de vous. Et je ressens votre douleur. Chaque nom, je pense que de semble juste de la foutaise pour moi. Tout cela semble si ouverte et si je veux finalement apprendre à injecter un peu de flair et de la créativité dans mes noms, les rendant reflètent vraiment ce qu'ils décrivent.
Une suggestion que j'ai à faire est de consulter un dictionnaire des synonymes. Word est un bon un, tout comme Mac OS X. Qui peut vraiment m'aider à obtenir ma tête des nuages et me donne un bon point de départ, ainsi qu'une source d'inspiration.
Si le nom pourrait expliquer lui-même à une mise programmeur puis il n'y a probablement pas besoin de le changer.
Je ne trouve pas ça difficile. Si vous ne pouvez pas nom il alors peut-être que vous n'en avez pas besoin. Le mieux est de votre design le plus il sera facile de nommer les choses que votre création ne.
Maintenant les variables temp, c'est une autre histoire. 🙂
Bien je le voir d'un autre point de vue, c'est l'une des choses les plus importantes si vous voulez que votre code soit lisible par d'autres.
Essayer de le faire, descriptive et si sa part d'un tiers, pourquoi ne pas inclure le nom [de la troisième partie] sur la classe ou le nom de la méthode.
Si il prend à la longue, il suffit d'utiliser n'importe quel nom, par la suite, vous pouvez le changer.
Je ressens votre douleur. :/
Je souhaite qu'il y avait un outil pour l'analyse de code source en conjonction avec un dictionnaire de données (un fichier décrivant les différentes variables /les noms de méthode, je pense un peu comme javadoc), de sorte que vous pouvez écrire du code comme ceci:
et le code de l'examen de l'outil pourrait faire un certain nombre de choses différentes pour le rendre plus facile à afficher le code dans son contexte, y compris l'affichage des rappels que I = courant (par exemple, dans un volet sur le côté droit de la fenêtre pour afficher les définitions de variables/sémantique/commentaires pour la placer dans le code en cliquant sur les), ou même vous permettre de faire "virtuel refactoring" où, comme un code examinateur vous pouvez renommer quelque chose à votre goût pour des raisons de lisibilité/affichage raisons sans changer le code stocké sur le disque.
Autant que j'aime l'auto-décrire les noms, je déteste lire des choses comme
BatteryFilteredCurrentInMilliamps
. Souvent dans les systèmes embarqués nous cherchons à modéliser des objets en se basant sur les équations algébriques et des noms tels que dans des équations très compliquées. (d'un autre côté, un "I" avec un chapeau sur le dessus et un indice "d" et un symbole "*" est plutôt déroutant.)Je suis un EE /ingénieur systèmes abord avec de légères logiciel de responsabilités et à la fin, j'ai vraiment ne se soucient pas ce qu'est une variable nommée aussi longtemps que j'ai un moyen commode de dire ce que c'est, et de la cartographie sur mon propre modèle interne du système contrôlé.
Lors de chaque nom judicieux semble trop longue ou ambiguë, vous pouvez essayer d'utiliser quelque chose d'un peu moins sensible, par exemple:
Assurez-vous que le nom est vraiment unique et il y a un commentaire descriptif en haut de la classe, parce que toute personne qui le voit dans le code va avoir besoin de regarder pour savoir ce qu'il fait (mais quand ils le font, ils vont probablement trouver plus facile à retenir).
Une autre raison pourquoi chaque développeur de logiciels devraient avoir écrit et compétences en communication.
PD: je crois qu'un vaste vocabulaire est également important.
Ce que j'ai à faire est de vérifier si c'est pour longtemps si je ne m'en souviens pas pour longtemps
Si 8 personnes sur 10 le comprendre, alors vous pouvez supposer qu'il est compréhensible et lisible et clair. Il y aura toujours ces 1 ou 2 nit cueilleurs qui va essayer de panne et pour aucune autre raison que le fait qu'ils sont petits.
Je trouve sa plus facile de choisir un nom une fois que quelque chose est fini. Refactoriser->Renommer ftw.
Il se sent généralement très naturel pour moi. Je fais toujours très court méthodes, jamais plus de 6 lignes de code Smalltalk (automatiquement mis en forme), donc je n'ai pas vraiment de mal à dire ce que cette méthode est d'environ.
Parfois les noms de classe sont difficiles, parce que le mot que je veux c'est choisir de l'utiliser quelque part dans le système, parce que parfois le même mot a des significations différentes dans des contextes différents. Je souhaite que, dans ces cas, certains comme Wikipédia syntaxe serait autorisé, de sorte que je pouvais le nom de ma classe "Task (tâche)". Jusqu'à ce qui est légal, je fais un grand style allemand mot de: ToDoListItemTask. Vous l'avez deviné: Ma méthode de noms peut être très long, trop. Mais je pense qu'ils sont lisibles.
Donc, dans votre cas, votre classe est un "getter", ou retriever, ou quoi que ce soit. Êtes-vous sûr que ce doit être modélisé en classe? Ne serait pas plutôt le vendeur doc être en mesure de demander lui-même? Quelque chose comme vendorDoc.la demande(source); serait plus facile de nom, n'est-ce pas?
acclamations,
niko
Si vous êtes un .NET développeur, je recommande fortement la lecture de la BradA, Cwalina livre - Cadre des lignes directrices de Conception. Son tout expliqué là.
Résumer la méthode/classe dans "Un Mot", répondant à ce qu'il signifie pour?
Et il ne devrait pas être l'équivalent de ce mot.
Pas vraiment. Compte tenu de toutes les choses difficiles que vous avez à comprendre en codage, en disant que le nommage des classes et des méthodes est l'une des choses les plus difficiles dans la programmation est absurde. Ne m'obtenez pas le mal, il est parfois difficile de trouver un bon nom, mais soyons réalistes ici. Je vais aller jusqu'à dire que c'est l'un des plus faciles les pièces de la programmation.