Utrzymywanie jakości kodu - Dydaktyka
Transkrypt
Utrzymywanie jakości kodu - Dydaktyka
Laboratorium Temat : Podstawowe techniki utrzymania wysokiej jakości kodu Historia zmian Data Wersja Autor Opis zmian 2013.03.08 1.0 Tomasz Kowalski Utworzenie dokumentu i opracowanie zadań 2013.04.22 1.1 Tomasz Kowalski Podział na dwa laboratoria i ogólna aktualizacja treści 2013.10.14 1.2 Tomasz Kowalski Aktualizacja treści – testy jednostkowe 1. Cel laboratorium Głównym celem laboratoriów jest przegląd podstawowych technik mających na celu poprawienie i utrzymanie wysokiej jakość kodu w języku Java. Po pierwsze studenci zapoznają się z powszechnie stosowanymi konwencjami dotyczącymi organizacji struktury projektów Java oraz kodu języka Java (m. in. formatowanie i nazewnictwo). Kolejnym istotnym elementem laboratoriów jest nauka wykorzystania zaawansowanego środowiska programistycznego IDE (na przykładzie Eclipse) do automatycznej generacji kodu oraz refaktoryzacji. Czas realizacji laboratoriów wynosi 2 godziny. 2. Zasoby 2.1. Wymagane oprogramowanie Polecenia laboratorium będą dotyczyły programowania wzorców w języku Java. Potrzebne będzie środowisko dla programistów (JDK – Java Development Kit 1) oraz zintegrowana platforma programistyczna (np. Eclipse2) z zainstalowaną wtyczką do obsługi narzędzia Maven (np. m2eclipse3). 2.1. Materiały pomocnicze Materiały dostępne w Internecie: http://www.oracle.com/technetwork/java/javase/documentation/codeconvtoc-136057.html http://help.eclipse.org/juno/index.jsp?topic=%2Forg.eclipse.jdt.doc.user%2Freference %2Fref-menu-refactor.htm 3. Laboratorium 1. Do nowego folderu należy wyeksportować (w tortoiseSVN opcja Export...) projekt biblioteki dostarczającej różne implementacje stosu z repozytorium svn: http://team.kis.p.lodz.pl:8080/svn/samples/trunk/powp/lab-refactoring/ 2. Projekt należy zaimportować do Eclipse IDE wybierając File → Import... → Maven → Existing Maven Projects. Następnie należy wybrać katalog zawierający plik pom.xml jako Root Directory i kliknąć Finish. 3. Zawarte w projekcie warianty struktury danych stos służą do przechowywania liczb całkowitych. Wśród niestandardowych implementacji stosu jest: • StackFIFO – dostarczający pod klasycznym interfejsem stosu funkcjonalność kolejki First In First Out. • StackHanoi – na którym nie jest możliwe położenie liczby większej niż obecna na wierzchu stosu. Zapoznaj się z projektem, jego strukturą, klasami. Uruchom aplikację demo StacksDemo. Uruchom również testy jednostkowe: menu kontekstowe projektu Run as ... → Maven test. Zapoznaj się z testami jednostkowymi klasy stack (znajdują się w src/test/java). 4. *Pracując nad projektem dbaj o poprawność testów jednostkowych. 1 http://java.sun.com/javase/downloads/index.jsp 2 http://www.eclipse.org/ 3 http://www.sonatype.org/m2eclipse 5. UWAGI: • Przeczytaj każdy podpunkt instrukcji do końca przed rozpoczęciem jego realizacji. • Wszędzie gdzie jest to napisane wykorzystuj narzędzia środowiska IDE. • Wykonanie każdego podpunktu nie powinno wprowadzać nowych błędów. • W razie kłopotów korzystaj z pomocy prowadzącego. • Alternatywne pomysły na rozwiązanie zadań zgłoś prowadzącemu. 6. UWAGA: wyniki prac na laboratorium muszą być każdorazowo umieszczane w repozytorium SVN w odpowiednim pod-folderze folderu tags. Braki w tym zakresie są równoważne z brakiem obecności na zajęciach. 7. UWAGA: W celu pracy nad projektem na lokalnej wersji repozytorium svn checkout powinien być wykonany WYŁĄCZNIE na folderze trunk. 8. UWAGA: przechowywanie folderów generowanych automatycznie przez narzędzia (np. bin, target) w repozytorium jest niewskazana. Mała kontrola nad zmianami w tym folderze utrudniają prace z repozytorium svn. W tortoiseSVN użyj opcji ...add to ignore list... 3.1. Pół-automatyczna poprawa jakości kodu. 1. Popraw błędy związane z formatowaniem kodu źródłowego Java we wszystkich klasach. Na zaznaczonym fragmencie używaj klawisza tab lub kombinacji shift+tab do regulacji wcięć. W klasie StacksDemo napisz w komentarzu, które wiersze były źle sformatowane (automatyczna generacja komentarza na zaznaczeniu ctrl+/). 2. Sprawdź czy wszystkie błędy formatowania zostały usunięte uruchamiając automatyczne formatowanie (Source → Format lub ctrl+shift+f) 3. Zweryfikuj działanie kombinacji klawiszy alt + ← oraz alt + →. Komentarz na ten temat zamieść w ostatnio edytowanym pliku. 4. Popraw błędy konwencji nazewniczej klas, metod, atrybutów, itp. kodu źródłowego Java we wszystkich klasach. Użyj do tego opcji Refactor → Rename (skrót klawiszowy alt+shift+r). 5. Przejrzyj kod w poszukiwaniu literałów (napisy, liczby), które można by zastąpić deklaracjami stałych (np. w klasie Stack liczby -1 i 12). Wygeneruj odpowiednie stałe używając opcji Refactor → Extract Constant. 6. Przeanalizuj metody i atrybuty pod kątem widoczności (modyfikatory public, private, etc.). Wszędzie zastosuj możliwe najmniejszą widoczność. 7. Wygeneruj getter dla pola total w klasie Stack (opcja Source → Generate Getters and Setters). 8. Dokonaj hermetyzacji nieprywatnych atrybutów (polecenie Refactor → Encapsulate Field, użyte z opcją keep field reference). W komentarzu przy tych atrybutach opisz jakie nastąpiły automatyczne zmiany w pozostałych klasach w związku z hermetyzacją. 9. Usuń nieużywane settery. Do analizy wywołań użyj opcji Navigate → Open Call Hierarchy (ctrl+alt+h). 10. Ustaw modyfikator final przy niemutowalnych (nie zmieniających wartości) atrybutach klas. 11. Użyj annotacji @Override przy metodach tam gdzie jest to możliwe. 12. Przejrzyj projekt pod kątem klas (oprócz klas Stack*), które nie muszą być publiczne. Przeorganizuj projekt tak, aby usunąć pliki związane z takimi klasami. 13. Uporządkuj aplikację demo StacksDemo (znajdującą się w src/test/java) rozbijając metodę main. Utwórz metodę statyczną testStacks przyjmującą jako argument fabrykę stosów. W tym celu użyj opcji Refactor → Extract Method na zawartości funkcji main z pominięciem deklaracji lokalnej zmiennej factory. 3.2. Testy jednostkowe 1. Dokonaj walidacji projektu testami jednostkowymi. W razie potrzeby popraw testy i projekt. *Jeżeli występują błędy określ gdzie i przy realizacji, których punktów powstały. 2. *Napisz testy jednostkowe dla pozostałych klas projektu. 3.3. Komentarze i diagramy 1. Naszkicuj diagram klas UML występujących w projekcie. 2. Wygeneruj automatycznie szkielet dokumentacji do klas i metod (np. opcja Source → Generate Element Comment) oraz ją uzupełnij. 3. Przy okazji przejrzyj implementację pod kątem jakości. Jeżeli znajdziesz jakieś potencjalne miejsca, które można naprawić, dodaj notkę „TODO:” w komentarzach, np.: // TODO: needs refactoring to the bridge pattern :)