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 battery
a charge
et vous pouvez aussi charge()
une batterie.
Je pense qu'avoir les deux Battery.Charge
et 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 Battery
variable de l' objet et que sa fonction charge
ne 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.
enqueue
soit un mot, mais un verbe en Java. Que diriez-doCharge
vous Il échouera quand même le test de symétrie car vos autres méthodes n'auront pas ce préfixeRéponses:
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.
la source
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)
contrebatteryCharger.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.
la source
Battery
c'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 (akaBattery
) 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.É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 pouvezphone
quelqu'un, ou vous pourriez avoir unphone
dans 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.
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
Battery
s’agit d’un objet et c’estCharge
un état. Ce serait donc une propriété de l'objet, mais cela dépend du contexte d'utilisation.Si vous avez besoin de
Charge
la batterie et que vous savez ce qu’elle est actuellementCharge
, 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.
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
Charge
est 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 significatifstartCharging()
.Méthodes valides pour
Battery
pourrait inclureCharging
,Discharging
,setCharge
,getCharge
,hasCharge
,Discharge
etCharged
.Les méthodes simples en un mot n'énoncent souvent pas explicitement leurs actions, mais il existe des cas similaires
open
ouclose
demandant 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.
la source
StartCharge()
etEndCharge()
impliquerait. En fait, cette terminologie ajouterait une surcharge importante à la manipulation du système de batterie. À chaque intervalle, il peut soitCharge()
ouDischarge()
.Charge
se trouve être le mot ambigu le plus facilement compris pour ce domaine. Il y en a plusieurs autres.Prévoyez-les avec des verbes qui en feront un verbe ou un nom.
la source
Pour le cas de verbe, je pense que
Charge
c'est OK. Pour le cas du nom,getCurrentChargeLevel
travaillerait pour vous?la source
getCurrentChargeLevel()
toujours pas besoin de faire référence à une variable interne deBattery
, et comment s'appellerait cette variable?Battery.currentChargeLevel
cela. Vous pouvez essayer d’utiliserBattery.coloumbs
ouBattery.ampereHours
mais cela n’est peut-être pas aussi évident ...Charge
estEnergy
ce qui estPower
(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.Watt*time
ne serait certainement pas aligner avec les conversations de conception, mais leChargeLevel
ferait.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).
la source
Notation hongroise à la rescousse. Vous pouvez avoir
intCharge
etfcnCharge(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.
la source