tak
Zawsze powinieneś używać nawiasów ... nie kontrolujesz kolejności pierwszeństwa ... programista kompilatora tak. Oto historia, która mi się przytrafiła na temat niestosowania nawiasów. Wpłynęło to na setki ludzi w okresie dwóch tygodni.
Prawdziwy powód świata
Odziedziczyłem aplikację z ramką główną. Któregoś dnia przestało działać. To jest to ... po prostu przestało.
Moim zadaniem było jak najszybsze działanie. Kod źródłowy nie był modyfikowany przez dwa lata, ale nagle przestał. Próbowałem skompilować kod, który zepsuł się na linii XX. Spojrzałem na linię XX i nie mogłem powiedzieć, co spowodowałoby przerwanie linii XX. Poprosiłem o szczegółowe specyfikacje dla tej aplikacji i nie było żadnych. Linia XX nie była winowajcą.
Wydrukowałem kod i zacząłem go przeglądać od góry do dołu. Zacząłem tworzyć schemat blokowy tego, co się działo. Kod był tak zawiły, że ledwie mogłem go zrozumieć. Zrezygnowałem z próbowania schematu blokowego. Bałam się dokonywać zmian, nie wiedząc, jak ta zmiana wpłynie na resztę procesu, zwłaszcza, że nie miałem szczegółowych informacji o tym, co zrobiła aplikacja ani gdzie była w łańcuchu zależności.
Postanowiłem więc zacząć od górnej części kodu źródłowego i dodać białe znaki i hamulce linii, aby kod był bardziej czytelny. Zauważyłem, że w niektórych przypadkach występowały warunki, które się łączyły AND
i OR
nie można było jednoznacznie odróżnić, które dane były AND
edytowane i jakie dane były OR
edytowane. Zacząłem więc umieszczać nawiasy wokół warunków AND
i OR
warunków, aby były bardziej czytelne.
Gdy powoli przesuwałem się w dół, aby go wyczyścić, okresowo zapisywałem swoją pracę. W pewnym momencie próbowałem skompilować kod i wydarzyło się coś dziwnego. Błąd przeskoczył, przekroczył pierwotny wiersz kodu i był teraz niższy. Więc kontynuowałem, rozróżniając AND
i OR
warunki za pomocą parens. Kiedy skończyłem sprzątać, zadziałało. Domyśl.
Następnie postanowiłem odwiedzić sklep operacyjny i zapytać, czy ostatnio zainstalowali jakieś nowe komponenty na ramie głównej. Powiedzieli tak, niedawno zaktualizowaliśmy kompilator. Hmmmm
Okazuje się, że stary kompilator niezależnie oceniał wyrażenie od lewej do prawej. Nowa wersja kompilatora oceniała również wyrażenia od lewej do prawej, ale niejednoznaczny kod, co oznacza niejasną kombinację AND
i OR
nie można było rozwiązać.
Czego się nauczyłem z tego ... ZAWSZE, ZAWSZE, ZAWSZE używajcie parenów do oddzielonych AND
warunków i OR
warunków, kiedy są one używane w połączeniu ze sobą.
Uproszczony przykład
IF Product = 191 OR Product = 193 AND Model = "ABC" OR Product = 201 OR Product = 202 AND Model = "DEF" ...
(kod zaśmiecony kilkoma z nich)
To jest uproszczona wersja tego, co napotkałem. Były też inne warunki ze złożonymi wyrażeniami logicznymi.
Pamiętam, że postanowiłem to:
IF ((Product = 191 OR Product = 193) AND Model = "ABC") OR ((Product = 201 OR Product = 202) AND Model = "DEF") ...
Nie mogłem go przepisać, ponieważ nie było specyfikacji. Pierwotnego autora już dawno nie było. Pamiętam intensywną presję. Cały statek towarowy pozostawiono w porcie i nie można go było rozładować, ponieważ ten mały program nie działał. Bez ostrzeżenia. Brak zmian w kodzie źródłowym. Przyszło mi do głowy, aby zapytać Operacje sieciowe, czy coś zmodyfikowały po tym, jak zauważyłem, że dodanie parens zmieniło błędy.