Podstawowe elementy diagramu klas
W zależności od kontekstu klasy na diagramie klas reprezentują główne obiekty, interakcje w aplikacji lub klasy do zaprogramowania. Aby odpowiedzieć na pytanie „Czym jest diagram klas w UML?”, musisz najpierw zrozumieć jego podstawową strukturę.
- Klasy: szablon do tworzenia obiektów i wdrażania zachowań w systemie. W UML klasa reprezentuje obiekt lub zestaw obiektów, które współdzielą wspólną strukturę i zachowanie. Są one reprezentowane przez prostokąt zawierający wiersze z nazwą klasy, jej atrybutami i operacjami. Podczas rysowania klasy na diagramie klas wymagane jest wypełnienie tylko górnego wiersza — pozostałe są opcjonalne, jeśli chcesz podać więcej szczegółów.
- Sygnały: symbole reprezentujące jednokierunkową, asynchroniczną komunikację między aktywnymi obiektami.
- Typy danych: klasyfikatory definiujące wartości danych. Typy danych modelują zarówno typy pierwotne, jak i wyliczenia.
- Pakiety: kształty przeznaczone do organizowania powiązanych klasyfikatorów na diagramie. Są symbolizowane przez duży prostokąt z zakładką.
- Interfejsy: kolekcja sygnatur operacji i/lub definji atrybutów, które definiują spójny zestaw zachowań. Interfejsy są podobne do klas, z tą różnicą, że klasa posiada instancję swojego typu, a interfejs musi mieć co najmniej jedną klasę, która go implementuje.
- Wyliczenia: reprezentacje typów danych zdefiniowanych przez użytkownika. Wyliczenie zawiera grupy identyfikatorów reprezentujących wartości wyliczenia.
- Obiekty: instancje klasy lub klas. Obiekty dodaje się do diagramu klas, aby reprezentować konkretne lub prototypowe instancje.
- Artefakty: elementy modelu reprezentujące konkretne podmioty w systemie oprogramowania, takie jak dokumenty, bazy danych, pliki wykonywalne, komponenty oprogramowania itp.
Sekcje wewnątrz klasy
Standardowa klasa składa się z trzech sekcji:
Sekcja górna
Zawiera nazwę klasy. Ta sekcja jest zawsze wymagana, niezależnie od tego, czy mowa o klasyfikatorze, czy o obiekcie. Nazwa klasy powinna:
- Zaczynać się wielką literą.
- Być sformatowana pogrubioną czcionką.
- Być wyśrodkowana w górnej sekcji.
- Być opisowa.
Sekcja środkowa
Zawiera atrybuty klasy. Używaj tej sekcji do opisu cech klasy. Jest to wymagane tylko przy opisywaniu konkretnej instancji klasy.
Sekcja dolna
Obejmuje operacje klasy (metody). Są one wyświetlane w formacie listy, gdzie każda operacja zajmuje osobną linię. Operacje opisują, jak klasa wchodzi w interakcję z danymi. Tekst w dwóch dolnych sekcjach jest zazwyczaj wyrównany do lewej i pisany małą pierwszą literą.
Modyfikatory dostępu do elementów składowych
Wszystkie klasy mają różne poziomy dostępu w zależności od modyfikatora dostępu (widoczności). Oto poziomy dostępu wraz z odpowiadającymi im symbolami:
- Publiczny (+)
- Prywatny (-)
- Chroniony (#)
- Pakietowy (~)
- Pochodny (/)
- Statyczny (podkreślony)
Zakresy elementów składowych
Istnieją dwa zakresy elementów składowych: klasyfikatory i instancje.
Klasyfikatory są często uznawane za statyczne, co oznacza, że wartości atrybutów pozostają takie same we wszystkich instancjach, a wywołanie metody nie wpływa na stan instancji. Dla porównania, instancje zawierają metody zmieniające stan instancji oraz wartości atrybutów, które różnią się w zależności od instancji. Aby wskazać klasyfikator, podkreśl jego nazwę; pozostaw tekst bez zmian, aby wskazać instancję.
Interakcje
Termin „interakcje” odnosi się do różnych relacji i powiązań, które istnieją na diagramach klas i obiektów. Do najpopularniejszych interakcji należą:
Dziedziczenie: proces przejmowania funkcjonalności klasy nadrzędnej (nadklasy) przez klasę podrzędną (podklasę), znany również jako uogólnienie. Symbolizuje go prosta linia ciągła z zamkniętym grotem strzałki skierowanym w stronę nadklasy.

W tym przykładzie obiekt „Samochód” dziedziczy wszystkie atrybuty (prędkość, liczba pasażerów, paliwo) i metody (go(), stop(), changeDirection()) klasy nadrzędnej („Pojazd”) oprócz specyficznych atrybutów (typ modelu, liczba drzwi, producent samochodu) i metod własnej klasy (Radio(), windshieldWiper(), ac/heat()). Dziedziczenie jest przedstawiane na diagramie klas za pomocą linii ciągłej z zamkniętą, pustą strzałką.
Asocjacja dwukierunkowa: domyślna relacja między dwiema klasami. Obie klasy wiedzą o sobie nawzajem i o swojej relacji z drugą klasą. Ta asocjacja jest reprezentowana przez prostą linię między dwiema klasami.

W powyższym przykładzie klasa Samochód (Car) i klasa WycieczkaSzosowa (RoadTrip) są ze sobą powiązane. Na jednym końcu linii Samochód przyjmuje asocjację „assignedCar” z krotnością 0..1, więc gdy istnieje instancja RoadTrip, ma ona przypisaną jedną instancję Samochodu lub nie ma żadnej. W tym przypadku wymagana jest osobna klasa Karawana (Caravan) z krotnością 0..*, aby wykazać, że RoadTrip ma przypisane wiele instancji Samochodów. Ponieważ jedna instancja Samochodu ma wiele asocjacji „getRoadTrip” — innymi słowy, jeden samochód jedzie na wiele wycieczek — wartość krotności wynosi 0..*
Asocjacja jednokierunkowa: nieco rzadziej spotykana relacja między dwiema klasami. Jedna klasa wie o drugiej i wchodzi z nią w interakcję. Asocjacja jednokierunkowa jest modelowana za pomocą prostej linii łączącej, która wskazuje otwarty grot strzałki od klasy wiedzącej do klasy znanej.

Przykładowo, podczas wycieczki przez Arizonę trafiasz na fotoradar, który rejestruje Twoją prędkość, ale dowiadujesz się o tym dopiero po otrzymaniu wezwania pocztą. Nie pokazano tego na rysunku, ale w tym przypadku wartość krotności wynosi 0..* w zależności od tego, ile razy przejedziesz obok fotoradaru.