Debugowanie
Rzadko udaje się napisać za pierwszym razem kod całkowicie pozbawiony błędów. Ryzyko wystąpienia błędów zmniejsza dbałość o wysoką jakość kodu, jednak nie da się ich całkowicie uniknąć, dlatego należy aktywnie ich szukać. Błędy w kodzie są czasem określane angielskim terminem bug. Proces sprawdzania poprawności kodu nazywamy testowaniem, natomiast proces ustalania przyczyny błędu i jego usuwania debugowaniem.
Typy błędów
Rozróżniamy błędy składniowe (niepoprawny zapis programu – programu nie można uruchomić) oraz semantyczne (program wykonuje się, ale nie działa zgodnie z oczekiwaniami). Szczególnym przypadkiem błędu semantycznego jest zapętlenie (program nigdy nie kończy działania, np. dlatego, że warunek pętli nigdy nie przestaje być spełniony).
Przykłady błędów
Kilka przykładów częstych błędów semantycznych:
- zamiana kolejności poleceń (np. kolejności skręcania i poruszania się do przodu)
- błędna liczba powtórzeń pętli
- błędne określenie ciała pętli (np. brak wcięcia polecenia, które ma być powtarzane)
- zamiana pętli i instrukcji warunkowej (
dopókizamiastjeśli) - zamiana nierówności ostrej i nieostrej (
x < yzamiastx ≤ y) - zamiana operatora logicznego (
P i QzamiastP lub Q) - zamiana kolejności porównywanych zmiennych (
x < yzamiasty < x) - zamiana zmiennej przypisywanej i wyrażenia (
x ← yzamiasty ← x) - zamiana zmiennych (użycie niewłaściwej zmiennej; ryzyko szczególnie duże przy nieczytelnym nazewnictwie)
- użycie niewłaściwego typu zmiennej (łańcuch znaków
“3”zamiast liczby3) - błędna wartość parametru (np. nieprawidłowa liczba stopni, o jakie należy skręcić),
- zamiana argumentów podczas wywołania funkcji (
f(a, b)zamiastf(b, a)) - zamiana wypisywania i zwracania wartości z funkcji (
wypiszzamiastzwróć)
Znajomość typowych błędów pozwala podczas debugowania skupić uwagę na miejscach, w których może ukrywać się błąd.
Proces debugowania programu
Jeżeli program nie daje poprawnych wyników, uruchamiamy go krok po kroku i obserwujemy, w którym momencie odbiega od naszych oczekiwań. Jeżeli program nie tworzy wyjścia graficznego, możemy na bieżąco wypisywać wartości zmiennych albo użyć narzędzia, które umożliwia wykonywanie programu krok po kroku i obserwowanie wartości zmiennych (tzw. debugger). Fragment programu, w którym jego działanie odbiega od naszych oczekiwań, próbujemy poprawić.
Wskazówki dotyczące debugowania programów
- Po każdej poprawce warto ponownie uruchomić program, aby sprawdzić efekt wprowadzonej zmiany.
- Jeśli nie jest jasne, jak dokładnie poprawić kod (np. o ile stopni skręcić), pomocne może być narysowanie sobie obrazka.
- Jeśli nie wiadomo, dlaczego w pewnym miejscu program zachowuje się w określony sposób, lepiej najpierw to zrozumieć, zanim zaczniemy wprowadzać zmiany.
- Jeśli nie mamy pewności, co robi jakaś użyta konstrukcja języka (polecenie, operator), należy sprawdzić jej działanie w internecie i zweryfikować swoje rozumienie, wykonując prosty kod z użyciem danej konstrukcji.
- Jeśli kod jest niepotrzebnie skomplikowany lub używa nieczytelnych nazw zmiennych, po usunięciu tych problemów (np. po zmianie nazw zmiennych) błąd może stać się oczywisty.
- Podział programu na funkcje ułatwia szukanie błędów, ponieważ możemy testować poszczególne funkcje oddzielnie.