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 ExistsInDatabase
geprü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 if
vergleicht 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.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?
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.
isBabbyFormed