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);
if (not entity_exists(entity_id))
!
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.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ływaniecreate()
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).Odpowiedzi:
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ądkuisNotComplete
//! isComplete jest zwykle lepszyisIncomplete
// może mieć sens, jeśli „niekompletny” jest znanym stanem obiektu!isNotComplete
// okropny!isNotComplete == 0
// może prowadzić do stałych wakacjiźródło
!isNotIncomplete
entity_exists
byłobyentity_should_be_created
(zamiastentity_not_exists
)? A możeentity_missing
zgodnie z sugestią Dana?Zgadzam się, że twierdzenie jest łatwiejsze do odczytania. Możesz spróbować
Trzecia forma
lub
Czwarta forma
źródło
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
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)
lub jeszcze lepiej przeredaguj to, aby było bardziej twierdzące
źródło