468
Rozdział 10.
Zastosowanie funkcji do sprawdzania pasażerów
Piszemy kod do przetwarzania i sprawdzania pasażerów
Normalnie napisałbyś funkcję dla każdego z tych warunków: jedną, by sprawdzić, czy na
liście pasażerów nie ma osób objętych zakazem lotów, drugą do sprawdzenia, czy każdy
pasażer zapłacił, i trzecią, by wyświetlić wszystkich pasażerów na pokładzie. Gdybyśmy
jednak napisali te funkcje, a następnie spojrzeli na nie z boku, zauważylibyśmy, że wszystkie
wyglądają dosyć podobnie.
function checkPaid(passengers) {
for (var i = 0; i < passengers.length; i++) {
if (!passengers[i].paid) {
return false;
}
}
return true;
}
function checkNoFly(passengers) {
for (var i = 0; i < passengers.length; i++) {
if (onNoFlyList(passengers[i].name)) {
return false;
}
}
return true;
}
function printPassengers(passengers) {
for (var i = 0; i < passengers.length; i++) {
console.log(passengers[i].name);
}
}
Jedyną rzeczą, którą różnią się
te dwie funkcje jest warunek:
pierwsza sprawdza, czy
pasażer zapłacił, a druga, czy
nie znajduje się na liście osób
objętych zakazem lotów.
Z kolei ta funkcja różni się jedynie tym, że
nie sprawdza żadnego warunku (zamiast tego
wyświetlamy listę pasażerów, używając metody
console.log) i nie zwraca żadnej wartości, jednak
w niej także przeglądamy całą listę pasażerów.
Jak widać, to całkiem sporo powtarzającego się kodu: wszystkie funkcje przeglądają listę
pasażerów i na każdym z nich wykonują jakąś operację. A co się stanie, jeśli w przyszłości
trzeba będzie dodać sprawdzenie kolejnego warunku? Przykładowo sprawdzenie, czy wszystkie
laptopy zostały wyłączone, czy któryś z pasażerów nie wykupił biletu wyższej klasy, czy ktoś nie
ma problemów ze zdrowiem itd. To by oznaczało jeszcze więcej powtarzającego się kodu.
A co moglibyśmy poradzić, gdyby stało się coś jeszcze gorszego, np. struktura danych
zawierająca listę pasażerów zostałaby zmieniona z prostej tablicy na coś zupełnie innego.
W takim przypadku musielibyśmy zmodyfikować każdą z tych funkcji. Przykra sprawa.
Lecz funkcje pierwszej klasy umożliwiają rozwiązanie tego problemu. A oto sposób: napiszemy
jedną funkcję, która będzie potrafiła przeglądnąć całą listę pasażerów, a do niej przekażemy
drugą funkcję, która będzie wiedzieć, jak wykonać interesujący nas test (np. sprawdzić, czy
dana osoba nie jest objęta zakazem lotów, czy dany pasażer zapłacił itd.).
jesteś tutaj
469
Funkcje pierwszej klasy
Ćwiczenie
Spróbuj wykonać pewne prace wstępne związane z przygotowaniem tego rozwiązania. A konkretnie: napisz
funkcję, która pobiera obiekt pasażera jako argument i sprawdza, czy nie znajduje się on na liście osób objętych
zakazem lotów. Funkcja ta będzie zwracać true, jeśli dana osoba jest na liście, oraz wartość false, jeśli jej nie
ma. Napisz także drugą funkcję, która także pobiera obiekt pasażera jako argument i sprawdza, czy zapłacił za
przelot. Funkcja będzie zwracać wartość true, jeśli dany pasażer nie zapłacił, oraz wartość false, jeśli zapłacił.
Poniżej zaczęliśmy już pisać kod tych dwóch funkcji, Tobie pozostaje jedynie go dokończyć. Nasze rozwiązanie
zamieściliśmy na następnej stronie, ale nie podglądaj!
function checkNoFlyList(passenger) {
}
function checkNotPaid(passenger) {
}
Podpowiedź: Załóż, że nasza lista
osób objętych zakazem lotów zawiera
tylko jedną osobę: dr. Zatana.
Zaostrz ołówek
Rozgrzej swój mózg i przygotuj go na przekazanie swojej pierwszej funkcji do innej
funkcji. Spróbuj wykonać poniższy kod (w głowie) i przekonaj się, jaki będzie tego
efekt. Zanim przejdziesz do dalszej lektury, koniecznie sprawdź wyniki.
function sayIt(translator) {
var phrase = translator(”Witam”);
alert(phrase);
}
function hawaiianTranslator(word) {
if (word === ”Witam”) return ”Aloha”;
if (word === ”Do widzenia”) return ”Aloha”;
}
sayIt(hawaiianTranslator);
Get Programowanie w JavaScript Rusz głową! now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.