====== Zadanie 3 Diagramy stanów ====== ===== O diagamach stanów ===== Diagram stanów to graf pokazujący *stany *przejścia pomiędzy stanami Stan jest abstrakcyjnym opisem pewnego okresu w czasie życia pewnego obiektu: (rzeczywistego obiektu, obiektu klasy, obiektu danych, modułu oprogramowania, systemu). Stan może być scharakteryzowany na 3 sposoby: *jako zbiór wartości pewnych cech lub atrybutów *młodość ≡ wiek ∈ [15,25] *zadłużenie ≡ saldo < 0 *okres oczekiwania na zdarzenie: *oczekiwanie na nadejście potwierdzenia *okres wykonywania pewnej czynności: *Jedzenie, *czytanie, *spanie, *przesyłanie pliku Przejścia pomiędzy stanami następują w wyniku zdarzeń: *zmiany wartości zmiennych lub atrybutów *pojawienia się zdarzeń (nadejście SMS, odczytanie nowej porcji danych) *rozpoczęcia/zakończenia czynności Bardzo często stany służą do przechowywania w skondensowanej formie historii zdarzeń. ===== Do przeczytania ===== *[[http://home.agh.edu.pl/~pszwed/pub/uml/fsm.pdf|Bardzo szybkie wprowadzenie diagramów stanów w najprostszej wersji]] *Obejrzyj przykłady na początku [[http://pszwed.kis.agh.edu.pl/kss/lab/DoorControl.htm]] *Na póżniej [[http://home.agh.edu.pl/~pszwed/pub/uml/refman.pdf|Rozdział 6 - State Machine View]] ===== Do wykonania ===== Do rysowania diagramu stanów używamy Visio / UML. //Oprogramowanie i baza danych//->//Diagram modelu UML// Należy wybrać najnowszą wersję Visio. Stara ma ograniczenia dotyczące przebiegu strzałek. Po lewej stronie wybieramy przybornik: //Diagram stanów UML// ***Podczas zajęć** będzie budowany diagram stanów dla modułu do wyodrębniania identyfikatorów. ***Poza zajęciami**: należy zaproponować diagram stanów dla projektu, :!: Oba elementy mają być umieszczone w sprawozdaniu z zadnia 2. ==== Wyodrębnianie identyfikatorów ==== Wyobraź sobie, że piszesz prosty parser, którego zadaniem jest wyodrębnienie identyfikatorów z kodu źródłowego w języku C++ lub Java. Parser powinien używać funkcji do wyodrębnienia znaków z pliku, przeprowadzać klasyfikację typu znaku i w zależności od stanu niektóre znaki ignorować, inne składować w magazynie danych. Po stwierdzeniu końca identyfikatora powinien przesyłać zawartość magazynu do terminatora i zerować magazyn. Parser powinien pomijać komentarze. Dla przypomnienia: * pierwszym znakiem identyfikatora jest litera lub znak podkreślenia, kolejnymi mogą być cyfry *należy uwzględnić komentarze typu // ... EndOfLine oraz /* .... komentarz .... */ Narysuj diagram stanów parsera. === Pytania=== == Co jest tu zdarzeniem (dozorem)? == Zdarzeniem jest typ pojedynczego znaku. Na przykład CYFRA, LITERA, BIAŁY_ZNAK == Jak wprowadzić zdarzenie (dozór)? == W Visio: *kliknąć na przejście (strzałkę łączącą stany) i wyświetlić właściwości. *Zaznaczyć ckeck-box o wdzięcznej nazwie **Zabezpieczenie** (w wersji angielskiej **Guard**) *Wpisać tekst bez nawiasów kwadratowych == Jak wprowadzić akcję? == *W oknie właściwości przejścia wybrać zakładkę //Akcje// i doodać nową... == Czy parser może analizować ciąg znaków na raz? == Nie, zakładamy, że na wejściu dostaje pojedyncze znaki i klasyfikuje je jako należące do określonego typu. W wyniku klasyfikacji pojawia się zdarzenie. Można też zapisać dozór jako ''[ _ | a-z | A-Z ]'' - podkreślenie lub znaki z zakresu a-z lub znaki A-Z. == Co jest tu akcją == Jest to wywołanie pewnej funkcji lub metody klasy. Na przykład "Dodaj_ znak_ do_ bufora", "wyczyść_bufor". Ilustrujący przykład kodu: int state=NOIDENTIFIER; for(;;){ // pobranie znaku i identyfikację typu pomijamy w specyfikacji int c=getc(); int type=getType(); switch(state){ case NOIDENTIFIER: if(type==WHITESPACE){...} else if(type==LETTER){state=IDENTIFIER;dodajZnakDoBufora(buf,c);} // przejscie else if(type==DIGIT){...} else if(type==SLASH){...} else {...} break; case IDENTIFIER: if(type==WHITESPACE){state=NOIDENTIFIER;wypiszBufor(buf);czyscBufor(buf);} else if(type==LETTER){....} else if(type==DIGIT){...} else if(type==SLASH){...} else {} break; } } ==== Diagram stanów dla projektu ==== Zastanów się, gdzie można wykorzystać diagram stanów w poprzednio wybranym projekcie. Wskazówki: *Diagram może opisywać stany całego systemu (tak jak w opisie metody WardaMellora [[http://home.agh.edu.pl/~pszwed/se/sart/kss09.html]] ). Raczej nie dotyczy zaproponowanych tematów, typowe dla systemów wbudowanych. *Diagram może opisywać stany obiektów przetwarzanych przez system, np.: Zamówienie złożone, zaakceptowane, w trakcie realizacji, zrealizowane; *Diagram stanów może opisywać interakcję systemu z użytkownikiem, *Diagram stanów może bezpośrednio opisywać interfejs użytkownika, np..: poszczególne stany mogą odpowiadać formularzom, oknom dialogowym, wyświetlanym stronom HTML, itd Wybierz jedną z możliwości 2,3,4 i uzupełnij wcześniej sporządzoną specyfikację. ===== Dodatkowo... ===== Przemyśl, jak zamodelować maszyny dla takich tematów * bankomat komunikujący się z systemem bankowym * maszyna vendingowa * automat do sprzedaży biletów * dystrybutor paliwa na stacji benzynowej * parking na AGH Wiele innych podobnego typu: [[http://pszwed.kis.agh.edu.pl/kss/index.html]] -> [[http://pszwed.kis.agh.edu.pl/kss/tematy.html]] Rysowanie diagramów stanu jest dobrym tematem egzaminacyjnym. Typowe konstrukcje: *Dwie lub trzy komunikujące się maszyny skończeniestanowe *Ograniczenia czasowe (after) *Zagnieżdżone stany, płytka i głęboka historia (UML), itd.