Czym jest asocjacja#

Asocjacja (association) jest strukturalnym związkiem między klasyfikatorami, którego instancje mogą łączyć obiekty uczestniczące w tej relacji. Na diagramie klas zwykłą asocjację przedstawia linia między klasami. W przeciwieństwie do pojedynczego komunikatu na diagramie sekwencji, asocjacja opisuje powiązanie modelu, a nie zdarzenie w jednym przebiegu.

Przykładowa asocjacja Klient — Zamówienie może wyrażać, że zamówienie ma klienta składającego je, a klient może być powiązany z wieloma zamówieniami. Konkretne znaczenie zależy od nazw, ról, końców i ograniczeń.

Końce, role i nazwy#

Każdy koniec asocjacji określa udział klasyfikatora i może zawierać nazwę roli, liczność, nawigowalność oraz inne właściwości. Rola opisuje funkcję, jaką obiekty danego końca pełnią wobec drugiego końca. Jest szczególnie przydatna, gdy ta sama klasa uczestniczy w asocjacji wielokrotnie albo nazwa klasy nie wystarcza do wyjaśnienia relacji.

Nazwa asocjacji może opisywać sens związku, np. składa, obsługuje lub należy do. Czytaj ją w kierunku wskazanym przez grot nazwy, jeśli został użyty. Nazwy i role nie są obowiązkowe na każdej linii, ale pomagają ograniczyć zgadywanie.

Jeden klient może składać zero lub wiele zamówień, a każde zamówienie jest powiązane z dokładnie jednym klientem; końce asocjacji mają role i liczności.
Asocjacja między klientem i zamówieniem z nazwą relacji, rolami oraz licznościami.

Liczność 0..* przy końcu Zamówienie mówi, że jeden klient może być powiązany z zerem lub wieloma zamówieniami. 1 przy końcu Klient oznacza, że każde zamówienie jest powiązane z dokładnie jednym klientem w zakresie tego modelu.

Asocjacje binarne, własne i wieloargumentowe#

Asocjacja binarna łączy dwa końce i jest najczęstszym przypadkiem. Asocjacja może też łączyć instancje tej samej klasy, np. pracownik zarządza innym pracownikiem; wtedy role rozróżniają przełożony i podwładny. Asocjacje n-arne mogą łączyć więcej niż dwa końce, gdy związek ma sens wyłącznie w kontekście ich łącznego uczestnictwa.

Jeśli sama relacja ma atrybuty lub zachowanie — np. przydział pracownika do projektu ma rolę i daty obowiązywania — można użyć klasy asocjacyjnej albo jawnej klasy pośredniczącej. Wybór zależy od tego, czy powiązanie ma własną tożsamość i cykl życia.

Liczność i ograniczenia#

Liczność opisuje, ile obiektów danego końca może być powiązanych z pojedynczym obiektem po przeciwnej stronie. Typowe zapisy to 1, 0..1, 0..*, 1..* oraz zakresy, np. 2..5. Nie odczytuj jej odwrotnie: liczność przy końcu Zamówienie mówi, ile zamówień może odpowiadać jednemu klientowi.

Liczności wynikają z wymagań, nie z przypadkowego przykładu ani bieżącego stanu bazy. Dodatkowe ograniczenia mogą określać kolejność, unikalność, warunki obowiązywania lub zależności od statusu. Gdy liczność zależy od kontekstu, sama etykieta przy końcu może nie wystarczyć.

Nawigowalność i implementacja#

Nawigowalność wskazuje, czy model ujawnia możliwość przejścia od obiektów jednego końca do powiązanych obiektów drugiego końca. Nie jest tym samym co strzałka komunikatu, przepływ sterowania ani kierunek zapisu w bazie. Jeżeli widok nie analizuje dostępu, można ją pominąć; jeśli wpływa na projekt, należy ją oznaczyć czytelnie.

Asocjacja nie wymaga bezpośredniego pola w kodzie ani pojedynczej kolumny obcej. Implementacja może korzystać z kolekcji, tabeli pośredniej, zapytania, indeksu lub mechanizmu usługowego. Diagram klas modeluje znaczenie i ograniczenia, a niekoniecznie szczegóły przechowywania.

Różnice względem innych relacji#

Asocjacja modeluje strukturalne powiązanie. Zależność oznacza korzystanie jednego elementu z drugiego, które może powodować wpływ zmiany dostawcy na klienta, bez deklarowania trwałego powiązania obiektów. Uogólnienie wyraża klasyfikację i dziedziczenie. Agregacja współdzielona i kompozycja są odmianami asocjacji o semantyce całość–część.

Nie wybieraj symbolu tylko dlatego, że „coś jest połączone”. Zapisz zdanie opisujące relację, sprawdź przykładowe instancje i dopiero potem dobierz notację.

Typowe błędy#

  • Asocjacja jako dowolna strzałka. Każda relacja ma inną semantykę.
  • Nieczytelne końce. Brak nazw i ról zmusza do zgadywania.
  • Odwrócone czytanie liczności. Liczność przy końcu opisuje liczbę obiektów tego końca dla jednego obiektu po przeciwnej stronie.
  • Nawigowalność mylona z komunikatem. Relacja statyczna nie opisuje kolejności interakcji.
  • Liczność wywnioskowana z jednego przypadku. Potwierdź ją w regułach i przypadkach brzegowych.
  • Asocjacja użyta zamiast klasy pośredniczącej. Powiązanie może wymagać własnych danych i historii.
  • Implementacja utożsamiona z notacją. Linia nie musi mapować się na jedno pole w kodzie.

Podsumowanie#

Asocjacja pozwala opisać strukturalne związki między instancjami klas. Jej znaczenie precyzują końce, role, liczności, nazwa, nawigowalność i ograniczenia. Modeluj ją na podstawie reguł domeny, a nie wyglądu diagramu lub przypadkowego sposobu implementacji.