Sollten Methoden, die einen Booleschen Wert zurückgeben, nach einer Frage oder einer Behauptung benannt werden? [geschlossen]

10

Viele Namenskonventionen empfehlen, dass Methoden, die einen Booleschen Wert zurückgeben (auch Prädikatmethoden genannt ), nach einer Frage benannt werden . Meine Frage ist: Bedeuten sie nicht wirklich, dass die Methoden nach einer Behauptung benannt werden sollten ?

Der Unterschied mag subtil sein, aber in einigen Fällen erhalten Sie unterschiedliche Namen:

  • Frage : is_pixel_transparent (...)
  • Behauptung : pixel_is_transparent (...)

Manchmal macht dies keinen Unterschied und die Formulierung ist dieselbe:

  • Frage : end_of_file (...)
  • Behauptung : end_of_file (...)

Außerdem scheint es die meiste Zeit so zu sein, dass das, was die Leute "Fragen" nennen, tatsächlich Behauptungen sind .

  • key_exists (...) -> das ist keine Frage, das ist eine Behauptung.
    Anwendungsbeispiel: if (key_exists (...)) ...
  • array_contains_element (...) -> das ist keine Frage, das ist eine Behauptung.
    Anwendungsbeispiel: if (array_contains_element (...)) ...

Bedeutet jeder, um die Frage noch einmal zu wiederholen, Behauptung, wenn er Frage sagt ?

Rick
quelle
3
Werden all diese Dinge, die Sie als Behauptungen bezeichnen, nicht zu Fragen, wenn Sie ein Fragezeichen hinzufügen? Key_Exists?
Pieter B
1
"Jon Skeet ist großartig" ist eine Behauptung. "Ist Jon Skeet großartig?" ist eine Frage. Sieh den Unterschied. Sieh den Unterschied?
Steven A. Lowe
@Pieter, nein, nicht in richtigem Englisch. Das Fragezeichen macht einen Satz zur Frage?
Rick
@Steven, ich denke, mein erstes Beispiel befasst sich mit der ersten Hälfte Ihres Kommentars und das zweite Beispiel mit der zweiten Hälfte. Vermisse ich etwas
Rick
@rick: Eine Zusicherung muss wahr sein, sonst befindet sich das Programm in einem undefinierten / fehlerhaften Zustand. Eine Frage kann wahr sein oder nicht. Ich betrachte es als Kontrollfehler gegen Kontrollfluss.
Steven A. Lowe

Antworten:

13

Bei Namenskonventionen geht es nicht darum, Ihren Code wie Englisch zu lesen, sodass Sie möglicherweise etwas zu viel analysieren. In vielen Sprachen ist es üblich, einer Methode oder Funktion ein Präfix voranzustellen, das ein boolesches Ergebnis oder eine boolesche Variable zurückgibt is, wenn dies sinnvoll ist. Es gibt andere Traditionen (z. B. Lisp, Ruby), bei denen ?stattdessen ein Suffix verwendet wird. (Eine ältere Lisp-Tradition ist das Suffix -pfür Prädikat ).

  • In Ihrem Beispiel für Pixeltransparenz is_transparentsollte es sich um eine Methode eines Pixelobjekts handeln. Wenn Sie sich in einer Sprache befinden, die keine Objekte enthält, aber einen OOP-Stil simulieren möchte, lautet der Typ normalerweise das Präfix : Pixel_is_transparent. Beachten Sie, dass das Präfix isnur verwendet wird, um die Boolesche Natur dieser Methode hervorzuheben . pixel.transparentDies wird bereits durch den Methodenaufruf impliziert ( funktioniert auch, dies kann jedoch bei anderen Eigenschaftsnamen zu mehrdeutig werden).
  • Um auf EOF zu testen, könnte eine Methode benannt werden at_eof. Dies interpretiert das Dateiende als Speicherort im Stream, während stream.is_eofdies ebenfalls funktionieren würde: Hier ist der EOF ein bestimmter Status.
  • Es collection.exists(key)wäre besser zu testen, ob ein Eintrag vorhanden ist .
  • array_contains_elementist kein guter Methodenname, da er einen Typ enthält und das Unnötige element. Besser : array.contains(elem).

Alle Namen, die ich vorschlage, sind Behauptungen oder genauer: Prädikate. Die Verwendung von Fragen macht sprachlich keinen Sinn, wenn diese Prädikate in einem Wenn-Dann-Sonst- Kontext verwendet werden. Das Wort " Behauptung " ist hier wahrscheinlich nicht optimal, da es verwendet wird, um das Testen von Invarianten in vielen Sprachen zu beschreiben. Das Wort Prädikat wäre besser: eine Aussage, die entweder wahr oder falsch ist. Eine Aussage wird so formuliert, als ob sie wahr wäre, nicht als Frage. Die Aussage 1 ∈ {}- " 1ist Element der leeren Menge" oder "die leere Menge enthält 1" ist eine falsche Aussage. Die Frage "Enthält die leere Menge die Nummer 1?" kann mit ja oder nein beantwortet werden, aber es ist nicht wahr oder falsch.

amon
quelle
1
+1 für den Hinweis, dass der Begriff "Behauptung" wegen möglicher Verwirrung nicht der richtige Begriff ist.
Pieter B