Comment nommer une variable quand le mot est à la fois un nom et un verbe

48

Je suis tombé sur un problème épineux avec l'orientation générale de:

  • noms pour variables
  • verbes pour fonctions

Plus précisément, j'ai un cas où le mot est ambigu - il peut s'agir d'un verbe ou d' un nom. Et dans certains cas, lorsque nous discutons de l'application, elle sera utilisée dans les deux sens dans la même phrase.

Mon intention est de faire en sorte que le programme reste lisible par les futurs développeurs ainsi que par moi-même lorsque je reviens à des sections de code plusieurs mois plus tard.

Un des exemples est avec un battery. A batterya chargeet vous pouvez aussi charge()une batterie.

Je pense qu'avoir les deux Battery.Chargeet Battery.Charge(value)sera source de confusion pour les futurs développeurs.

Ma solution actuelle consiste simplement à choisir un mot différent pour l'un ou l'autre de ces cas (la variable et la fonction). Mon problème avec cette approche est que la Batteryvariable de l' objet et que sa fonction chargene correspond pas aux discussions de conception impliquant le Battery.

Ma question est de savoir s'il existe un autre / meilleur moyen de gérer ce conflit dans la convention de dénomination?


Quelques lectures supplémentaires sur le sujet. Aucun n’a vraiment abordé le détail de ma question.

Communauté
la source
3
rendre la fonction de charge addCharge assez simple et claire
cliquet
2
Pourriez-vous préfixer la variable nominale avec "Current-"? Alors, "CurrentCharge" vs "Charge ()"?
Brian Snow
6
ou tout simplement ChargeLevel pour obtenir le courant de charge
freak cliquet
5
Faites un mot. WordNet ne pense pas que ce enqueuesoit un mot, mais un verbe en Java. Que diriez- doChargevous Il échouera quand même le test de symétrie car vos autres méthodes n'auront pas ce préfixe
Miserable Variable
5
"Actuel" = maintenant ou "Actuel" = flux de charge. La seule vraie solution est de remplacer l'anglais par une langue plus judicieuse!
DarenW

Réponses:

38

Dans des situations similaires, j'essaie de trouver des synonymes. Dans ce cas, j'utiliserais "recharge" pour le verbe. Le "re" est légèrement redondant, mais le sens est clair. L'utilisation de la simple "charge" pour la charge restante dans la batterie est ambiguë car elle ne spécifie aucune unité physique. Je préférerais "availableAmpHours", "hoursUntilRecharge" ou quelque chose de similaire. Les unités dépendront de ce qui convient à l’application.

Ma préférence personnelle est d'utiliser des verbes uniquement pour les fonctions qui changent d'état. J'utilise des noms pour des fonctions non mutantes. Je suppose que cela dépend de votre point de vue. Au niveau de la machine, les fonctions non mutantes font quelque chose, mais au niveau du modèle, elles ne le font pas.

Kevin Cline
la source
2
Excellent point sur les unités. Les unités sont explicitement laissées dans ce cas car elles peuvent changer en fonction de l'analyse en cours. En d'autres termes, nous utilisons différentes échelles de temps et la batterie ajuste ses opérations en fonction de l'échelle de l'analyse.
1
Je préfère les verbes pour les fonctions coûteuses et non mutantes. Par exemple, les fonctions qui exécutent une requête sur une base de données.
Brian
20

Il suffit de jeter cela là-bas, mais peut-être que la solution à cette ambiguïté de nommer consiste à supprimer complètement cette fonctionnalité de la batterie. Je n'ai jamais vu de batterie se chargeant automatiquement et il serait plus logique pour moi d'avoir une classe BatteryCharger. Cela aiderait à garder vos préoccupations plus découplées et à rendre l'action plus explicite.

battery.Charge(50) contre batteryCharger.Charge(battery, 50)

Pour moi, la deuxième forme est beaucoup plus compréhensible et conserve tout votre code de "charge" au même endroit plutôt que de le répandre dans toutes vos classes de batterie.

mortalapeman
la source
6
Ce n'est pas une mauvaise idée, mais dans ce cas Batteryc'est une abstraction pour la batterie + le système de charge. Notre application n'exige pas de séparer les deux aspects en objets séparés, ils sont donc regroupés en un (aka Battery) pour plus de commodité. En fin de compte, les caractéristiques physiques d’une batterie rechargeable lui imposent une fonction permettant d’accepter une charge.
Dans ce cas, je soumets que la réponse de kevin cline est ce que vous recherchez. Par souci de clarté, j’utiliserais Recharge and Discharge pour les fonctions en mutation et Charge pour le nom de la propriété. Peut-être que ChargePercent serait un bon exemple également.
Mortalapeman
Êtes-vous peut-être un programmeur Java? Ceci est clairement une violation de Don't Repeat Yourself. En fait, vous répétez TOUT, sauf le paramètre "50". Si je tentais, je ne pourrais pas trouver un exemple plus grave de violation du code DRY.
boîte
@boxed Voulez-vous parler de mon exemple? Parce que je ne sais pas comment vous pouvez prétendre que je viole DRY quand je n'ai aucune implémentation. Je suis un ardent défenseur des principes SOLID et je ne vois tout simplement pas comment vous en êtes arrivé à cette conclusion.
Mortalapeman
Vous violez DRY en créant une classe BatteryCharger inutile qui provoquera en quelque sorte un changement d'état de la batterie. Ainsi, BatteryCharger acceptera des informations qu’il transmettra immédiatement à Battery.
Kevin Cline
9

Éviter la double signification

Vous avez délibérément sélectionné un mot qui a plus d'un sens, et c'est le problème qui est pris en premier. Il y a une tonne de mots qui posent problème aux programmeurs. Un autre exemple serait phone. Vous pouvez phonequelqu'un, ou vous pourriez avoir un phonedans votre poche.

Utiliser des Getters et Setters

La dénomination standard pour la plupart des objets est la méthode des accesseurs / paramètres pour les propriétés.

Battery.Charge            // would be a property
Battery.setCharge(value)  // would set the property
Battery.getCharge()       // would get the property

Les propriétés sont des états et non des noms

Je pense que vous vous trompez en classant les propriétés d'objet en tant que noms, et les variables peuvent également être considérées comme des états. Ce sont des États pertinents pour la portée locale de leur existence.

Vous pouvez décrire la valeur qu'ils ont en tant que nom, mais je ne suis pas sûr que ce soit vrai dans tous les cas.

Dans la terminologie POO, les propriétés d'objet décrivent l'état de cet objet. Dans votre cas, il Batterys’agit d’un objet et c’est Chargeun état. Ce serait donc une propriété de l'objet, mais cela dépend du contexte d'utilisation.

Si vous avez besoin de Chargela batterie et que vous savez ce qu’elle est actuellement Charge, vous avez un problème.

Utilisation de Scope pour appliquer le contexte

Le contexte est ce qui clarifiera la signification d'un mot que vous souhaitez transmettre à une méthode ou à une propriété. L'étendue définit l'accessibilité d'une propriété / méthode depuis l'extérieur de l'objet.

Batter._charge            // a hidden private property
Battery.setCharge(value)  // would set the private property
Battery.getCharge()       // would get the private property
Battery.Charge()          // would perform the Charge action

Les méthodes sont des verbes

Vous pouvez décrire la méthode d'un objet comme un verbe, mais le mot action est mieux adapté. Dans la terminologie POO, vous effectuez des actions sur des objets à l'aide de leurs méthodes. C'est une mauvaise forme de modifier la propriété d'un objet de l'extérieur de celui-ci. Il est préférable d'appeler une méthode qui effectue les actions requises qui entraînent un changement d'état.

Le mot Chargeest un verbe, mais c'est aussi un nom. Lorsqu'il est utilisé pour appeler la méthode d'une action, il devient clair que le verbe est utilisé Battery.Charge(....).

Mais le contexte est très important. Bien que le mot Charge()soit un verbe, il n’est pas aussi significatif startCharging().

Méthodes valides pour Batterypourrait inclure Charging, Discharging, setCharge, getCharge, hasCharge, Dischargeet Charged.

Les méthodes simples en un mot n'énoncent souvent pas explicitement leurs actions, mais il existe des cas similaires openou closedemandant peu d'explications.

Il n’ya donc pas vraiment de réponse correcte quant à la manière de nommer ces types de propriétés / méthodes. Sauf que vous devez utiliser les techniques ci-dessus à bon escient pour éviter toute confusion.

Réactionnel
la source
2
Pour mémoire, le client est celui qui utilise la terminologie ambiguë. Je n'ai pas créé ce gâchis. :-) J'ai soulevé la question car je pensais que je ne pouvais pas être la seule personne à entrer dans une telle situation. Vous avez des points valables dans votre réponse. Dans ce cas particulier, nous ne travaillons pas à la granularité de temps StartCharge()et EndCharge()impliquerait. En fait, cette terminologie ajouterait une surcharge importante à la manipulation du système de batterie. À chaque intervalle, il peut soit Charge()ou Discharge().
1
La principale difficulté est de garder la sémantique de la programmation interne synchrone avec la terminologie utilisée par le client. Chargese trouve être le mot ambigu le plus facilement compris pour ce domaine. Il y en a plusieurs autres.
6

Prévoyez-les avec des verbes qui en feront un verbe ou un nom.

Battery.doCharge()

Battery.getCharge()
Jürgen Paul
la source
4

Pour le cas de verbe, je pense que Chargec'est OK. Pour le cas du nom, getCurrentChargeLeveltravaillerait pour vous?

FrustratedWithFormsDesigner
la source
Pas sûr à ce sujet. Puisque nous utilisons C #, nous pouvons déclarer le get et le définir sur la propriété au lieu d'avoir besoin de fonctions séparées. Indépendamment de cela, la maintenance me préoccupe et son apparence une fois que j'ai oublié ce que j'ai écrit. N'aurait getCurrentChargeLevel()toujours pas besoin de faire référence à une variable interne de Battery, et comment s'appellerait cette variable?
est-ce que charger une tension ou un pourcentage?
mhoran_psprep
1
@ GlenH7: Ah, je vois. Vous n'avez pas spécifié C # et mon cerveau est en mode Java. De toute façon, je pense que pour le nom représentant la charge actuellement présente dans la batterie, il se peut que quelque chose se passe comme Battery.currentChargeLevelcela. Vous pouvez essayer d’utiliser Battery.coloumbsou Battery.ampereHoursmais cela n’est peut-être pas aussi évident ...
FrustratedWithFormsDesigner
1
@mhoran_psprep - ni l'un ni l'autre. ;-) Chargeest Energyce qui est Power(Volts * Amps == Watts) multiplié par le temps. Donc, dans ce cas, la charge est un nombre. Il y a aussi un état de charge qui se trouve être un pour cent.
@FrustratedWithFormsDesigner - oui, j'ai oublié C #, car je pensais que le cas de corner plus large était applicable quelle que soit la langue. Watt*timene serait certainement pas aligner avec les conversations de conception, mais le ChargeLevelferait.
0

Dans la plupart des cas, l’ajout d’un verbe, d’un adverbe ou d’un adjectif est suffisant pour les distinguer et peut aider à la compréhension. Avec votre cas de charge et charge () sur une batterie rendant DeltaCharge () pourrait montrer que c'est une fonction qui peut gérer la charge ou la décharge.

Delta (dans les cas où il y a un changement mais ambigu) est un modificateur que j'utilise et recommande aux autres tout le temps pour rendre le changement d'état (même si le verbe est semi-évident).

Jeff Langemeier
la source
0

Notation hongroise à la rescousse. Vous pouvez avoir intChargeet fcnCharge(value), évitant ainsi la confusion et ne pas ajouter un nom long fou lorsque trois lettres fonctionneront parfaitement.

Ou vous pouvez simplement utiliser le même nom et laisser l'IDE le gérer. De toute façon, créer un nom plus long ou différent peut être tout aussi déroutant à long terme.

Ryathal
la source
+1 pour la perspective unique sur la réponse. Malheureusement, la notation hongroise est explicitement commentée selon nos directives de style de code. Cela ne change pas le mérite potentiel de votre réponse, juste que je ne peux pas l'utiliser comme ma solution réelle.