Io-13-lab-wiki: Różnice pomiędzy wersjami

Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania
Bwalter (dyskusja | edycje)
Nie podano opisu zmian
 
Bwalter (dyskusja | edycje)
 
(Nie pokazano 13 pośrednich wersji utworzonych przez tego samego użytkownika)
Linia 1: Linia 1:
=Ćwiczenie 13. Refaktoryzacja oprogramowania w Javie za pomocą Eclipse IDE=
=Ćwiczenie 13. Ewolucja oprogramowania=


==Informacje wstępne==
==Informacje wstępne==
Ćwiczenie jest realizowane w języku Java w środowisku Eclipse 3.2.
Ćwiczenie jest realizowane w języku Java w środowisku Eclipse 3.2.
Przed przystąpieniem do realizacji ćwiczenia należy zapozanać się z [http://www-128.ibm.com/developerworks/library/os-ecref|Artykułem nt. refaktoryzacji w Eclipse IDE]
Celem ćwiczenia jest przeanalizowanie rozwoju niewielkiego programu i jego wpływu zmian na jego jakość.
Celem ćwiczenia jest wykonanie przekształceń refaktoryzacyjnych wybranych fragmentów kodu w załączonym projekcie
 
==Instalacja==
Przygotowanie do ćwiczenia polega na zainstalowaniu [http://java.sun.com/javase/downloads/index.jsp JDK 5.0] oraz środowiska [http://www.eclipse.org/downloads Eclipse] w wersji 3.2
Po uruchomieniu środowiska i wyborze przestrzeni roboczej należy zaimportować [[media:io-13-lab.zip|projekt]] z rozwiązaniami początkowymi.


==Zadanie==
==Zadanie==
Na podstawie załączonego kodu programu przeprowadź następujące zmiany w programie
W kolejnych krokach będzie rozwijany program-kalkulator realizujący proste obliczenia matematyczne. Przed przeczytaniem poleceń do kolejnego kroku należy zakończyć implementację poprzedniego.
 
Warto także zapisywać kolejne kroki w postaci osobnych projektów Eclipse, aby umożliwić późniejsze porównania jakości.
===Wyłączenie metody===
Zaznacz fragment metody oraz wywołaj z menu kontekstowego opcję Refactor->Extract Method.


W jakiej sytuacji takie przekształcenie jest niewykonalne?
===Wersja początkowa===
W wersji początkowej program wykonuje 4 podstawowe dwuargumentowe operacje matematyczne: +, -, *, / na liczbach całkowitych typu ''int''.
Kalkulator wczytuje polecenia ze strumienia wejściowego, po jednym w każdej linii. Polecenie ma postać:


===Rozwijnie wyrażenia===
'''liczba''' ''operator'' '''liczba'''
Wskaż zmienną lokalną, a następnie wywołaj z menu kontekstowego opcję Refactor->Inline
Operację wykonaj dla potrzeb wyrażenia ''i + 2'' oraz ''st.nextToken()''. Na czym polega różnica w ich wykonaniu? Kiedy przekształcenie to jest niepoprawne?


===Przenoszenie metody===
przy czym między liczbami a operatorem znajduje się zawsze przynajmniej jedna spacja.
Przenieś metodę statyczną do innej klasy.  
Program w odpowiedzi wyświetla wyniki wykonania operacji.


W jaki sposób jest obecnie wykonywane wywołanie tej metody w dotychczasowej klasie?
Przykładowe programy, posiadające opisaną w tym punkcie funkcjonalność, znajdują się [[media:io-13-lab.zip|tutaj]]. Są to dwa niezależne rozwiązania:
* ''KalkulatorA'', stosujące podejście strukturalne, zbudowane wewnątrz ''main()'' w jednej klasie
* ''KalkulatorB'', wykorzystujące mechanizmy obiektowe w celu oddzielenia implementacji kalkulatora od operacji matematycznych
Zastanów się, której z wersji wolisz użyć do dalszych prac. Jakie są kryteria wyboru?


Przenieś metodę obiektu do innej klasy.
===Krok 1===
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
<span style="font-variant:small-caps">Treść zadania </span>
<div class="mw-collapsible-content" style="display:none">
Rozszerz kalkulator o wykonywanie dwuargumentowych operacji bitowych: alternatywy (oznaczanej symbolem "||") i koniunkcji (oznaczanej symbolem "&&").  
</div>
</div>


W jaki sposób jest obecnie wykonywane wywołanie tej metody w dotychczasowej klasie?
===Krok 2===
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
<span style="font-variant:small-caps">Treść zadania </span>
<div class="mw-collapsible-content" style="display:none">
Zastąp istniejącą notację infiksową notacją postfiksową RPN (ang. ''reverse polish notation''), w której argumenty odkładane są na stosie ulegającym redukcji w momencie wykonania działania.
W ten sposób zapis dotychczasowy zapis ''2 + 3'' będzie miał postać ''2 3 +''. Na stosie odłożone zostaną argumenty ''2'' i ''3'', a wczytanie operatora + spowoduje wykonanie redukcji na stosie poprzez zdjęcie dwóch elementów, wykonanie dodawania i odłożenie na stosie wyniku operacji.


===Zmiana sygnatury metody===
Użycie notacji RPN pozwala na obliczanie wartości złożonych wyrażeń bez konieczności pamiętania o priorytecie poszczególnych operatorów.
Do wybranej metody dodaj nowy parametr. W jaki sposób zmieniły się wywołania tej metody? Czy mogło to zmienić jej zachowanie?
</div>
</div>


Z innej metody usuń parametr. W jaki sposób zmieniły się wywołania tej metody? Czy mogło to zmienić jej zachowanie?
===Krok 3===
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
<span style="font-variant:small-caps">Treść zadania </span>
<div class="mw-collapsible-content" style="display:none">
Zaimplementuj w kalkulatorze operacje na ułamkach zwykłych, zapisywanych w postaci ''a/b'' (bez spacji). Licznik i mianowanik ułamka są zawsze liczbami naturalnymi.


===Przenoszenie składowych w obrębie hierarchii dziedziczenia===
Wersja rozszerzona zadania może zawierać także mechanizm skracania ułamków i wyłączania całości.
Przenieś metodę z podklasy do nadklasy. W jakich okolicznościach wykonanie takiej operacji jest niemożliwe?


Przenieś metodę z nadklasy do podklasy. W jakich okolicznościach wykonanie takiej operacji jest niemożliwe?
</div>
</div>


==Literatura==
==Pytania do dyskusji==
# D. Gallardo "Refactoring for everyone" [http://www-128.ibm.com/developerworks/library/os-ecref IBM DeveloperWorks]
* Na podstawie rozwoju programu oceń jakość kodu na kolejnych etapach. Co - Twoim zdaniem - jest najważniejszym elementem przyczyniającym się do utrzymania lub nawet poprawy jakości kodu programu w kolejnych iteracjach?
* Czy wybór początkowego wersji początkowej programu (A lub B) miał wpływ na jakość końcowej wersji?

Aktualna wersja na dzień 20:55, 5 wrz 2006

Ćwiczenie 13. Ewolucja oprogramowania

Informacje wstępne

Ćwiczenie jest realizowane w języku Java w środowisku Eclipse 3.2. Celem ćwiczenia jest przeanalizowanie rozwoju niewielkiego programu i jego wpływu zmian na jego jakość.

Instalacja

Przygotowanie do ćwiczenia polega na zainstalowaniu JDK 5.0 oraz środowiska Eclipse w wersji 3.2 Po uruchomieniu środowiska i wyborze przestrzeni roboczej należy zaimportować projekt z rozwiązaniami początkowymi.

Zadanie

W kolejnych krokach będzie rozwijany program-kalkulator realizujący proste obliczenia matematyczne. Przed przeczytaniem poleceń do kolejnego kroku należy zakończyć implementację poprzedniego. Warto także zapisywać kolejne kroki w postaci osobnych projektów Eclipse, aby umożliwić późniejsze porównania jakości.

Wersja początkowa

W wersji początkowej program wykonuje 4 podstawowe dwuargumentowe operacje matematyczne: +, -, *, / na liczbach całkowitych typu int. Kalkulator wczytuje polecenia ze strumienia wejściowego, po jednym w każdej linii. Polecenie ma postać:

liczba operator liczba

przy czym między liczbami a operatorem znajduje się zawsze przynajmniej jedna spacja. Program w odpowiedzi wyświetla wyniki wykonania operacji.

Przykładowe programy, posiadające opisaną w tym punkcie funkcjonalność, znajdują się tutaj. Są to dwa niezależne rozwiązania:

  • KalkulatorA, stosujące podejście strukturalne, zbudowane wewnątrz main() w jednej klasie
  • KalkulatorB, wykorzystujące mechanizmy obiektowe w celu oddzielenia implementacji kalkulatora od operacji matematycznych

Zastanów się, której z wersji wolisz użyć do dalszych prac. Jakie są kryteria wyboru?

Krok 1

Treść zadania

Krok 2

Treść zadania

Krok 3

Treść zadania

Pytania do dyskusji

  • Na podstawie rozwoju programu oceń jakość kodu na kolejnych etapach. Co - Twoim zdaniem - jest najważniejszym elementem przyczyniającym się do utrzymania lub nawet poprawy jakości kodu programu w kolejnych iteracjach?
  • Czy wybór początkowego wersji początkowej programu (A lub B) miał wpływ na jakość końcowej wersji?