Ostatnio dużo pracuję w PHP, a konkretnie w ramach WordPress. Zauważam dużo kodu w postaci:
if ( 1 == $options['postlink'] )
Gdzie spodziewałbym się zobaczyć:
if ( $options['postlink'] == 1 )
Czy jest to konwencja stosowana w niektórych językach / ramach? Czy jest jakiś powód, dla którego to pierwsze podejście jest lepsze niż drugie (z perspektywy przetwarzania, perspektywy analizy, a nawet perspektywy ludzkiej?)
Czy to tylko kwestia gustu? Zawsze uważałem, że lepiej podczas wykonywania testu, że zmienna pozycja testowana względem jakiejś stałej znajduje się po lewej stronie. Wydaje się, że lepiej odwzorowuje sposób, w jaki zadalibyśmy pytanie w języku naturalnym: „jeśli ciasto jest czekoladą”, a nie „jeśli czekolada jest ciastem”.
Odpowiedzi:
Głównym powodem tego (tak zwane „warunkowe Yoda”) jest zapobieganie wypadkom, w wyniku których przypadkowo używasz operatora przypisania (
=
) zamiast operatora równego porównania (==
).To znaczy, jeśli popełniłeś błąd, robiąc:
Oświadczenie będzie oceniać na
true
(lub, w przypadku niektórych języków - jak PHP - prawdziwa wartość), a będziesz miał trudny do znalezienia błąd.Ale jeśli zrobiłeś:
Otrzymasz błąd krytyczny, ponieważ nie możesz przypisać
$foo
liczby całkowitej.Ale, jak zauważyłeś, odwrócenie kolejności zazwyczaj sprawia, że rzeczy są mniej czytelne. Tak więc wiele standardów kodowania (ale nie wszystkie, w tym WordPress ) sugeruje lub wymaga,
$foo == 1
pomimo zalet polowania na błędy1 == $foo
.Ogólnie rzecz biorąc, radzę postępować zgodnie z ustalonym standardem kodowania, o ile istnieje: w przypadku WordPress oznacza to używanie warunkowych programów Yoda.
Jeśli nie ma, a niemożliwe jest ustanowienie jednego poprzez konsensus z rówieśnikami, wybór dealera.
źródło
:=
operatorem przypisania (z==
testem równości), aby uniknąć tego rodzaju problemów.=
zamiast==
. Różnica jest tak wyraźna wszędzie, że nigdy ich nie myliłem. Z drugiej strony przeczytałem wiele fragmentów kodu, które są mylące lub trudne do zrozumienia. Jako takie postawiłbym priorytety na czytelność :). Niezależnie od tego dobra odpowiedź.-Wall -Werror
lub odpowiednik twojego kompilatora / tłumacza. Istnieje bardzo niewiele sytuacji, w których przypisanie w ramach warunku jest poprawne, a tym bardziej bardziej czytelne. Wiele języków nawet na to nie pozwala.if($foo = 1)
oceniatrue
w niektórych językach, w PHP zmienia się na 1;if($foo = 20)
ocenia do 20;if($foo = 0)
ocenia na 0, co w przeciwieństwie do innych jest fałszem. Może to dodać do błędu całą „kolejną warstwę złożoności”.Jest to defensywny mechanizm kodowania, który zapobiega przypadkowemu użyciu operatora przypisania.
Rozważ niewłaściwe użycie / błąd operatora przypisania zamiast operatora równości
Powyższy warunek zawsze zwróci prawdę, ale prawdopodobnie nie to miał na myśli oryginalny programista. Zastanów się, na swoim miejscu, to
Tutaj PHP (i większość innych języków) odmówiłoby uruchomienia, ponieważ niemożliwe jest przypisanie czegokolwiek do stałej wartości
1
. Kodując w ten sposób wszystkie instrukcje warunkowe, automatycznie zabezpieczasz przed przypadkowym użyciem operatora przypisania w warunkach warunkowych.źródło
Lubię używać tej konwencji w Javie, aby usunąć możliwość wyjątku zerowego wskaźnika. Więc coś takiego nie spowoduje żadnych problemów ani nie będzie wymagało dodatkowego kodu:
źródło
W praktyce wiele kompilatorów wyświetli ostrzeżenie, jeśli napiszesz „if (x = 1)” zamiast „if (x == 1)”, ponieważ najprawdopodobniej jest to błąd.
Dzięki Clang możesz uniknąć ostrzeżenia, skutecznie informując kompilator: „Mam na myśli to i wiem, co robię”, a dzieje się to przez napisanie „if ((x = 1))”. Zwróć uwagę na dodatkowe nawiasy. Działa to również w innych sytuacjach. instrukcja if (false); może ostrzec, że instrukcja nigdy nie zostanie wykonana; instrukcja if ((false)); nie daje tego ostrzeżenia.
źródło
if ($array = getSomething()){ // ..so something with $array }