Program zapisany w języku JavaScript oblicza cenę promocyjną dla swetrów w kolorach: zielonym, niebieskim (zmienna kolor) przy zakupach powyżej 200 zł (zmienna zakupy). Warunek do obliczeń powinien być zapisany przy pomocy wyrażenia logicznego
A. zakupy > 200 || (kolor == 'zielony' && kolor == 'niebieski')
B. zakupy > 200 && (kolor == 'zielony' || kolor == 'niebieski')
C. zakupy > 200 && kolor == 'zielony' && kolor == 'niebieski'
D. zakupy > 200 || kolor == 'zielony' || kolor == 'niebieski'
Pytanie z egzaminu CKE, czerwiec 2023 (arkusz EE.09-SG-23.06).
Warunek zakupy > 200 && (kolor == 'zielony' || kolor == 'niebieski') dobrze opisuje sytuację z promocją. Najpierw wymagamy, aby wartość zakupów była większa niż 200 zł, dlatego używamy operatora &&, czyli logicznego I. To oznacza: promocja ma działać tylko wtedy, gdy warunek kwotowy jest spełniony oraz dodatkowo kolor swetra jest jednym z dozwolonych. Część w nawiasie kolor == 'zielony' || kolor == 'niebieski' oznacza, że wystarczy jeden z tych kolorów, bo sweter nie może być jednocześnie zielony i niebieski jako jedna wartość zmiennej kolor. Nawiasy są tu bardzo dobrą praktyką, bo poprawiają czytelność i jasno pokazują intencję programisty, nawet jeśli JavaScript ma określone pierwszeństwo operatorów. W praktyce taki zapis przyda się np. w koszyku sklepu internetowego, gdy rabat naliczamy tylko dla wybranych produktów i dopiero po przekroczeniu minimalnej wartości zamówienia. Z mojego doświadczenia, takie warunki warto pisać możliwie jednoznacznie, bo później łatwiej je testować i poprawiać, zwłaszcza gdy dojdą kolejne kolory albo inne reguły promocji.
W tym zadaniu kluczowe jest rozdzielenie dwóch typów wymagań: wartość zakupów musi przekroczyć 200 zł, a kolor musi należeć do zbioru dopuszczalnych kolorów, czyli zielony albo niebieski. Częsty błąd polega na użyciu operatora || między wszystkimi warunkami. Taki zapis powoduje, że promocja zostałaby naliczona także wtedy, gdy zakupy są większe niż 200 zł, ale kolor jest zupełnie inny, albo odwrotnie: gdy kolor jest zielony, lecz klient kupił tylko za małą kwotę. To już nie odpowiada opisowi biznesowemu, bo warunek kwotowy przestaje być obowiązkowy. Innym mylnym podejściem jest połączenie kolorów operatorem &&. Zmienna kolor przechowuje jedną wartość tekstową, więc nie może jednocześnie spełniać porównania kolor == 'zielony' i kolor == 'niebieski'. Taki warunek w normalnym przypadku zawsze da false, przez co promocja nigdy się nie uruchomi. Warto też uważać na mieszanie operatorów bez dobrego zrozumienia logiki. Zapis z zakupy > 200 || (kolor == 'zielony' && kolor == 'niebieski') w praktyce sprowadza promocję prawie wyłącznie do samej kwoty zakupów, bo część z dwoma kolorami połączonymi przez && i tak nie zadziała. Moim zdaniem najlepiej myśleć o takich warunkach jak o zdaniu po polsku: zakupy powyżej 200 i kolor jest zielony lub niebieski. Potem trzeba tylko dodać nawiasy, żeby JavaScript odczytał to dokładnie tak, jak chcemy. To jest dobra praktyka w kodzie produkcyjnym, bo zmniejsza ryzyko błędów w promocjach, formularzach, walidacji danych i całej logice sklepu.