Lesbarkeit der Booleschen Methode

119

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(...)
Yuval Adam
quelle
21
Das erste klingt wieisBabbyFormed
Kommt auf die Sprache an. Unterschiedliche Sprachen haben unterschiedliche Konventionen. Java und Objective C kommen mir in den Sinn. Auch subjektiv grenzwertig.
Jed Smith
Subjektiv - fair genug
Yuval Adam
2
Rein subjektiv. getUserExistence, userIsNotExtinct, userHasExistentialStateEtc ...
dreamlax
Sartre wäre stolz
Cornel Masson

Antworten:

111
public boolean userExists(...)

Wäre mein Vorzug. Da es Ihre bedingten Prüfungen weitaus mehr wie natürliches Englisch macht:

if userExists ...

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

Martin
quelle
3
"macht Ihren {Methodenaufruf} viel mehr wie natürliches Englisch" klingt nach einem großartigen Test für rationelles Benennen auf ganzer Linie. klärte mein Denken in dieser Angelegenheit - danke!
Cori
16
Auf der anderen Seite klingt "userExists ()" isoliert oder wenn es nicht unmittelbar auf "if" folgt, eher nach einer Tatsachenfeststellung als nach der Frage, als die es gedacht war. Im Gegensatz zu "IsUserExisting ()" oder "DoesUserExist ()", das die englischen Regeln für die Wortreihenfolge in natürlicher Sprache für einfache Fragen befolgt.
Oskar Berggren
4
..aber warum sollten Methoden, die einen Bool zurückgeben, außerhalb von verwendet werden if? Wenn sie Nebenwirkungen haben, riecht das noch mehr. if IsUserExisting()und if DoesUserExist()sieht schrecklich aus und sollte vermieden werden.
RJFalconer
@RJFalconer Manchmal müssen Sie das Ergebnis dieser Methode an mehreren Stellen verwenden, damit Sie es der Variablen zuweisen können. userExistsWelchen Namen der Variablen werden Sie deklarieren, da die Methode aufgerufen wird? userExistsist gut für Variablen, nicht für Methoden. Wie @Oskar schrieb - es klingt wie eine Aussage, keine Frage.
Jarosław Wlazło
Welche Situation bevorzugen Sie in Situationen, in denen ein Subjekt, ein Prädikat und ein Objekt vorhanden sein müssen, z. B. UserSessionIsComplete oder IsUserSessionComplete?
Yang
40

Ich würde sagen userExists, weil mein Anrufcode in 90% der Fälle so aussieht:

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

und es liest sich sehr wörtlich in Englisch.

if isUserExistund if doesUserExistscheinen überflüssig.

Kai
quelle
17

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 als if (user.CheckExistsInDatabase(db)):

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

Es ist nicht klar, ob ExistsInDatabasegeprüft wird, ob es existiert oder ob es existiert. Sie würden nicht schreiben if (user.Age())oder if (user.Name())ohne Vergleichswert. Warum ist if (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 ifvergleicht eine Anweisung den Rückgabewert einer Funktion mit einem Wert im Code, sodass der Code ungefähr so ​​aussieht:

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

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.verbnie 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?

if (user.CheckExists() == true)

Welches ist normalerweise verkürzt auf

if (user.CheckExists())

Gefolgt von dem tödlichen Schritt

if (user.Exists())

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 Code if (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.

Michael Parker
quelle
2
> Suppose you had a function called Exists() which causes the object to existDas ist schon ein Problem. Eine solche Methode sollte ein Verb sein, wie Create. Zumindest wäre es so Exist, 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.
RJFalconer
@RJFalconer Most developersist dort der Schlüssel zu Ihrem Satz. Ich würde sagen, all developerswäre überrascht, wenn CheckExists()etwas anderes als zu überprüfen, ob etwas existiert. Es ist nicht so, dass Exists()es ein schrecklicher Name ist, nur dass CheckExists()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.
Michael Parker
Ja, die Frage betrifft das beste Namensmuster, ABER für die booleschen Methoden. Bool-Methoden sind einzigartig und haben ihren eigenen gemeinsamen Namen - Prädikat. Sie sollten sie nicht wie andere Funktionen behandeln. Das Einfügen eines Verbs neben die Frage in den Namen der booleschen Methode ist überflüssig. Dies wirkt sich negativ auf die Lesbarkeit des Codes aus. Das Benennen von booleschen Methoden in Form von Fragen ohne Verben wird in der Branche als Best Practice akzeptiert. Beispiele: docs.microsoft.com/en-us/dotnet/api/system.io.file.exists developer.android.com/reference/java/io/File#exists ()
Almir
@Almir File.Exists ist ein extrem alter Aufruf (mindestens dot net 1.1) und kein gutes Beispiel für moderne Lesbarkeitsstandards. In der modernen Dot-Net-Core-API finden Sie modernere Beispiele dafür, wie Microsoft zustimmt: github.com/dotnet/sdk , einige zufällige Beispiele Link Link Link
Michael Parker
15

Das Ziel für die Lesbarkeit sollte immer sein, Code zu schreiben, der der natürlichen Sprache am nächsten kommt. In diesem Fall userExistsscheint dies die beste Wahl zu sein. Die Verwendung des Präfixes "is" kann beispielsweise in anderen Situationen dennoch richtig sein isProcessingComplete.

Konamiman
quelle
1
Ist für Ihr zweites Beispiel ProcessingIsCompletenäher an natürlichen Sprachen? Zum Beispiel: if (ProcessingIsComplete ())
Yang
9

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.

David
quelle
5

Es gibt Dinge zu beachten, die meiner Meinung nach von mehreren anderen Antworten hier übersehen wurden

  1. 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()) { ... }oder if (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.

  2. 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))

Lee Ballard
quelle
5

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:

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

Rein subjektiv.

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

if ( userExists( ... ) )

oder

while ( userExists( ... ) )
zumalifeguard
quelle
1

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 ...

Dana
quelle
1

Ich mag eines davon:

userExists(...)
isUserNameTaken(...)
User.exists(...)
User.lookup(...) != null
John Kugelman
quelle
0

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.

Yuan
quelle
0

Warum benennen Sie die Immobilie dann nicht um?

if (user.isPresent()) {
Artem Lukanin
quelle