Frage Boolesche Methode zur Benennung von Lesbarkeit


Einfache Frage, aus Gründen der Lesbarkeit, welchen Methodennamen bevorzugen Sie für eine boolesche Methode:

public boolean isUserExist(...)

oder:

public boolean doesUserExist(...)

oder:

public boolean userExists(...)

75
2017-10-14 14:42


Ursprung


Antworten:


public boolean userExists(...)

Würde mir lieber sein. Da es Ihre bedingten Prüfungen viel mehr wie natürliches Englisch macht:

if userExists ...

Aber ich denke, es gibt keine feste Regel - sei nur konsequent


69
2017-10-14 14:45



ich würde sagen userExists, denn in 90% der Fälle wird mein Code wie folgt aussehen:

if userExists(...) {
  ...
}

und es liest sich sehr wörtlich in Englisch.

if isUserExist und if doesUserExist scheinen überflüssig zu sein.


31
2017-10-14 14:46



Das Ziel für die Lesbarkeit sollte immer darin bestehen, Code so naturnah wie möglich zu schreiben. Also in diesem Fall userExists scheint die beste Wahl zu sein. Die Verwendung des Präfixes "is" kann beispielsweise in anderen Situationen dennoch richtig sein isProcessingComplete.


14
2017-10-14 14:53



Hüten Sie sich vor dem Opfer Klarheit während jagen Lesbarkeit.

Obwohl if (user.ExistsInDatabase(db)) liest besser als if (user.CheckExistsInDatabase(db))Betrachten Sie den Fall einer Klasse mit einem Builder-Muster (oder einer Klasse, für die Sie einen Status festlegen können):

user.WithName("Mike").ExistsInDatabase(db).ExistsInDatabase(db2).Build();

Es ist nicht klar, ob ExistsInDatabase überprüft, ob es existiert oder die Tatsache setzt, dass es existiert. Du würdest nicht schreiben if (user.Age()) oder if (user.Name()) ohne Vergleichswert, also warum if (user.Exists()) eine gute Idee, nur 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 schlecht, demselben Muster zu folgen, das wir auch für andere Typen als boolesche verwenden?

Mit anderen Arten, ein if Die Anweisung vergleicht den Rückgabewert einer Funktion mit einem Wert im Code. Daher sieht der Code ungefähr so ​​aus:

if (user.GetAge() >= 18) ...

Das liest sich wie "Wenn Benutzer Punkt Alter erhalten ist größer als oder gleich 18 ..." wahr - es ist nicht "natürlich Englisch", aber ich würde das argumentieren object.verb nie wie natürliches Englisch und dies ist einfach eine grundlegende Facette der modernen Programmierung (für viele Mainstream-Sprachen). Programmierer haben im Allgemeinen kein Problem, die obige Aussage zu verstehen, also ist das Folgende schlimmer?

if (user.CheckExists() == true)

Was normalerweise auf verkürzt wird

if (user.CheckExists())

Gefolgt von dem fatalen Schritt

if (user.Exists())

Während gesagt wurde, dass "Code 10x öfter gelesen wird als geschrieben", ist es auch sehr wichtig, dass Bugs leicht zu erkennen sind. Angenommen, Sie hätten eine Funktion mit dem Namen Exists (), die bewirkt, dass das Objekt existiert, und gibt basierend auf dem Erfolg wahr / falsch zurück. Sie konnten den Code leicht sehen if (user.Exists()) und nicht den Fehler erkennen - der Fehler wäre sehr viel offensichtlicher, wenn der Code gelesen würde if (user.SetExists()) beispielsweise.

Darüber hinaus könnte user.Exists () leicht komplexen oder ineffizienten Code enthalten, um in einer Datenbank zu stöbern, um etwas zu überprüfen. user.CheckExists () macht deutlich, dass die Funktion etwas tut.

Siehe auch alle Antworten hier: Namenskonventionen: Was ist eine Methode, die einen booleschen Wert zurückgibt?

Als letzte Anmerkung - nach "Tell Do not Ask" verschwinden viele der Funktionen, die wahr / falsch zurückgeben, und anstatt ein Objekt nach seinem Zustand zu fragen, sagst du ihm, dass er etwas tun soll, was er anders machen kann Wege basierend auf seinem Zustand.


11
2017-09-09 15:59



Ich würde mit userExists () gehen, weil 1) es in natürlicher Sprache sinnvoll ist und 2) es die Konventionen der APIs, die ich gesehen habe, befolgt.

Um zu sehen, ob es in natürlicher Sprache Sinn macht, lies es laut. "Wenn der Benutzer existiert" klingt eher wie eine gültige englische Phrase als "wenn es einen Benutzer gibt" oder "wenn ein Benutzer existiert". "Wenn der Benutzer existiert" wäre besser, aber "der" ist wahrscheinlich in einem Methodennamen überflüssig.

Um zu sehen, ob eine Datei in Java SE 6 existiert, würden Sie das tun benutze File.exists (). Das sieht so aus, als wäre es das Gleiche in Version 7. C # verwendet die gleiche Konventionwie auch Python und Rubin. Hoffentlich ist dies eine genügend vielfältige Sammlung, um dies als sprachunabhängige Antwort zu bezeichnen. Im Allgemeinen würde ich mit Naming-Methoden im Einklang mit der API Ihrer Sprache Seite.


8
2018-01-15 03:19



Es gibt Dinge zu beachten, von denen ich denke, dass sie hier von mehreren anderen Antworten übersehen wurden

  1. Es hängt davon ab, ob es sich um eine C ++ - Klassenmethode oder eine C-Funktion handelt. Wenn dies eine Methode ist, wird sie wahrscheinlich aufgerufen if (user.exists()) { ... } oder if (user.isExisting()) { ... }
    nicht if (user_exists(&user)) . Dies ist der Grund für die Kodierung von Standards, dass State Bool-Methoden mit einem Verb beginnen sollten, da sie wie ein Satz gelesen werden, wenn sich das Objekt vor ihnen befindet.

  2. Leider geben viele alte C-Funktionen 0 für Erfolg und nicht Null für Fehler zurück, so dass es schwierig sein kann, den verwendeten Stil zu bestimmen, es sei denn, Sie folgen den bool-Funktionen mit Verben beginnen oder immer mit true vergleichen if (true == user_exists(&user))


5
2017-09-22 04:56



Meine einfache Regel zu dieser Frage ist diese:

Wenn die boolesche Methode bereits ein Verb enthält, fügen Sie kein Verb hinzu. Ansonsten, überlege es dir. Einige Beispiele:

$user->exists()
$user->loggedIn()
$user->isGuest() // "is" added

2
2017-07-07 19:56



Ich mag eins von diesen:

userExists(...)
isUserNameTaken(...)
User.exists(...)
User.lookup(...) != null

1
2017-10-14 14:48



Rein subjektiv.

ich bevorzuge userExists(...) weil dann Aussagen wie diese besser lesen:

if ( userExists( ... ) )

oder

while ( userExists( ... ) )

1
2017-10-14 14:47