Boolesche Methode, die Affirmative gegen Negative nennt

43

Sollten boolesche Methoden immer die positive Form annehmen, auch wenn sie immer nur in der negativen Form verwendet werden?

Angenommen, ich wollte vor dem Erstellen einer Entität überprüfen, ob eine Entität vorhanden ist. Mein Argument ist, dass die erste Form darunter besser ist als die zweite Form, unabhängig davon, ob die Methode jemals in der positiven Form verwendet wird oder nicht.

Zusammenfassend finde ich if(!affirmative)leichter zu lesen als if(negative). Ich habe einen Kollegen, der anderer Meinung ist, Gedanken?

Erste Form:

int entity_id = 42;
if(!entity_exists(entity_id)) create_entity(entity_id);

Zweite Form:

int entity_id = 42;
if(entity_not_exist(entity_id)) create_entity(entity_id);
Lynks
quelle
3
C ++? wie wäre esif (not entity_exists(entity_id))
Kos
zu-mai-zu-mah-zu. Ehrlich gesagt habe ich das !Zeichen so oft verpasst, dass ich den Code falsch verstanden habe, bis ich ihn erneut gelesen habe. Deshalb stimme ich wahrscheinlich eher Ihrem Kollegen zu. Ich mag das Formular, das als wahr bewertet wird, wenn Sie es untersuchen.
Berin Loritsch
Ich wollte mich nur einmischen, if (!exists) create()um zu sagen, dass dies in vielen Sprachen / Frameworks als eine schlechte Praxis angesehen werden kann, da es tendenziell nicht threadsicher ist. Normalerweise besteht der bevorzugte Ansatz darin, create()bestimmte Ausnahmen oder Rückkehrcodes aufzurufen und zu verarbeiten, die besagen, dass die Entität bereits vorhanden ist. Dies ist natürlich keine Antwort auf die eigentliche Frage (weshalb es sich nur um einen Kommentar handelt).
Julealgon

Antworten:

61

Sollten boolesche Methoden immer die positive Form annehmen, auch wenn sie immer nur in der negativen Form verwendet werden?

Regeln über solche Dinge zu machen, scheint ein bisschen viel zu sein - ich möchte keine Richtlinie in einem Kodierungsstandarddokument sehen, die besagt, dass Sie keine negativen Namen für boolesche Eigenschaften verwenden sollen . Aber aus persönlichen Gründen denke ich, dass der Versuch, die Namen positiv zu halten, ein gutes Ideal sein könnte. Ich denke jedoch, dass es auch gut ist, die Notwendigkeit für diese dünne und leicht zu übersehende zu vermeiden !. Man kann oft Wege finden, einen negativen Namen in einen positiven zu verwandeln:

  • accountHasCharges
  • accountIsClear(wie !accountHasCharges)

Klarheit ist die wichtigste Überlegung, und ein guter Grund, negative Methodennamen zu vermeiden, besteht darin, dass sie zu Doppelnegativen oder Schlimmerem führen können:

  • isComplete // okay
  • isNotComplete //! isComplete ist normalerweise besser
  • isIncomplete // könnte Sinn machen, wenn 'unvollständig' ein bekannter Zustand des Objekts ist
  • !isNotComplete // schrecklich
  • !isNotComplete == 0 // Kann zu einem dauerhaften Urlaub führen
Caleb
quelle
5
"Ich möchte keine Richtlinie in einem Kodierungsstandarddokument sehen, die besagt, dass Sie keine negativen Namen für boolesche Eigenschaften verwenden sollen ." - Ich lasse das hier ...
AakashM
16
Du hast vergessen!isNotIncomplete
Ben Lee
So wäre das Gegenteil von dem entity_existssein entity_should_be_created(statt entity_not_exists)? Oder vielleicht entity_missingnach Dans Vorschlag?
ADTC
1
Hier kann ein Kodierungsstandarddokument das Wort "bevorzugen" anstelle von "sollten" oder "müssen" verwenden.
Wayne Conrad
15

Ich stimme zu, dass die Aussage leichter zu lesen ist. Du könntest es versuchen

Dritte Form

int entity_id = 42;
if (entity_is_missing(entity_id)) create_entity(entity_id);

oder

Vierte Form

int entity_id = 42;
if (is_entity_missing(entity_id)) create_entity(entity_id);
Dan Pichelman
quelle
2

Es hängt auch davon ab, wie Ihre Methode angewendet wird. Wenn es sowohl im positiven als auch im negativen Fall verwendet werden soll, z

if (!entity_exists(entity_id)) create_entity(entity_id);

if (entity_exists(entity_id)) publish_entity(entity_id);

Dann sollte der Methodenname positiv sein, wie oben. Wenn Sie sich nicht sicher sind, wie es verwendet werden soll, halten Sie sich an die obigen Anweisungen.

Aber wenn es NUR im negativen Fall verwendet wird, ist das Folgende akzeptabel (vielleicht sogar wünschenswert)

if (entity_not_exists(entity_id)) create_entity(entity_id);

oder noch besser umformulieren, um mehr zu bejahen

if (entity_is_absent(entity_id)) create_entity(entity_id);
Zack Xu
quelle