Jestem nowy w Ruby i byłem zaskoczony, gdy dowiedziałem się, że wszystkie przedmioty są prawdziwe oprócz zera i fałszu. Nawet 0 jest prawdą.
Zaletą tej właściwości języka jest to, że możesz pisać:
if !variable
# do stuff when variable is nil
end
Moi koledzy, którzy są bardziej doświadczonymi programistami Ruby, nalegają, żebym wybrał to zamiast używać .nil? tak:
if variable.nil?
# do stuff when variable is nil
end
Uważam jednak, że ta druga opcja jest lepsza z dwóch powodów: 1. Myślę, że jest bardziej zorientowana obiektowo, szczególnie w języku takim jak Ruby, w którym wszystko jest przedmiotem i wymianą wiadomości. 2. Moim zdaniem jest bardziej czytelny, nawet jeśli jest mniej zwarty.
Czy popełniam tutaj błąd „początkujący”?
coding-style
ruby
null
Javier Holguera
źródło
źródło
Odpowiedzi:
Napisz, co masz na myśli. Znaczy to, co piszesz.
Weźmy inny test.
.vowel?
vs
Teraz jest oczywiste, że nie robią tego samego. Ale jeśli tylko spodziewa
char
sięa
czyb
to będzie działać. Ale to dezorientuje następnego programistę - drugi blok zostanie wprowadzony dla warunków, w których[eiou]
również występuje char . Ale naa
to będzie działać poprawnie.Tak, tak jest
nil
ifalse
są jedynymi wartościami fałszowania w Ruby. Jeśli jednak testujesz,nil
testującnil || false
, nie masz na myśli tego.Oznacza to, że następny programista (który akurat jest szalonym mordercą z siekierą, który zna twój adres domowy) przeczyta kod i zastanowi się, dlaczego też
false
tam powinien się udać.Napisz kod, który przekazuje dokładnie to , co masz na myśli.
źródło
Rozważ następujące:
response = responses.to_a.first
Zwróci pierwszy element
responses
lubnil
. Następnie, ponieważ instrukcje warunkowe traktujemynil
jakfalse
możemy napisać:Który jest bardziej czytelny niż:
if (object)
Wzór jest bardzo często w kodzie Ruby. Ładnie prowadzi również do refaktoryzacji, np .:Pamiętaj również, że metoda Ruby
nil
domyślnie zwraca wartość. Więc:można uprościć:
Abyśmy mogli dalej refaktoryzować:
Teraz możesz argumentować, że powrót
nil
nie zawsze jest najlepszym pomysłem, ponieważ oznacza sprawdzanienil
wszędzie. Ale to kolejny czajnik z rybami. Biorąc pod uwagę, że testowanie „obecności lub nieobecności” obiektu jest tak częstym wymogiem, prawdziwość przedmiotów jest użytecznym aspektem języka Ruby, choć zaskakuje początkujących użytkowników języka.źródło
Nie tylko
if variable.nil?
czyta się bardziej jak język naturalny, ale także chroni programistę przed przypadkowym przypisaniem mufalse
wartości i wpadnięciem w twojąif
wypowiedź, ponieważ Ruby jest językiem luźno wpisanym.źródło
Idiomatycznie,
unless variable
lepiej niżif !variable
. Negatywneif
stwierdzenia są często uważane za zapach kodu, ponieważ łatwiej jest pominąć negację podczas przeglądania.Większy obraz tutaj polega na tym, że wykonywanie
nil
takich kontroli jest również trochę zapachem kodu. Aby uzyskać prawidłowe OO, staraj się używać wzorca obiektu zerowego, aby tego rodzaju sprawdzanie nigdy nie było potrzebne. http://devblog.avdi.org/2011/05/30/null-objects-and-falsiness/Powiedz obiektom, co mają robić, nie pytaj ich, czym one są. Czasami nazywa się to informowaniem, nie pytaj
źródło