Zapewne nieraz słyszałeś lub czytałeś, aby pisać czysty i samokomentujący się kod. Jak mantrę słyszysz: używaj znaczących nazw dla zmiennych, nazywaj zmienne mądrze, nie używaj słów: foo, bar, a jednoliterowe nazwy zmiennych zachowaj tylko dla indeksów w trywialnych pętlach. Wydaje mi się, że programista piszący kod, który dzisiaj poprawiałem, zapomniał o jednym: nazwy nie mogą kłamać!
W wyżej wspomnianym programie mam grupę elementów, która ma jeden nagłówek. Użytkownik wykonuje na nich różne operacje. Jest pewna operacja, która jeśli jest wykonana na elemencie grupy niebędącym nagłówkiem, to zostanie ona również wykonana na nagłówku tej grupy.
Wszystkie elementy z grupy wyświetlane są użytkownikowi w tabeli. W zależności od kryteriów, w tabeli mogą znajdować się elementy z wielu grup, ale również może być tak, że nie wyświetlone są wszystkie elementy z konkretnej grupy.
Wejdźmy głębiej w szczegóły naszej operacji:
- Wykonaj operację X na elemencie grupy
- Jeśli element nie jest nagłówkiem, to zacznij próbę wykonania operacji X dla nagłówka, w tym celu:
- Znajdź nagłówek
- Jeśli znalazłeś nagłówek wykonaj operację X
- Koniec algorytmu
Wszystko ładnie i pięknie, ale… w punkcie 3 nie znajduje nagłówka. Dlaczego? Program nie szuka nagłówka w bazie danych, ale w naszej tabeli, która np. (przez odpowiednie kryteria) wyświetla tylko jeden wiersz, który właśnie przerobiliśmy w punkcie pierwszym.
Cóż, bug jak bug, trzeba poprawić. Szybko dopisuję więc kilka linii: jak nie znajdujesz w tabeli nagłówka, to poszukaj go w bazie danych i jak go masz, to wykonaj na niej zadaną operację. Biorę klasą odpowiedzialną za pobieranie danych. Jest nawet zaimplementowana funkcja, która zwróci mi tabelę zawierającą elementy grupy i jako parametr przyjmuje id takiego elementu (nagłówek też jest elementem grupy).
F5 i zaczynamy testować. Nic się niestety nie zmieniło. Nagłówek nie został przetworzony…. Aplikacja stop, breakpoint i F6. Jestem. Mam id nagłówka, uruchamiam funkcję pobrania z bazy danych i… dostaję nulla. Jakim cudem? Nie może być!
Wchodzę w ciało funkcji. W skrócie funkcja ta jest adapterem i wywołuje kolejną funkcję. Wchodzę w nią i… ta funkcja nie przyjmuje już jako parametru id elementu, ale całej grupy….
Programisto, nazywaj zmienne mądrze, nazywaj zmiennie poprawnie i nie oszukuj :) (a jak refaktoryzujesz, to rób to z głową, nie tylko testy muszą świecić się na zielono)