it-swarm.com.de

Lesbarkeit von booleschen Methodenbezeichnungen

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

public boolean isUserExist(...)

oder:

public boolean doesUserExist(...)

oder:

public boolean userExists(...)
99
Yuval Adam
public boolean userExists(...)

Wäre mir lieber. Da es Ihre bedingten Prüfungen weit mehr wie natürliches Englisch macht:

if userExists ...

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

92
Martin

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

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

und es liest sich sehr wörtlich in Englisch.

if isUserExist und if doesUserExist scheinen überflüssig.

34
Kai

Das Ziel für die Lesbarkeit sollte immer darin bestehen, Code zu schreiben, der der natürlichen Sprache am nächsten kommt. In diesem Fall scheint userExists die beste Wahl zu sein. Die Verwendung des Präfixes "is" kann jedoch in anderen Situationen richtig sein, zum Beispiel isProcessingComplete.

14
Konamiman

Achten Sie darauf, die Klarheit zu opfern , während Sie der Lesbarkeit nachjagen .

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

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

Es ist nicht klar, ob ExistsInDatabase überprüft, ob es existiert, oder ob die Tatsache, dass es existiert, festgelegt wird. Sie würden if (user.Age()) oder if (user.Name()) nicht ohne Vergleichswert schreiben. Warum ist if (user.Exists()) also eine gute Idee, nur weil diese Eigenschaft/Funktion vom Booleschen Typ ist und Sie kann die Funktion/Eigenschaft umbenennen, 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 verwenden?

Bei anderen Typen vergleicht eine if -Anweisung den Rückgabewert einer Funktion mit einem Wert im Code, sodass der Code ungefähr so ​​aussieht:

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

Was so lautet: "Wenn Benutzerpunktalter größer oder gleich 18 ist ...", stimmt das - es ist kein "natürliches Englisch", aber ich würde argumentieren, dass object.verb Niemals einem natürlichen Englisch ähnelt und dies einfach ein grundlegendes ist Facette der modernen Programmierung (für viele gängige Sprachen). Programmierer haben im Allgemeinen kein Problem damit, die obige Aussage zu verstehen. Ist die folgende Aussage also noch schlimmer?

if (user.CheckExists() == true)

Welches ist normalerweise zu verkürzt

if (user.CheckExists())

Gefolgt von dem tödlichen Schritt

if (user.Exists())

Es wurde zwar gesagt, dass "Code 10-mal häufiger gelesen wird als geschrieben", aber es ist 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 leicht den Code if (user.Exists()) sehen und den Fehler nicht erkennen - der Fehler wäre sehr viel offensichtlicher, wenn der Code zum Beispiel if (user.SetExists()) lesen würde.

Darüber hinaus kann user.Exists () leicht komplexen oder ineffizienten Code enthalten, der eine Datenbank abfragt, um etwas zu überprüfen. user.CheckExists () macht deutlich, dass die Funktion etwas bewirkt.

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 ohnehin viele der Funktionen, die true/false zurückgeben, und anstatt ein Objekt nach seinem Status zu fragen, fordern Sie es auf, etwas zu tun, was es auf andere Weise tun kann Wege basierend auf seinem Zustand.

13
Michael Parker

Ich würde mit userExists () gehen, weil 1) es in natürlicher Sprache Sinn macht und 2) den Konventionen der APIs folgt, die ich gesehen habe.

Um festzustellen, 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 zu sehen, ob eine Datei in Java SE 6 vorhanden ist, würden Sie mit File.exists () . Dies sieht so aus, als würde es gleich sein in der Version) 7 . C # verwendet die gleiche Konvention , ebenso wie Python und Ruby sprachunabhängige Antwort: Im Allgemeinen würde ich mich für Benennungsmethoden einsetzen, die der API Ihrer Sprache entsprechen.

8
David

Es gibt Dinge zu beachten, die meiner Meinung nach von mehreren anderen Antworten hier ü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 if (user.exists()) { ... } oder if (user.isExisting()) { ... } heißen.
    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 zurück, wenn sie erfolgreich sind, und nicht Null, wenn sie nicht erfolgreich sind. Daher kann es schwierig sein, den verwendeten Stil zu bestimmen, es sei denn, Sie befolgen alle Bool-Funktionen, beginnen mit Verben oder vergleichen immer mit true wie folgt if (true == user_exists(&user))

5
Lee Ballard

Meine einfache Regel zu dieser Frage lautet:

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
3
Jonathan

Rein subjektiv.

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

if ( userExists( ... ) )

oder

while ( userExists( ... ) )
1
zumalifeguard

In diesem speziellen Fall ist das erste Beispiel so schreckliches Englisch, dass ich zusammenzucke.

Ich würde mich wahrscheinlich für Nummer drei entscheiden, weil es sich so anhört, wenn ich if-Anweisungen einlese. "Wenn Benutzer existiert" klingt besser als "Wenn Benutzer existiert".

Dies setzt voraus, dass es natürlich in if-Anweisungstests verwendet wird ...

1
Dana

Ich mag eines von diesen:

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

Methodennamen dienen der Lesbarkeit, nur diejenigen, die in Ihren gesamten Code passen, wären am besten geeignet. Meist beginnt dies mit Bedingungen, sodass subjectPredicate der natürlichen Satzstruktur folgt.

0
Yuan

Warum benennen Sie die Eigenschaft dann nicht um?

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