====== Analiza i modelowanie obiektowe ======

Podstawą metod obiektowych jest wyrożnianie w systemie składowych, które łączą w sobie możliwość przechowywania danych oraz wykonywania pewnych operacji. 

Projektowanie obiektowe charakteryzuje się sposobem myślenia w kategoriach "bytów", a nie odseparowanych operacji albo funkcji.

Działający system składa się z oddziałujących na siebie obiektów, które przechowują swój lokalny stan i oferują operacje na tej informacji  o stanie. Obiekty ukrywają informację o reprezentacji stanu i w ten sposób ograniczają do niego dostęp. Proces projektowania obiektowego obejmuje zaprojektowanie klas obiektów i związków między tymi klasami.
Gdy projekt przybierze już postać działającego programu, potrzebne obiekty są tworzone na podstawie definicji klas.

=====Analiza obiektowa=====

**Analiza obiektowa** jest to analiza przedprojektowa (analiza biznesowa) oparta o paradygmat obiektowy. Podobnie jak każda analiza przedprojektowa odpowiada na pytanie "co ma być wykonane w ramach systemu informatycznego?" (w odróżnieniu od projektu technicznego, który odpowiada na pytanie "jak to ma być wykonane?").

Wynikiem analizy jest logiczny model systemu, opisujący sposób realizacji przez system postawionych wymagań, lecz abstrahujący od szczegółów implementacji.

**Analiza obiektowa** polega na opracowaniu modelu obiektowego dziedziny zastosowania. Rozpoznane obiekty odzwierciedlają byty i operacje związane z rozwiązywanym problemem.

{{:analiza.jpg?500}}

System jest analizowany w sposób obiektowy jeśli:

  * jest dzielony na obiekty posiadające:
    * tożsamość
    * stan
    * zachowanie
  * obiekty są grupowane w klasy złożone z obiektów o podobnych stanach i zachowaniu


**Analiza obiektowa** znajduje szczególnie zastosowanie przy złożonych systemach o dużej stronie pasywności i złożonej funkcjonalności.

**Analiza obiektowa** ułatwia:

  * ukrywanie danych (hermetyzację)
  * wykorzystanie gotowych elementów
  * ponowne wykorzystanie oprogramowania
  * szybkie prototypowanie
  * programowanie oparte na zdarzeniach
  * programowanie przyrostowe

Podczas przeprowadzania **analizy obiektowej** zespoły skupiają się na zgłębieniu wyników uzyskanych w procesie analizy wymagań.

Kolejne etapy procesu **analizy obiektowej**:

  - tworzenie diagramów przypadków użycia
  - analiza przypadków użycia i rodzielenie ich na poszczególne kroki
  - wstępne diagramy klas przedstawiające liczebności, uogólnienia i agregacje
  - tworzenie diagramów stanów w celu pokazania zmian stanów obiektów tam gdzie jest to możliwe
  - tworzenie diagramów przebiegu i kooperacji w celu określenia interakcji pomiędzy obiektami

Jednocześnie niezależnie od tych wszystkich etapów procesu analizy inżynierowie systemowi wykonują pracę równoległą odkrywając aspekty integracji systemu z systemami współpracującymi, tworzą modele baz danych itd.

=====Modelowanie obiektowe=====

W procesie budowy modelu obiektowego można wyrożnić cztery główne zadania:

  * identyfikację klas i obiektów
  * identyfikację związku klas i obiektów
  * identyfikację i definiowanie pól
  * identyfikację i definiowanie metod i komunikatów

Trzy pierwsze zadania służą budowie modelu statycznego klas. Ostatnie zadanie ma na celu zmodelowanie sposobu wzajemnej współpracy obiektów podczas wykonywania funkcji systemu.

Budowa modelu obiektowego nie ma charakteru liniowego a poszczególne zadania wykonywane są iteracyjnie.

Proces budowy modelu obiektowego:

{{:budowa_modelu_obiektowego.jpg?300|Proces budowy modelu obiektowego}}

Istnieją jednak pewne ogólne schematy określające kolejność wykonywanych zadań, którymi posługują się analitycy:

^ Lp. ^ Schemat A ^ Schemat B ^
| 1. | identyfikacja klas i obiektów | analiza poszczególnych funkcji systemu |
| 2. | identyfikacja związku klas i obiektów | identyfikacja klas i metod |
| 3. | identyfikacja i definiowanie pól | identyfikacja związku klas i obiektów |
| 4. | identyfikacja i definiowanie metod i komunikatów | identyfikacja pól |

====Identyfikacja klas i obiektów====

==Podejście klasyczne==

Oparte na obserwacji, że w wielu systemach pojawiają się podobne klasy i obiekty.

Takie typowe klasy to:

  * przedmioty
  * role
  * zdarzenia
  * interakcje
  * lokalizacje
  * organizacje
  * koncepcje
  * dokumenty
  * interfejsy dla systemów zewnętrznych

==Analiza dziedziny problemu==

Przeniesienie istniejącego modelu opisanego przez ekspertów, przedstawionego w literaturze fachowej lub znanego z wcześniejszych podobnych realizacji.

==Analiza w języku naturalnym==

Wykorzystuje słowny opis modelowanego systemu w języku naturalnym.
 
  * rzeczowniki - potencjalne klasy, obiekty lub pola
  * czasowniki - potencjalne metody lub związki klas

==Analiza scenariuszy==

Metoda ta opiera się na tworzeniu przypadków użycia.

==Weryfikacja klas i obiektów==

Weryfikując  konieczność wprowadzenia danej klasy należy wziąć pod uwagę:

  * nieobecność pól i metod - klasa znajduje się poza zakresem odpowiedzialności systemu
  * nieliczne (pojedyncze) pola i metody - pola i metody powinny zostać przeniesione do innych klas
  * tylko jeden obiekt w klasie - zbyt rozbudowana hierarchia specjalizacji
  * brak związków z innymi klasami - klasa znajduje się poza zakresem odpowiedzialności systemu

====Identyfikacja związków klas i obiektów====

Związek klas jest uogólnienieniem wielu pojedynczych związków pojawiających się pomiędzy poszczególnymi obiektami tych klas.

{{:agregacja.jpg|:agregacja.jpg}}

{{:generalizacja.jpg|:generalizacja.jpg}}

====Identyfikacja i definiowanie pól====

Identyfikując pola klas należy odpowiedzieć na następujące pytania:

  * co jest potrzebne do opisu danej klasy w ramach dziedziny problemu
  * jakie dane będą potrzebne metodom danej klasy do realizacji ich zadań
  * jakie pola należy wprowadzić, aby opisać stany w jakich mogą znajdować się obiekty danej klasy

Błędy w umieszczaniu pól w hierarchii generalizacji-specjalizacji:

{{:pola.jpg|:pola.jpg}}

====Identyfikacja i definiowanie metod i komunikatów====

Metody możemy podzielić na dwie grupy:

  * algorytmiczne proste

  * algorytmiczne złożone

Metody **algorytmiczne proste** to:

  * konstruktory - metody tworzące obiekty nowej klasy
  * destruktory - metody usuwające obiekty danej klasy
  * metody służące do pobierania/ustawiania wartości pól danej klasy - (''SetData'', ''GetData'', ''SetField'', ''GetField'') stanowią bezpośrednie odwołania do pól
  * metody służące do ustawiania związków pomiędzy obiektami
  * metody służące do edycji pól danej klasy

Metody **algorytmiczne złożone** to:

  * metody służące do wykonywania obliczeń
  * metody śledzące (monitorujące) pracę urządzeń i systemów zewnętrznych

Identyfikacja i definiowanie metod oraz komunikatów może być wynikiem:

  * analizy scenariuszy (przypadków użycia)
  * modelowania przejść stanów
    * state - driven
    * event - driven



















