Zaawansowane projektowanie obiektowe
Forma zajęć
Wykład (30 godzin) + laboratorium (30 godzin)
Opis
Wykorzystanie możliwości stwarzanych przez paradygmat obiektowy pozwala tworzyć oprogramowanie o lepszej strukturze, a więc bardziej zrozumiałe, łatwiejsze w modyfikacji oraz tańsze w pielęgnacji. Dlatego umiejętność doboru i prawidłowego użycia mechanizmów obiektowych: polimorfizmu, dziedziczenia, hermetyzacji i innych w osiąganiu założonego efektu jest kluczowa dla każdego programisty i projektanta oprogramowania.
Celem przedmiotu jest zaprezentowanie najważniejszych kierunków rozwoju technik obiektowych oraz ich praktycznego wykorzystania w tworzeniu oprogramowania.
Składa się on z pięciu zasadniczych części. Pierwszy obszar dotyczy metod i praktyk testowania jednostkowego, doboru strategii tworzenia testów (m.in. obiektów zastępczych) i wykorzystania w tym celu specjalizowanego oprogramowania (np. JUnit, TestNG). W drugiej części omówione zostaną zagadnienia związane metrykami określającymi jakość programów obiektowych oraz wykorzystaniem poszczególnych mechanizmów obiektowych. Trzecia grupa zagadnień dotyczy wzorców projektowych, ich genezy, zastosowań oraz przykładów wykorzystania w praktycznych sytuacjach. Czwarty obszar jest poświęcony refaktoryzacji oprogramowania - technice pozwalającej efektywnie wspomagać procesy pielęgnacji kodu źródłowego programów. Ostatnia, piąta część zajęć dotyczy dwóch, relatywnie nowych technik programowania: programowania aspektowego oraz komponentowego.
Problemy przedstawione podczas zajęć są prezentowane na przykładzie popularnego języka programowania Java, jego bibliotek i rozszerzeń,
Sylabus
Autor sylabusa
- dr inż. Bartosz Walter, Instytut Informatyki Politechniki Poznańskiej
- email: Bartosz.Walter@cs.put.poznan.pl
Autor kursu
Kurs został opracowany przez zespół pracowników Instytutu Informatyki Politechniki Poznańskiej pod kierunkiem dr. inż. Bartosza Waltera, w składzie: dr inż. Bartosz Walter, dr inż. Wojciech Complak, mgr inż. Bartosz Bogacki i mgr inż. Błażej Pietrzak.
Wymagania wstępne
- Zrozumienie istoty paradygmatu obiektowego (Programowanie obiektowe)
- Zagadnienia związane z tworzeniem oraz pielęgnacją oprogramowania w modelu przyrostowym i pomiarami oprogramowania (Inżynieria oprogramowania)
Zawartość
Kurs jest podzielony na moduły związane z poszczególnymi grupami zagadnień.
- Pierwsza część (5w + 5l) jest poświęcona przypomnieniu podstawowych celów obiektowości (przede wszystkim określeniu odpowiedzialności obiektu) oraz mechanizmów, które je wspierają (dziedziczenia, polimorfizmu, hermetyzacji), omówieniu ich zastosowań oraz porównaniu możliwości, jakie oferują. Przedstawione też są podstawowe kryteria jakości projektu obiektowego: spójność i powiązania między obiektami. Ilustracją jest m.in. analiza konstrukcji biblioteki Java Collections oraz zmian zachodzących w niej pod wpływem rozwoju języka Java oraz ewoluujących wymagąń
- Podczas drugiej części (3w + 4l) przedstawione są zasady i założenia testowania jednostkowego wykorzystującego klasyczną bibliotekę JUnit w wersji 3.8, oraz cechy i funkcje wprowadzone w nowej generacji bibliotek JUnit 4.x i TestNG, korzystających z możliwości oferowanych przez język Java w wersji 1.5. Prezentowana jest także koncepcja obiektów zastępczych (ang. mock objects), które umożliwiają stosowanie testowania jednostkowego także w przypadku obiektów o złożonych zależnościach. Przedstawione są statyczne i dynamiczne techniki generowania obiektów zastępczych oraz sposoby ich wykorzystania.
- Trzecia część kursu (2w + 2l) dotyczy metryk obiektowych, służących do ilościowej oceny jakości programu obiektowego. Omówione są trzy rodziny metryk: MOOD, Chidamber&Kemerer oraz metryki R. Martina, stawiane im zadania oraz różnice pomiędzy nimi. Przedstawione są definicje metryk, typowe wartości oraz sposoby interpretacji otrzymanych wyników i ich wykorzystania przy poprawie jakości kodu.
- Kolejna, czwarta część (7w + 7l) jest poświęcona koncepcji wzorców projektowych, w tym przede wszystkim katalogowi autorstwa Bandy Czterech (ang. Gang of Four), uzupełnionym o kilka wzorców innych autorów. Każdy wzorzec jest omówiony zgodnie z szablonem zaproponowanym przez Bandę Czterech oraz ilustrowany przykładami w języku Java.
- W piątej części (9w + 8l) przedstawiona jest koncepcja refaktoryzacji oprogramowania - techniki wspomagającej ciągłą pielęgnację kodu źródłowego. Omówione są założenia refaktoryzacji, sposoby zapewniania jej poprawności, typowe błędne rozwiązania wymagające modyfikacji (tzw. bad code smells) oraz wsparcie w zakresie refaktoryzacji oferowane przez środowiska deweloperskie. Kluczowym elementem tej części jest prezentacja kilkadziesięciu przekształceń refaktoryzacyjnych z katalogu M. Fowlera, ilustrowanych przykładami.
- Część szósta (2w + 2l) dotyczy programowania aspektowego - nowej techniki programowania, umożliwiającej łatwe łączenie przecinających się zagadnień (ang. croscutting concerns) w kodzie programu. Zagadnienia aspektowe są omówione na przykładzie języka AspectJ.
- Ostatnia, siódma część kursu (2w + 2l) jest poświęcona wprowadzeniu do programowania komponentowego. Jej celem jest przybliżenie koncepcji komponentu i kontenera komponentów, omówienie sposobów wiązania komponentów ze sobą oraz ich osadzania ich w kontenerze komponentów. Zaprezentowane są też techniki rozwiązywania zależności pomiędzy komponentami z wykorzystaniem wzorca Service Locator oraz poprzez ich wstrzykiwanie (ang. dependency injection). Ilustracją są przykłady zaimplementowane z wykorzystaniem popularnego kontenera SpringFramework.
Moduły
Wykłady
- Wprowadzenie do przedmiotu PDF | wiki | SWF | Test
- Przykład biblioteki obiektowej - Java Collections PDF | wiki | SWF | Test
- Testowanie jednostkowe PDF | wiki | SWF | Test
- Metryki obiektowe PDF | wiki | SWF | Test
- Wzorce projektowe, cz. I PDF | wiki | SWF | Test
- Wzorce projektowe, cz. II PDF | wiki | SWF | Test
- Wzorce projektowe, cz. III PDF | wiki | SWF | Test
- Wprowadzenie do refaktoryzacji PDF | wiki | SWF | Test
- Katalog przekształceń refaktoryzacyjnych cz. I PDF | wiki | SWF | Test
- Katalog przekształceń refaktoryzacyjnych cz. II PDF | wiki | SWF | Test
- Katalog przekształceń refaktoryzacyjnych cz. III PDF | wiki | SWF | Test
- Programowanie aspektowe PDF | wiki | SWF | Test
- Programowanie komponentowe PDF | wiki | SWF | Test
Laboratoria
- Wprowadzenie do przedmiotu wiki
- Przykład biblioteki obiektowej - Java Collections wiki
- Testowanie jednostkowe wiki
- Testowanie z użyciem obiektów zastępczych wiki
- Metryki obiektowe wiki
- Wzorce projektowe, cz. I wiki
- Wzorce projektowe, cz. II wiki
- Wzorce projektowe, cz. III wiki
- Identyfikacja obszarów kodu wymagających refaktoryzacji wiki
- Refaktoryzacja z wykorzystaniem Eclipse IDE wiki
- Refaktoryzacja prostego programu wiki
- Programowanie aspektowe wiki
- Programowanie komponentowe wiki
Literatura
- E. Gamma i in.: Wzorce projektowe. Elementy oprogramowania obiektowego wielokrotnego użytku, WNT, 2005
- J. Cooper "Java. Wzorce projektowe". Helion, 2001
- A. Shalloway, J. R. Trott "Programowanie zorientowane obiektowo. Wzorce projektowe". Wydanie II, Helion, 2005
- B. Eckel: Thinking in Java. Wydanie II lub III, Helion, 2003
- B. Henderson-Sellers: Object-oriented metrics. Measures of complexity. Prentice Hall, 1995
- M. Fowler: Refaktoryzacja. Ulepszanie struktury istniejącego kodu. WNT, 2006
- J. Kerievsky: Refaktoryzacja do wzorców projektowych. Helion, 2005
- W. Wake: Refactoring workbook. Addison-Wesley, 2003
- M. Stochmiałek "Wprowadzenie do programowania aspektowego". http://misto.e-informatyka.pl/papers/aop-intro.pdf
- R. Laddad "AspectJ in Action. Practical Aspect-oriented Programming". Manning Publications, 2003
- N. Lesiecki "Improve modularity with AspectJ programming". http://www.ibm.com/developerworks/library/j-aspectj
- M. Fowler "Inversion of Control Containers and the Dependency Injection pattern". http://www.martinfowler.com/articles/injection.html
- R.C. Martin "Dependency Inversion Pattern". http://www.objectmentor.com/resources/articles/dip.pdf