Wie man eine Variable benennt, wenn das Wort sowohl ein Substantiv als auch ein Verb ist

48

Ich habe ein Eckfallproblem mit der allgemeinen Anleitung von:

  • Substantive für Variablen
  • Verben für Funktionen

Insbesondere habe ich einen Fall, in dem das Wort mehrdeutig ist - es kann entweder ein Verb oder ein Substantiv sein. In einigen Fällen wird die Anwendung im selben Satz in beide Richtungen verwendet .

Ich möchte sicherstellen, dass das Programm auch für zukünftige Entwickler und mich selbst lesbar bleibt, wenn ich Monate später zu Codeabschnitten zurückkehre.

Eines der Beispiele ist mit a battery. A batteryhat eine chargeund man kann auch charge()eine Batterie.

Ich denke, dass beides zu haben Battery.Chargeund Battery.Charge(value)für zukünftige Entwickler verwirrend sein wird.

Meine derzeitige Lösung besteht darin, einfach ein anderes Wort für einen oder beide dieser Fälle (die Variable und die Funktion) auszuwählen. Mein Problem bei diesem Ansatz ist, dass die BatteryVariable und Funktion des Objekts chargenicht mit den Designdiskussionen übereinstimmt , an denen das Objekt beteiligt ist Battery.

Meine Frage ist, ob es einen anderen / besseren Weg gibt, um mit diesem Konflikt in der Namenskonvention umzugehen.


Einige zusätzliche Lektüre zu diesem Thema. Keiner ging wirklich auf das Besondere meiner Frage ein.

Gemeinschaft
quelle
3
mach die ladefunktion einfach und übersichtlich
ratschenfreak
2
Könnten Sie der Nomenvariablen "Current-" voranstellen? Also "CurrentCharge" vs "Charge ()"?
Brian Snow
6
oder einfach ChargeLevel, um die aktuelle Ladung zu erhalten
Ratschenfreak
5
Denk dir ein Wort aus. WordNet enqueueist kein Wort, sondern ein Verb in Java. Wie wäre es doCharge? Der Symmetrietest wird weiterhin fehlschlagen, da Ihre anderen Methoden dieses Präfix nicht haben
Miserable Variable
5
"Current" = now oder "current" = flow of charge. Die einzig wahre Lösung ist, Englisch durch eine vernünftigere Sprache zu ersetzen!
DarenW

Antworten:

38

In ähnlichen Situationen versuche ich Synonyme zu finden. In diesem Fall würde ich "recharge" für das Verb verwenden. Das "Re" ist etwas überflüssig, aber die Bedeutung ist klar. Die Verwendung der einfachen "Ladung" für die verbleibende Ladung in der Batterie ist nicht eindeutig, da sie keine physikalischen Einheiten angibt. Ich würde "availableAmpHours", "hoursUntilRecharge" oder ähnliches bevorzugen. Die Einheiten hängen davon ab, was für die Anwendung geeignet ist.

Meine persönliche Präferenz ist es, Verben nur für Funktionen zu verwenden, die ihren Zustand ändern. Ich benutze Substantive für nicht mutierende Funktionen. Ich nehme an, es hängt von Ihrer Sicht ab. Auf der Maschinenebene tun nicht mutierende Funktionen etwas, auf der Modellebene jedoch nicht.

Kevin Cline
quelle
2
Hervorragender Punkt auf den Einheiten. Einheiten werden in diesem Fall explizit weggelassen, da sie sich je nach der von uns durchgeführten Analyse ändern können. Das heißt, wir verwenden verschiedene Zeitskalen und die Batterie passt ihre Funktionen im Hinblick auf die Analyseskala an.
1
Ich bevorzuge Verben für teure, nicht mutierende Funktionen. ZB Funktionen, die eine Abfrage in einer Datenbank ausführen.
Brian
20

Wirf das einfach raus, aber vielleicht besteht die Lösung für diese Instanz der Mehrdeutigkeit darin, diese Funktionalität vollständig aus der Batterie zu entfernen. Ich habe noch nie einen Akku gesehen, der sich selbst auflädt, und es wäre für mich sinnvoller, eine BatteryCharger-Klasse zu haben. Dies würde dazu beitragen, Ihre Bedenken stärker zu entkoppeln und die Aktion deutlicher zu machen.

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

Für mich ist das zweite Formular viel verständlicher und speichert Ihren gesamten "Lade" -Code an einem Ort, anstatt ihn über alle Batterieklassen zu streuen.

Mortalapeman
quelle
6
Es ist kein schlechter Gedanke, aber in diesem Fall Batteryist es eine Abstraktion für das Batterieladesystem. Für unsere App ist es nicht erforderlich, die beiden Aspekte in separate Objekte zu unterteilen, sodass sie der Einfachheit halber in einem Objekt zusammengefasst werden Battery. Letztendlich schreibt die Physik eines aufladbaren Akkus vor, dass er eine Art Funktion hat, um eine Ladung anzunehmen.
In diesem Fall übermittle ich, dass die Antwort von Kevin Cline genau das ist, wonach Sie suchen. Der Klarheit halber würde ich Recharge und Discharge für die Mutationsfunktionen und Charge für den Eigenschaftsnamen verwenden. Vielleicht wäre ChargePercent auch gut.
Mortalapeman
Sind Sie vielleicht ein Java-Programmierer? Dies ist eindeutig eine Verletzung von Don't Repeat Yourself. Tatsächlich wiederholen Sie ALLES mit Ausnahme des Parameters "50". Ich hätte kein schlimmeres Beispiel für eine DRY-Verletzung finden können, wenn ich es versucht hätte.
Boxed
@boxed Nimmst du mein Beispiel? Weil ich nicht sicher bin, wie Sie behaupten können, dass ich DRY verletze, wenn ich keine Implementierung habe. Ich bin ein großer Befürworter der SOLID-Prinzipien und verstehe nicht, wie Sie zu diesem Schluss gekommen sind.
Mortalapeman
Sie verletzen DRY, indem Sie eine unnötige BatteryCharger-Klasse erstellen, die dann irgendwie zu einer Statusänderung der Batterie führt. BatteryCharger akzeptiert also Eingaben, die sofort an Battery weitergeleitet werden.
Kevin Cline
9

Vermeiden Sie doppelte Bedeutungen

Sie haben absichtlich ein Wort ausgewählt, das mehr als eine Bedeutung hat, und diese erste Entscheidung ist das Problem. Es gibt eine Menge Wörter, die für Programmierer problematisch sind. Ein anderes Beispiel wäre phone. Sie können phonejemanden, oder Sie könnten eine phonein der Tasche haben.

Verwenden Sie Getter und Setter

Die Standardbenennung für die meisten Objekte sind die Get- / Einstellungsmethoden für Eigenschaften.

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

Eigenschaften sind Zustände, nicht Substantive

Ich glaube, Sie täuschen sich, wenn Sie Objekteigenschaften als Substantive klassifizieren, und Variablen könnten auch als Zustände betrachtet werden. Sie sind Staaten, die für den lokalen Geltungsbereich ihrer Existenz relevant sind.

Sie könnten den Wert, den sie haben, als Substantiv beschreiben, aber ich bin mir nicht sicher, ob dies in allen Fällen zutrifft.

In der OOP-Terminologie beschreiben Objekteigenschaften den Status dieses Objekts. In Ihrem Fall Batteryist das ein Objekt und es Chargeist ein Zustand. Das wäre also eine Eigenschaft des Objekts, aber dies hängt vom Kontext ab, in dem es verwendet wird.

Wenn Sie in der Lage sein müssen, Chargedie Batterie und auch wissen, was es aktuell Chargeist, dann haben Sie ein Problem.

Verwenden des Bereichs zum Erzwingen des Kontexts

Der Kontext verdeutlicht, welche Bedeutung eines Wortes Sie mit einer Methode oder Eigenschaft vermitteln möchten. Der Bereich legt die Zugänglichkeit einer Eigenschaft / Methode von außerhalb des Objekts fest.

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

Methoden sind Verben

Sie können die Methode eines Objekts als Verb beschreiben, aber das Wort Aktion ist besser geeignet. In der OOP-Terminologie führen Sie Aktionen für Objekte mithilfe ihrer Methoden aus. Es ist eine schlechte Form, die Eigenschaft eines Objekts von außerhalb des Objekts zu ändern. Es wird empfohlen, eine Methode aufzurufen, die die erforderlichen Aktionen ausführt, durch die sich der Status ändert.

Das Wort Chargeist ein Verb, aber es ist auch ein Substantiv. Beim Aufruf der Methode einer Aktion wird deutlich, dass das Verb verwendet wird Battery.Charge(....).

Der Kontext ist jedoch sehr wichtig. Das Wort Charge()ist zwar ein Verb, aber nicht so aussagekräftig wie startCharging().

Gültige Methoden Batterykönnten Charging, Discharging, setCharge, getCharge, hasCharge, Dischargeund Charged.

Einfache Ein-Wort-Methoden geben ihre Handlungen oft nicht explizit an, aber es gibt Fälle wie openund in closedenen wenig Erklärung erforderlich ist.

Es gibt also keine richtige Antwort darauf, wie diese Arten von Eigenschaften / Methoden benannt werden sollen. Mit der Ausnahme, dass Sie die oben genannten Techniken mit Bedacht anwenden müssen, um sicherzustellen, dass keine Verwirrung herrscht.

Reactgular
quelle
2
Für den Datensatz ist der Client derjenige, der die mehrdeutige Terminologie verwendet. Ich habe dieses Chaos nicht geschaffen. :-) Ich habe die Frage aufgeworfen, da ich dachte, ich sei nicht die einzige Person, die in eine solche Situation gerät. Sie haben einige gültige Punkte in Ihrer Antwort. In diesem besonderen Fall sind wir nicht mit der Granularität der Zeit arbeiten, StartCharge()und EndCharge()implizieren würde. Tatsächlich würde diese Terminologie den Aufwand für die Handhabung des Batteriesystems erheblich erhöhen. In jedem Intervall kann es entweder Charge()oder Discharge().
1
Der primäre Kampf besteht darin, die interne Programmiersemantik mit der vom Client verwendeten Terminologie synchron zu halten. ChargeZufällig ist es das am leichtesten zu verstehende mehrdeutige Wort für diesen Bereich. Es gibt mehrere andere.
6

Stellen Sie ihnen Verben voran, die sie zu einem Verb oder Substantiv machen.

Battery.doCharge()

Battery.getCharge()
Jürgen Paul
quelle
4

Für den Verbfall halte ich das für ChargeOK. Für den Nomenfall würde getCurrentChargeLevelfür Sie arbeiten?

FrustratedWithFormsDesigner
quelle
Da bin ich mir nicht sicher. Da wir C # verwenden, können wir get und set für die Eigenschaft deklarieren, anstatt separate Funktionen zu benötigen. Unabhängig davon mache ich mir Sorgen um die Wartung und wie sie aussehen wird, wenn ich vergessen habe, was ich geschrieben habe. Müsste nicht getCurrentChargeLevel()immer noch auf eine interne Variable von verweisen Battery, und wie würde der Name dieser Variablen lauten?
ist Ladung eine Spannung oder ein Prozentsatz?
mhoran_psprep
1
@ GlenH7: Ah, ich verstehe. Sie haben C # nicht angegeben und mein Gehirn befindet sich im Java-Modus. So oder so, ich denke, dass für das Substantiv, das die derzeit in der Batterie befindliche Ladungsmenge darstellt, etwas in der Art von Battery.currentChargeLevelfunktionieren könnte. Sie könnten versuchen, mit Battery.coloumbsoder, Battery.ampereHoursaber das könnte nicht so offensichtlich sein ...
FrustratedWithFormsDesigner
1
@mhoran_psprep - weder. ;-) Chargeist Energywas ist Power(Volt * Ampere == Watt) multipliziert mit der Zeit. In diesem Fall ist die Gebühr eine Zahl. Es gibt auch einen Ladezustand, der zufällig ein Prozent beträgt.
@FrustratedWithFormsDesigner - Ja, ich habe C # weggelassen, da ich dachte, dass der erweiterte Eckfall unabhängig von der Sprache anwendbar ist. Watt*timewürde definitiv nicht mit Design-Gesprächen übereinstimmen, aber ChargeLevelwürde.
0

In den meisten Fällen ist das Hinzufügen eines Hilfsverbs, Adverbs oder Adjektivs gut genug, um sie zu unterscheiden, und kann tatsächlich zum Verständnis beitragen. Wenn Sie Charge and Charge () bei einem Akku verwenden, kann DeltaCharge () zeigen, dass es sich um eine Funktion handelt, die sowohl das Laden als auch das Entladen ermöglicht.

Delta (in Fällen, in denen es eine Änderung gibt, die aber nicht eindeutig ist) ist ein Modifikator, den ich immer wieder verwende und anderen empfehle, um Zustandsänderungen zu behandeln (auch wenn das Verb halb offensichtlich ist).

Jeff Langemeier
quelle
0

Ungarische Bezeichnung zur Rettung. Sie können intChargeund haben fcnCharge(value), um Verwirrung zu vermeiden und keinen verrückten langen Namen hinzuzufügen, wenn drei Buchstaben gut funktionieren.

Oder Sie könnten einfach den gleichen Namen verwenden und die IDE damit umgehen lassen. Das Erstellen eines längeren oder anderen Namens kann auf lange Sicht sowieso genauso verwirrend sein.

Ryathal
quelle
+1 für die einzigartige Perspektive auf die Antwort. Leider ist die ungarische Notation nach unseren Codestil-Richtlinien ausdrücklich verboten. Das ändert nichts am möglichen Wert Ihrer Antwort, nur dass ich sie nicht als meine eigentliche Lösung verwenden kann.