Wstęp

Poniższy tekst stanowi zbiór zaleceń do realizacji konstrukcji UML wymaganych do mini-projektu 2 (MP2).

  1. Zgodnie z wymaganiami opisanymi w pkt 3. dokumentu wymagań każda konstrukcja powinna mieć osobny przykład biznesowy (nie należy łączyć konstrukcji wymienionych w wymaganiach mini-projektu).

  2. Asocjacje powinny zostać zaimplementowane za pomocą referencji pomiędzy obiektami. Inne rozwiązania (np. stosowanie identyfikatorów powiązanych obiektów zamiast referencji do nich) najczęściej mają ograniczoną użyteczność i są znacznie wolniejsze.

  3. Każda asocjacja powinna być nieskierowana, tj. dla każdej referencji łączącej obiekty w asocjacji powinna istnieć referencja zwrotna. Należy utrzymywać spójność pomiędzy tymi referencjami - tworząc asocjację należy utworzyć obie referencje, w przypadku usunięcia należy usunąć obie.

  4. W przypadku standardowych asocjacji (niebędących relacjami typu “bag” lub “history”) nie może istnieć więcej niż jedno powiązanie między tymi samymi obiektami w ramach jednej asocjacji.

  5. W przypadku, gdy obiekt powiązany jest z wieloma obiektami w ramach asocjacji (relacja jeden-do-wiele, lub wiele-do-wiele), należy zastosować kolekcję (zbiór) przechowującą referencje do powiązanych obiektów.

  6. Dla każdej asocjacji należy utworzyć metody w obu powiązanych klasach, które umożliwią:

    6.1. Pobranie powiązanego obiektu lub obiektów (getter). W przypadku kolekcji należy zapewnić, że nie będzie ona modyfikowana poza klasą, podobnie jak w przypadku ekstensji lub atrybutu powtarzalnego.

    6.2. Utworzenie nowego powiązania. Metoda ta powinna automatycznie ustawić referencję zwrotną.

    6.3. Usunięcie istniejącego powiązania. Metoda ta powinna automatycznie usunąć referencję zwrotną.

    6.4. Jeżeli istnieje metoda do zastąpienia istnejącego powiązania z na inny obiekt, należy upewnić się, że obie referencje ze starego powiązania zostaną usunięte przed utworzeniem nowej relacji.

  7. “Zwykła” asocjacja

    Stosując powyższe reguły należy zaprezentować implementację powiązania typu jeden-do-wiele lub wiele-do-wiele.

  8. Asocjacja z atrybutem.

    8.1. Jej zastosowanie ma sens najczęściej w przypadku relacji wiele-do-wiele.

    8.2. Należy wprowadzić nową klasę asocjacyjną zawierającą atrybuty asocjacji i dwie wymagane relacje wiele-do-jednego z powiązanymi klasami.

    8.3. Powiązane klasy nie mają bezpośredniego powiązania. Obie powinny posiadać asocjacje do klasy pośredniczącej.

    8.4. W czasie inicjalizacji obiektu klasy asocjacyjnej należy upewnić się, że wymagane atrybuty i referencje do powiązanych obiektów mają prawidłowe wartości. Należy ustawić referencje zwrotne z powiązanych obiektów do inicjalizowanego obiektu klasy asocjacyjnej.

    8.5. Nie jest wymagana możliwość zmiany powiązań w obiekcie klasy asocjacyjnej. Jeżeli istnieją tam metody do ustawienia powiązanych obiektów to powinny pozostać prywatne.

    8.6. Należy upewnić się, że metody usuwające asocjację z atrybutem usuną wszystkie cztery referencje pomiędzy powiązanymi obiektami.

  9. Asocjacja kwalifikowana

    9.1. Umożliwia “szybki” dostęp do powiązanego obiektu za pomocą kwalifikatora. Najczęściej jest nim wymagany i unikalny atrybut powiązanej klasy.

    9.2. Zamiast zbioru referencji do powiązanych obiektów należy zastosować mapę (słownik), której kluczem jest kwalifikator a wartością referencja do powiązanego obiektu.

    9.3. Jeżeli zmiana atrybutu będącego kwalifikatorem jest możliwa, to należy automatycznie uaktualnić powiązanie wykorzystujące ten kwalifikator.

  10. Kompozycja

    10.1. Stanowi silną relację pomiędzy klasą stanowiącą “całość” i klasą reprezentującą “część”.

    10.2. Obiekt “część” nie może istnieć bez powiązania do obiektu “całość”. W trakcie inicjalizacji “części” należy stworzyć odpowiednią relację do obiektu “całości”.

    10.3. Dany obiekt “części” nie może być współdzielony pomiędzy obiektami “całość”. W trakcie tworzenia relacji należy upewnić się, że dana “część” nie jest już powiązana z żadnym innym obiektem “całość”.

    10.4. W trakcie usuwania “całości” należy usunąć “część”. W tym celu należy usunąć obiekt “części” z ekstensji i jego wszystkie powiązania z innymi klasami.