Einfache Frage, unter dem Gesichtspunkt der Lesbarkeit, welchen Methodennamen Sie für eine boolesche Methode bevorzugen:
public boolean isUserExist(...)
oder:
public boolean doesUserExist(...)
oder:
public boolean userExists(...)
api
naming-conventions
readability
Yuval Adam
quelle
quelle
isBabbyFormed
getUserExistence
,userIsNotExtinct
,userHasExistentialState
Etc ...Antworten:
Wäre mein Vorzug. Da es Ihre bedingten Prüfungen weitaus mehr wie natürliches Englisch macht:
Aber ich denke, es gibt keine feste Regel - sei einfach konsequent
quelle
if
? Wenn sie Nebenwirkungen haben, riecht das noch mehr.if IsUserExisting()
undif DoesUserExist()
sieht schrecklich aus und sollte vermieden werden.userExists
Welchen Namen der Variablen werden Sie deklarieren, da die Methode aufgerufen wird?userExists
ist gut für Variablen, nicht für Methoden. Wie @Oskar schrieb - es klingt wie eine Aussage, keine Frage.Ich würde sagen
userExists
, weil mein Anrufcode in 90% der Fälle so aussieht:und es liest sich sehr wörtlich in Englisch.
if isUserExist
undif doesUserExist
scheinen überflüssig.quelle
Achten Sie darauf, dass Sie nicht auf Klarheit verzichten, während Sie die Lesbarkeit verbessern .
Betrachten Sie den Fall einer Klasse mit einem Builder-Muster (oder einer Klasse, für die Sie den Status festlegen können), obwohl dies
if (user.ExistsInDatabase(db))
besser liest alsif (user.CheckExistsInDatabase(db))
:user.WithName("Mike").ExistsInDatabase(db).ExistsInDatabase(db2).Build();
Es ist nicht klar, ob
ExistsInDatabase
geprüft wird, ob es existiert oder ob es existiert. Sie würden nicht schreibenif (user.Age())
oderif (user.Name())
ohne Vergleichswert. Warum istif (user.Exists())
eine gute Idee nur deshalb so, weil diese Eigenschaft / Funktion vom booleschen Typ ist und Sie die Funktion / Eigenschaft umbenennen können, um mehr wie natürliches Englisch zu lesen? Ist es so schlimm, dem gleichen Muster zu folgen, das wir für andere Typen als Boolesche Werte verwenden?Bei anderen Typen
if
vergleicht eine Anweisung den Rückgabewert einer Funktion mit einem Wert im Code, sodass der Code ungefähr so aussieht:Was lautet: "Wenn der Benutzer das Alter des Punktes 18 größer oder gleich 18 erreicht ..." stimmt - es ist kein "natürliches Englisch", aber ich würde argumentieren, dass es
object.verb
nie dem natürlichen Englisch ähnelte und dies ist einfach eine grundlegende Facette der modernen Programmierung (z viele gängige Sprachen). Programmierer haben im Allgemeinen kein Problem damit, die obige Aussage zu verstehen. Ist das Folgende also noch schlimmer?Welches ist normalerweise verkürzt auf
Gefolgt von dem tödlichen Schritt
Während gesagt wurde, dass "Code 10x häufiger gelesen als geschrieben wird", ist es auch sehr wichtig, dass Fehler leicht zu erkennen sind. Angenommen, Sie hatten eine Funktion namens Exists (), die bewirkt, dass das Objekt existiert, und basierend auf dem Erfolg true / false zurückgibt. Sie könnten den Code leicht sehen
if (user.Exists())
und den Fehler nicht erkennen - der Fehler wäre sehr viel offensichtlicher, wenn der Codeif (user.SetExists())
zum Beispiel gelesen würde .Darüber hinaus kann user.Exists () leicht komplexen oder ineffizienten Code enthalten, der in eine Datenbank ausgelöst wird, um etwas zu überprüfen. user.CheckExists () macht deutlich, dass die Funktion etwas tut.
Siehe auch alle Antworten hier: Namenskonventionen: Wie soll eine Methode benannt werden, die einen Booleschen Wert zurückgibt?
Als letzte Anmerkung - nach "Tell Don't Ask" verschwinden viele der Funktionen, die true / false zurückgeben, ohnehin. Anstatt ein Objekt nach seinem Status zu fragen, weisen Sie es an, etwas zu tun, was es auf andere Weise tun kann Wege basierend auf seinem Zustand.
quelle
Suppose you had a function called Exists() which causes the object to exist
Das ist schon ein Problem. Eine solche Methode sollte ein Verb sein, wieCreate
. Zumindest wäre es soExist
, aber "existieren" als Verb wird selten verwendet.It's not clear if ExistsInDatabase is checking whether it does exist, or setting the fact that it does exist.
Es ist sehr klar. Ich würde behaupten, dass die meisten Entwickler überrascht wären, wenn dies etwas anderes tun würde, als nur einen Booleschen Wert zurückzugeben.Most developers
ist dort der Schlüssel zu Ihrem Satz. Ich würde sagen,all developers
wäre überrascht, wennCheckExists()
etwas anderes als zu überprüfen, ob etwas existiert. Es ist nicht so, dassExists()
es ein schrecklicher Name ist, nur dassCheckExists()
es ein besserer Name ist, und diese Frage stellt im Allgemeinen die Frage, was das beste Namensmuster ist. Die Antwort ist, es wie jede andere Funktion zu behandeln, den Namen mit einem Verb zu beginnen und kein anderes Muster zu verwenden, nur weil es einen Booleschen Wert zurückgibt.Das Ziel für die Lesbarkeit sollte immer sein, Code zu schreiben, der der natürlichen Sprache am nächsten kommt. In diesem Fall
userExists
scheint dies die beste Wahl zu sein. Die Verwendung des Präfixes "is" kann beispielsweise in anderen Situationen dennoch richtig seinisProcessingComplete
.quelle
ProcessingIsComplete
näher an natürlichen Sprachen? Zum Beispiel: if (ProcessingIsComplete ())Ich würde mich für userExists () entscheiden, weil 1) es in natürlicher Sprache sinnvoll ist und 2) es den Konventionen der APIs folgt, die ich gesehen habe.
Um zu sehen, ob es in natürlicher Sprache Sinn macht, lesen Sie es laut vor. "Wenn Benutzer existiert" klingt eher nach einer gültigen englischen Phrase als nach "Wenn Benutzer existiert" oder "Wenn Benutzer existiert". "Wenn der Benutzer existiert" wäre besser, aber "the" ist in einem Methodennamen wahrscheinlich überflüssig.
Um festzustellen, ob eine Datei in Java SE 6 vorhanden ist, verwenden Sie File.exists () . Dies scheint in Version 7 dasselbe zu sein . C # verwendet dieselbe Konvention wie Python und Ruby . Hoffentlich ist diese Sammlung so vielfältig, dass sie als sprachunabhängige Antwort bezeichnet werden kann. Im Allgemeinen würde ich mich für Benennungsmethoden einsetzen, die der API Ihrer Sprache entsprechen.
quelle
Es gibt Dinge zu beachten, die meiner Meinung nach von mehreren anderen Antworten hier übersehen wurden
Es hängt davon ab, ob dies eine C ++ - Klassenmethode oder eine C-Funktion ist. Wenn dies eine Methode ist, wird sie wahrscheinlich aufgerufen
if (user.exists()) { ... }
oderif (user.isExisting()) { ... }
nicht
if (user_exists(&user))
. Dies ist der Grund für Codierungsstandards, dass State-Bool-Methoden mit einem Verb beginnen sollten, da sie wie ein Satz gelesen werden, wenn sich das Objekt vor ihnen befindet.Leider geben viele alte C-Funktionen 0 für Erfolg und ungleich Null für Fehler zurück, so dass es schwierig sein kann, den verwendeten Stil zu bestimmen, es sei denn, Sie folgen allen Bool-Funktionen, die mit Verben beginnen oder immer mit true vergleichen
if (true == user_exists(&user))
quelle
Meine einfache Regel für diese Frage lautet:
Wenn die boolesche Methode bereits ein Verb enthält, fügen Sie keines hinzu. Ansonsten bedenke es. Einige Beispiele:
quelle
Rein subjektiv.
Ich bevorzuge,
userExists(...)
weil dann Aussagen wie diese besser lesen:oder
quelle
In diesem speziellen Fall ist das erste Beispiel ein so schreckliches Englisch, dass ich zusammenzucken muss.
Ich würde mich wahrscheinlich für Nummer drei entscheiden, weil es sich anhört, wenn ich es in if-Anweisungen einlese. "Wenn Benutzer existiert" klingt besser als "Wenn Benutzer existiert".
Dies setzt voraus, dass es verwendet wird, wenn Anweisungstests natürlich ...
quelle
Ich mag eines davon:
quelle
Methodennamen dienen der Lesbarkeit. Nur diejenigen, die in Ihren gesamten Code passen, sind die besten. In den meisten Fällen beginnt sie mit Bedingungen, sodass subjectPredicate der natürlichen Satzstruktur folgt.
quelle
Warum benennen Sie die Immobilie dann nicht um?
quelle