Laboratorium 5 - Projektowanie programów zorientowanych obiektowo. Indywidualny projekt programistyczny mgr inż. Kajetan Kurus 15 kwietnia 2014 1 Dostępne techniki programowania Tworząc program należy zastanowić się jakie podejście zastosować, aby najlepiej rozwiązać postawiony problem. W zależności, czy mamy do czynienie z programowaniem sterownika, programowaniem mikrokontrolera, wykonujemy prosty program wykonujący z góry określone zadane czy tworzymy duży program dla przedsiębiorstwa należy wybrać jedno z następujących technik programistycznych: 1. Programowanie liniowe 2. Programowanie proceduralne 3. Programowanie z obiektami - object based design 4. Programowanie zorientowane obiektowo 2 Programowanie zorientowane obiektowo - zalety 2.1 Wtórne wykorzystanie kodu Tworząc pewne rozwiązanie za pomocą klasy, możemy przekazywać je za pomocą dziedziczenia. Dzięki takiemu podejściu nie ma potrzeby przepisywania zaimplementowanych już metod dla kolejnych klas, które rozwiązują pewną pule problemów w ten sam sposób. Umiejscowienie definicji tylko w jednym miejscu umożliwi szybkie poprawianie błędów lub usprawnienie metod bez potrzeby przeszukiwania całego programu w poszukiwaniu powielonych fragmentów kodu. 2.2 Rozszerzanie kodu Dzięki funkcja wirtualnym program może reagować na wprowadzenie nowych obiektów, bez potrzeby implementowania ich w każdym miejscu programu. 1
2.3 Najlepsze odzwierciedlenie rzeczywistego świata Programowanie obiektowe najlepiej odzwierciedla dzianinie świata, które składa się z obiektów mających w sobie inne obiekty lub wchodzących w interakcje z innymi obiektami. Obiekty maja pewne dane, własności (pola) i możliwości (metody). 2.4 Łatwe tworzenie aplikacji okienkowych Każdy element okienka jest traktowany jako osobny obiekt, który działa niezależnie od innych. Dzięki można tworzyć dowolne okienka za pomocą dostępnych obiektów bez potrzeby implementacji zachowania całego okna (każdy element działa autonomicznie). 2.5 Abstrakcja Dzięki możliwości tworzenia metod bez podawania ich dokładnej postaci, można zlecać implementację tych metod w późniejszym etapie. 3 Projektowanie programu zorientowanego obiektowo Najważniejszym etapem, który ma bezpośredni wpływ na poprawne i zgodne z założeniem działanie całego programu jest etap projektowania. Przed rozpoczęciem etapu implementacji programu, należy najpierw stworzyć jego dokładny plan zawierający strukturę klas, ich zachowania i powiązania między nimi. Na jego podstawie krok po kroku będzie można stworzyć spójny, działający program. Łatwo można zauważyć, że w programowaniu obiektowym etap implementacji, jest wyłącznie etapem zamiany schematu na kod programu. Poprawność działania zależy od etapu rozpoznania i projektowanie. Pierwszym etapem jest poznanie założeń dotyczących programu (najczęściej rozmowa z klientem), w kolejnych etapach należy zapisać problem w postaci wyspecyfikowanie klas, wypisanie ich zachowań, uwzględnić dziedziczenie oraz wzajemne zależności. Ostatnim etapem jest złożenie modelu w sekwencje, która umożliwi zrealizowanie powierzonego mu zadania. Zlekceważenie tego etapu może spowodować, że wykonanie projektu odbiega od tego co było założone przy specyfikacji początkowej. Przykładem błędów na etapie projektowania jest problem zamówienia huśtawki Rys 1. 2
Rysunek 1: http : //www.ap.krakow.pl/ raj/media/humor/powstawanie p rogramu.jpg 3.1 Opis problemu - rozpoznanie Rozpoznanie zazwyczaj polega na poznaniu wymagań stawianych przed tworzonym przez nas programem. Zazwyczaj jest to rozmowa z klientem. Ten etap wymaga największego doświadczenia ponieważ dochodzi tutaj do interakcji z osobami, które nie muszą znać się na tworzeniu oprogramowania. Należy stworzyć opis z postawie zestawu krótkich pytań i odpowiedzi. Przykładowe pytana: ˆ Jakie cele ma realizować program? ˆ Jakie są istniejące gotowe elementy - bazy danych, pliki wejściowe, wyjścia z innego oprogramowania? ˆ Czy cele mogą ulegać zmianom? ˆ Jakie wyniki klient chce otrzymać z programu? ˆ Jaki ma być poziom interakcji? Zadawanie kolejnych pytań wynika ze specyfiki danego problemu. Ważnym jest aby opis by na tyle dokładny aby dało się go zapisać w postaci ogólnej koncepcji (np. schemat blokowy). Jednak należy pamiętać aby na etapie rozpoznania nie wdawać się w szczegóły samego programu, klas, metod, powiązań itp. 3
3.2 Projektowanie Wspomaganiem całego cyklu wytwarzania oprogramowania zajmuje się Inżynieria Oprogramowania. IO zajmuje się praktycznymi aspektami programowania: od analizy, przez projektowanie i wdrożenie, aż do ewolucji gotowego oprogramowania. Do tworzenia opisu systemu często stosuje się języki opisujące system informatyczny. Najpopularniejszym z nich jest UML (Unified Modeling Language), w szczególności jego wersja graficzna. UML pozwala wiernie oddać działanie całego systemu i umożliwia zbudowanie działającego programu tylko na podstawie tego języka. Inżynieria Oprogramowania z wykorzystaniem UML jest dziedziną wymagającą osobnego kursu, aby zrealizować etap projektowy, dlatego poniżej zostanie zaprezentowany ogólny zarys koncepcji bez zgłębiania się w jakikolwiek język modelowania. 3.2.1 Zachowanie systemu Pierwszym etapem projektowania jest zapisanie całej wiedzy na temat działania systemu w formie tabeli. Należy uwzględnić elementy biorące czynny udział w działaniu programu, ich czynności i interakcje z innymi elementami oraz rezultaty ich działania. Tabela 1: Zachowanie systemu Obiekt Działanie Z czym wchodzi w interakcje Wyniki działania kot pije mleko miska jest pusta auto uruchamia zapłon silnik pracuje user włącza przycisk licznik inkrementuje się o 1 3.2.2 Identyfikacja obiektów Kolejnym etapem jest wyszczególnienie na podstawie zachowania systemu, wszystkich obiektów biorących udział w jego działaniu. W opisie klasy należy uwzględnić jego zadania, elementy, z którymi współpracuje oraz jego widoczne elementy. Dopiero na tym etapie powinno się uwzględniać szczegóły klas. 4
Tabela 2: Klasa NAZWA KLASY - KOT ZADANIA: pije liże... WSPÓŁPRACUJE: miska pies... WIDOCZNE ELEMENTY: karmienie głaskanie... 3.2.3 Klasyfikacja obiektów Etap klasyfikacji obiektów można podzielić na dwie cześci: 1. Ustalenie hierarchii - ustalenie dziedziczenia np. kot jest rodzajem ssaka 2. Ustalenie zawierania innych klas (obiekt zawiera w sobie obiekty innej klasy) - kot posiada obiekt łapka i uszy Wszystkie zależności należy opisać słownie lub w postaci tabeli. 3.2.4 Określenie zależności między obiektami W tym etapie należy określić wzajemne interakcje pomiędzy klasami: należy wypisać wszystkie zależności które łączą daną klasę z kolejną. Tabela 3: Zależności między klasami Obiekt Wymuszenie czynności Na jakim obiekcie człowiek pij mleko kot śpij kot włącz światło włącznik kot baw się pies...... Na podstawie tabeli można wyznaczyć graf współpracy obiektów. Pozwala on na wizualizacje skomplikowania zależności między obiektami. Im mniejsza ilość tym lepiej. 5
3.2.5 Określenie sekwencji działań Ostatnim etapem jest zaprojektowanie sekwencji działania programu tak, aby realizował powierzone mu cele. Wykonuje się to na podstawie zachowania systemu. Można program traktować jako kilka podsystemów, dla których tworzymy sekwencje a następnie łączymy je w jedną - główną sekwencję. Zasada wygląda następująco: wybiera się pierwszy obiekt i definiuje się jego następne kroki aż do zakończenia sekwencji. Przykład: Kot dostał polecenie zabawy - w pierwszej kolejności wyszukał psa w domu, następnie przeszedł do etapu zaczepiania, po wykonaniu pięciu zaczepek kot wrócił do miejsca wydania polecenia. Taki opis tworzymy dla wszystkich sekwencji występujących w programie. 3.3 Implementacja Na podstawie utworzonych w procesie projektowania klas oraz sekwencji zachowań i interakcji można przystąpić do tworzenia rzeczywistego programu. W pierwszej kolejności należy stworzyć klasy i jej pola a następnie na podstawie sekwencji i zależności zrealizować wszystkie działania jako metody klasy. 3.4 Testy / integracja Kolejnym ważnym elementem jest sprawdzenie czy stworzony program spełnia wszystkie wymagania z założeń w fazy projektowej. ˆ elementów systemu (klas, komponentów, podsystemów, systemowe) ˆ whiebox i blackbox ˆ testy warstw (testy funkcjonalne - testy API, testy UI, testy GUI, testy warstwy danych,...) ˆ testy wymagań (weryfikujące zgodność implementacji z wymaganiami), testy funkcjonalne testy niefunkcjonalne -klasyfikacja wymagań testy implementacji (np. testy jednostkowe) 3.5 Ewolucja 4 Cykl życia oprogramowania ˆ model kaskadowy ˆ model prototypowy ˆ model przyrostowy (iteracyjny) ˆ model równoległy 6
ˆ programowanie zwinne (ang. agile programming) ˆ programowanie ekstremalne (ang. extreme programming) ˆ Rational Unified Process 5 Zadanie - Projekt 5.1 Etap 1 Termin: 22 04 2014 Przysłanie tematu projektu. Wraz z krótkim opisem działania. 5.2 Etap 2 Termin: 29 04 2014 Projekt zawierający wszystkie 5 etapów: zachowanie systemu, identyfikację obiektów, klasyfikację obiektów, określenie zależności między obiektami,określenie sekwencji działań. 5.3 Etap 3 Termin 13-05 - 2014 Oddanie gotowego, działającego programu 5.4 Etap 4 Termin 13-05 - 2014 Sprawozdanie - Zawiera wszystkie 3 etapy oraz instrukcję obsługi. Tylko w wersji elektronicznej 5.5 Oceny Oceną wyjściową jest ocena 5.0. Błędy w realizacji lub niedotrzymanie wytycznych będzie skutkować obniżeniem oceny. Aby otrzymać ocenę 5.5 należy poprawnie wykonać zadanie oraz zrobić jego wersję okienkową oraz stworzyć program realizujący testy poprawnosci wykonania projektu. 7