Metoda logiczna Naming Affirmative vs Negative

43

Czy metody boolowskie powinny zawsze przyjmować formę twierdzącą, nawet jeśli kiedykolwiek będą stosowane tylko w formie negatywnej?

Powiedzmy, że chciałem sprawdzić, czy istnienie istnieje przed utworzeniem jednego, moim argumentem jest to, że pierwsza forma poniżej jest lepsza niż druga forma, niezależnie od tego, czy metoda jest kiedykolwiek używana w formie twierdzącej.

Podsumowując, uważam, że jest if(!affirmative)łatwiejszy do odczytania niż if(negative). Mam kolegę, który się nie zgadza, myśli?

Pierwsza forma:

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

Druga forma:

int entity_id = 42;
if(entity_not_exist(entity_id)) create_entity(entity_id);
rysie
źródło
3
C ++? co powiesz na if (not entity_exists(entity_id))
Kos
to-may-to-mah-to. Szczerze mówiąc, tęskniłem za !postacią tyle razy, co spowodowało, że źle zrozumiałem kod, dopóki nie przeczytałem go ponownie. Prawdopodobnie więc bardziej zgadzam się z twoim współpracownikiem. Podoba mi się forma, która sprawdza się jako prawdziwa, kiedy ją analizujesz.
Berin Loritsch,
Chciałem tylko powiedzieć, że if (!exists) create()może to być postrzegane jako zła praktyka w wielu językach / frameworkach, ponieważ zwykle nie jest bezpieczne dla wątków. Zazwyczaj preferowanym podejściem jest wywoływanie create()i obsługa określonych wyjątków lub kodów zwrotnych informujących, że jednostka już istnieje. To oczywiście nie jest odpowiedź na rzeczywiste pytanie (dlatego jest to tylko komentarz).
julealgon

Odpowiedzi:

61

Czy metody boolowskie powinny zawsze przyjmować formę twierdzącą, nawet jeśli kiedykolwiek będą stosowane tylko w formie negatywnej?

Ustanawianie zasad dotyczących takich rzeczy wydaje się trochę zbyt duże - nie chciałbym widzieć wytycznej w dokumencie standardów kodowania, który mówi, że nie należy używać negatywnych nazw dla właściwości boolowskich . Ale ze względu na osobisty styl, myślę, że utrzymanie pozytywnych nazwisk może być świetnym ideałem. Myślę jednak, że dobrze jest też unikać potrzeby tego chudego i łatwego do pominięcia !. Często można znaleźć sposoby na przekształcenie negatywnego imienia w pozytywne:

  • accountHasCharges
  • accountIsClear(to samo co !accountHasCharges)

Jasność jest najważniejszym czynnikiem, a dobrym powodem do unikania negatywnych nazw metod jest to, że mogą one prowadzić do podwójnych negatywnych lub gorszych:

  • isComplete // w porządku
  • isNotComplete //! isComplete jest zwykle lepszy
  • isIncomplete // może mieć sens, jeśli „niekompletny” jest znanym stanem obiektu
  • !isNotComplete // okropny
  • !isNotComplete == 0 // może prowadzić do stałych wakacji
Caleb
źródło
5
„Nie chciałbym widzieć wytycznych w dokumencie standardów kodowania, który mówi, że nie należy używać negatywnych nazw dla właściwości logicznych ”. - Zostawię to tutaj ...
AakashM
16
Zapomniałeś!isNotIncomplete
Ben Lee
Czy więc przeciwieństwo entity_existsbyłoby entity_should_be_created(zamiast entity_not_exists)? A może entity_missingzgodnie z sugestią Dana?
ADTC
1
Tutaj dokument standardu kodowania może używać słowa „preferuj” zamiast „powinien” lub „musi”.
Wayne Conrad,
15

Zgadzam się, że twierdzenie jest łatwiejsze do odczytania. Możesz spróbować

Trzecia forma

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

lub

Czwarta forma

int entity_id = 42;
if (is_entity_missing(entity_id)) create_entity(entity_id);
Dan Pichelman
źródło
2

To zależy również od tego, w jaki sposób będzie używana twoja metoda. Jeśli będzie stosowany zarówno w przypadku twierdzącym, jak i negatywnym, np

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

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

Następnie nazwa metody powinna być twierdząca, jak powyżej. Jeśli nie masz pewności, jak to będzie wykorzystane, trzymaj się powyższego.

Ale jeśli jest używany TYLKO w przypadku negatywnym, to następujące jest dopuszczalne (może nawet pożądane)

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

lub jeszcze lepiej przeredaguj to, aby było bardziej twierdzące

if (entity_is_absent(entity_id)) create_entity(entity_id);
Zack Xu
źródło