Blog

Wprowadzenie do Typscript: instrukcje warunkowe oraz pętla

Ostatnia odsłona ekspresowego kursu Typescript, którym będziemy wykorzystywać w przypadku tworzenie kodu w ramach Office Scripts dla Excel.

Wprowadzenie do Typscript: instrukcje warunkowe oraz pętla

Dzisiaj naprawdę postaram się być możliwe zwięzły, choć paradoksalnie z punktu widzenia pracy z Office Scripts jest to być może najistotniejsza część umiejętności programowania, którą należy opanować, by sprawnie automatyzować pracę z Excelem (przynajmniej na tym elementarnym poziomie).

Tym niemniej zrobiłem sobie ostatnio rachunek sumienia i stwierdziłem, że niewiele mniej czasu poświęcam na przygotowanie wpisów na bloga niż na opanowanie tego czy innego tematu. Oczywiście jedno drugiego nie wyklucza, ale mimo wszystko proporcje są odrobinę zachwiane, zwłaszcza jeśli muszę pisać o tematach, które specjalnie mnie nie zajmują jak właśnie Typescript czy Javascript (dalej odpowiednio TSC oraz JS). Tym bardziej, że wakacje się zbliżają i w planach mam 3 większe tematy, do których się od pewnego czasu przymierzam. Dość jednak narzekania i do rzeczy.

Instrukcje warunkowe

Kod aplikacji rzadko się czyta od początku do końca jak powieść czy chociażby wpis blogowy, ponieważ raczej rzadko się zdarza, by miały prostą ścieżkę wykonywania. Programista może na ten przykład utworzyć rozgałęzienie, aby program mógł wybrać jedną z dwóch dostępnych dróg w zależności od sytuacji. Taki zabieg nazywa się zazwyczaj wykonywaniem warunkowym.

Do tworzenia konstrukcji warunkowych w języku JS/TSC służy słowo kluczowe if, zaś instrukcja warunkowa ma następującą składnię:

if (wyrażenie_warunkowe) {

// blok instrukcji (1)

} else {

// blok instrukcji (2)

}

Jeśli wyrażenie warunkowe ma wartość prawdy (true), czyli w danej sytuacji nasz warunek jest spełniony, wówczas wykonywany jest pierwszy blok instrukcji (1), w przeciwnym razie program uruchamia drugi blok instrukcji (2). Przy czym klauzula else jest opcjonalna, czyli można ją pominąć, jeśli nie planujemy żadnych działań w przypadku niespełnienia warunku.

Jak wspomniałem wyrażenie warunkowe jest zawsze konwertowane do wartości logicznej (prawda / fałsz), aczkolwiek JS/TSC jest - jak zawsze - stosunkowo tolerancyjny w kwestii typu wyrażenia, którym można przypisać tę wartość. Tym samym 0 (liczba zero), null, undefined, NaN i pusty tekst (‘’) traktowane są jako wartości fałszywe, a wszystkie inne jako prawdziwe.

W razie potrzeby bloki if / else można łączyć ze sobą, jeśli potrzebujemy sprawdzić więcej niż jeden warunek naraz:

if (warunek_1) {

...

} else if (warunek_2) {

...

} else if (warunek_3) {

...

} else {

...

}

Wykonanie bloku kończy się po znalezieniu pierwszego prawdziwego warunku lub na klauzuli else, jeśli żaden nie jest prawdziwy. Oczywiście podobnie jak w wypadku prostszego wariantu, ostatnia klauzula else jest opcjonalna.

Pętle

Pętla to blok kodu, który wykonywany ma być - w założeniu - wielokrotnie, zgodnie z przyjętymi założeniami. Tym samym umożliwia on cofnięcie się do pewnego miejsca w kodzie programu i wykonanie go jeszcze raz na podstawie bieżącego stanu programu.

W przypadku JS/TSC instrukcja while jest najprostszą pętlą, wykonującą się, dopóki podany w niej warunek jest spełniony (prawdziwy). Instrukcja tego rodzaju zaczyna się od słowa kluczowego while. Po nim powinno znajdować się wyrażenie w nawiasie, za którym należy wpisać instrukcję do wykonania (podobnie jak w przypadku słowa kluczowego if). Pętla wykonuje tę instrukcję, dopóki wartość wyrażenia w nawiasie po konwersji na typ logiczny to true.

while (warunek) {

// instrukcje...

...

}

Jeżeli warunek zawsze jest prawdziwy, uzyskujemy wówczas pętlę nieskończoną:

while (true) {

// ta pętla się nigdy nie kończy

}

zaś pętla z warunkiem zawsze fałszywym (np. while (0) ...) nie wykona się nigdy.

Pętla for jest wariantem pętli while, jednak najczęściej stosuje się ją do wykonania kodu określoną liczbę razy (np. do przetworzenia elementów tablicy).

for (<wyrażenie startowe>; <warunek>; <wyrażenie pętli>) {

// instrukcja pętli

}

Średniki wewnątrz polecenia for (między nawiasami zwykłymi) są obowiązkowe - inaczej niż na końcu wiersza, gdzie ich stosowania jest rodzajem (moim zdaniem zupełnie niepotrzebnej) konwencji.

I tak: wyrażenie startowe wykonuje się raz, na początku pętli. Z reguły są w nim deklarowane i inicjowane zmienne pętli. Warunek sprawdzany jest przed każdym wykonaniem pętli, podobnie jak w pętli while. Natomiast wyrażenie pętli wykonywane jest dopiero po wykonaniu instrukcji (kodu zawartego w nawiasach klamrowych), ale jeszcze przed sprawdzeniem warunku dla kolejnego przejścia.

Każda z sekcji pętli for jest opcjonalna, jednak średnik na jej końcu już nie. Pominięcie środkowego wyrażenia oznacza, że jest ono zawsze prawdziwe. Pętla w postaci for(;;) {} jest więc pętlą nieskończoną.

By całość była nieco bardziej zrozumiała zaprezentuję prosty przykład pętli z wykorzystaniem for, której rolą będzie wyświetlenie w konsoli liczb parzystych z zakresu od 2 do 10. Kod prezentuje się następująco:

for (let number = 2; number < 10; number = number + 2) {

console.log(number)

}

Wyrażenie startowe w tym wypadku wynosi 2, czyli spełnia warunek pętli, ponieważ jest mniejsze od 10 (number < 10). Dlatego w tym momencie dochodzi do wykonywania instrukcji pętli (kod między nawiasami klamrowymi), która sprowadza się do wyświetlenia wartości zmiennej number. Następnie program wraca do góry, by wykonać kolejną iterację pętli, ale zanim to nastąpi wykonywane jest wyrażenie pętli, czyli do zmiennej number dodawana jest liczba 2, a tym samym jej nowa wartość wynosi 4. Tym samym warunek pętli jest cały czas spełniony, ponieważ nowa wartość zmiennej number jest również mniejsza od 10, czyli w konsoli wyświetli się teraz liczba 4 i tak dalej.

Wszystko co napisałem wyżej to tak naprawdę muśnięcie poruszanego tematu (zwłaszcza w przypadku pętli). Natomiast nie było moim celem wyczerpujące omówienie całości zagadnienia, a jedynie wskazanie tych elementów JS/TSC, które należy przyswoić w stopniu conajmniej podstawowym, by myśleć o tworzeniu skryptów w Excelu.