Diagram klas przedstawia schemat stosowany w inżynierii oprogramowania przedstawienie klas i interfejsów systemów, a także ich relacje. Ten schemat jest częścią statyczną część z UML , nie zainteresowanego z czasowych i dynamicznych aspektów .
Klasa opisuje obowiązki, zachowanie i rodzaj zbioru obiektów. Elementy tego zestawu to instancje klasy.
Klasa to zestaw funkcji i danych (atrybutów), które są połączone ze sobą za pomocą pola semantycznego. Klasy są używane w programowaniu obiektowym . Umożliwiają zamodelowanie programu, a tym samym podzielenie złożonego zadania na kilka małych prostych zadań.
Klasy można łączyć za pomocą mechanizmu dziedziczenia , który umożliwia podkreślenie pokrewieństwa. Między klasami możliwe są inne relacje, reprezentowane przez określony łuk na diagramie klas.
Na koniec są tworzone instancje w celu tworzenia obiektów (klasa jest formą obiektową : opisuje cechy obiektów, obiekty zawierają własne wartości dla każdej z tych cech, gdy są tworzone).
Klasa jest reprezentowana przez prostokąt podzielony na trzy części:
Drugi i ostatni reprezentują zachowanie klasy.
Jest napisane w górnym prostokącie.
W klasycznej klasie nazwa jest zapisywana w języku łacińskim (przykład: „ClassClassique”).
Nazwy klas abstrakcyjnych są zapisane kursywą (przykład: AbstractClass ).
Klasy szablonów mają w prawym górnym rogu prostokąt z przerywaną obwódką, który zawiera typy parametrów.
Składnia atrybutu jest następująca:
Visibility attributeName [ multiplicity ]: typeAttribut = Inicjalizacja;
WidocznośćPojęcie widoczności wskazuje, kto może mieć dostęp do atrybutu.
Może przyjąć tylko cztery wartości:
Postać | Rola | Słowo kluczowe | Opis |
---|---|---|---|
+ | dostęp publiczny | publiczny | Wszystkie inne klasy mają dostęp do tego atrybutu. |
# | chroniony dostęp | chroniony | Tylko sama klasa i klasy podrzędne (dziedziczenie) mają dostęp do tego atrybutu. |
~ | dostęp do pakietu | pakiet | Klasa widoczna tylko w pakiecie. |
- | dostęp prywatny | prywatny | Tylko sama klasa ma dostęp do tego atrybutu. |
Aby przestrzegać podstawowej zasady hermetyzacji , wszystkie atrybuty powinny być prywatne .
Aby umożliwić odzyskanie atrybutu prywatnego lub chronionego, zwykle używamy metody pobierającej (lub akcesorium ); aby być modyfikowalnymi, zwykle używamy setera (lub mutatora ).
NazwiskoNie może zawierać spacji, znaków interpunkcyjnych ani akcentów. Aby wymienić obowiązuje kilka umów istnieje: można wstawić symbol _ między słowami lub użyć metody CamelCase , która ma położyć pierwszą literę każdego słowa w stolicy (na przykład nazwa obiektu może stać: object_name lub ObjectName ).
WielośćWielokrotność oznacza, ile razy zmienna może wystąpić. Jest pokazany w nawiasach kwadratowych.
Na przykład, jeśli dana osoba ma dwa numery telefonów, wolimy noTelephones [2] od noTelephone1 i noTelephone2.
Przykład //attribut public prenom de type string (chaine de caractères)+ imię: ciąg
//attribut privé age de type int (entier)- wiek: wew
Składnia metody jest następująca:
Widoczność functionName ( directionParamètreN nomParamètreN : typeParamètreN ) returnType
WidocznośćPojęcie widoczności jest tym samym, co pojęcie atrybutów.
Kierunek parametruWskazuje, czy parametr jest przychodzący (wchodzący), wychodzący (wychodzący), czy przychodzący i wychodzący (przychodzący).
Przykłady metody //méthode publique getAge() retournant un entier+ getAge (): int
//méthode protégée calculerAge() prenant comme paramètre dateNaissance de type Date et ne retournant rien (void)# obliczAge (w dateBirth: Date): void
Te relacje nie są specyficzne dla diagramów klas, można je również zastosować do wszystkich diagramów statycznych.
Dziedziczenia jest blok podzielenie przez uogólnienie i specjalizacji, reprezentowany przez linię łączącą dwie klasy, a której koniec po stronie tej klasy macierzystego jest trójkąt.
Klasa potomna dziedziczy wszystkie atrybuty i metody, zarówno publiczne, chronione, jak i prywatne. Jednak nie może bezpośrednio używać atrybutów i metod prywatnych (zarówno do odczytu, jak i do zapisu), z wyjątkiem metody dziedziczonej (publicznej lub chronionej).
Kombinacja jest semantyczny związek między dwiema klasami (połączenie logiczne). Można nazwać stowarzyszenie. Wywołanie metody jest asocjacją. Może być binarny, w tym przypadku jest reprezentowany przez pojedynczą linię lub n-arny, klasy są połączone z rombem pojedynczymi liniami. Te relacje można nazwać. Asocjacja jest używana tylko w diagramach klas.
Wielość porównywalny do cardinalities z Merise układ jest wykorzystywany do zliczania minimalną i maksymalną liczbę wystąpień dla każdej grupy w stosunku do wiązania z 2 lub więcej klas. zdatność do lotu : wskazuje, czy będzie możliwy dostęp z jednej klasy do drugiej. Jeśli relacja zachodzi między klasami A i B i tylko B jest nawigowalna, wtedy możemy uzyskać dostęp do B z A, ale nie odwrotnie. Domyślnie zdatność do lotu jest dwukierunkowa.Agregacja jest stowarzyszeniem z relacji podporządkowania, reprezentowana przez linię łączącą dwie klasy i których pochodzenie jest różny od drugiego końca (klasa podporządkowana) przez otwartą diamentu. Jedna z klas grupuje inne klasy. Obiekt T używa instancji klasy T '.
Kompozycja jest agregacja z cyklu zależnej: skomponowaną klasa jest zniszczona, gdy znika klasa dominująca. Pochodzenie tego skojarzenia jest reprezentowane przez solidny diament. Obiekt T 'składa się z T.
Sugeruje, że jedna lub więcej metod otrzymuje obiekt jednego typu z innej klasy. Nie ma związku w odniesieniu do niszczenia obiektów, ale nadal istnieje zależność. Symbolizuje go kropkowana strzałka, której koniec ma trzy linie przecinające się w tym samym punkcie.
Niektóre oprogramowanie IDE umożliwia automatyczne generowanie kodu źródłowego odpowiadającego diagramowi klas.
Poniższy kod źródłowy Java odpowiada schematowi UML Animal, Cat and Pet Shop:
/* Déclaration des classes */ public class Animal { /** * Nom de l'Animal */ protected String nom; /** * Cri de l'Animal */ protected Son cri; /** * Constructeur de la classe Animal */ public Animal(String nom, String sonChemin) { this.nom = nom; this.cri = new Son(sonChemin); } /** * Returne le Nom de l'Animal */ public String nom(){ return this.nom; } /** * Returne le cri de l'Animal */ public Son cri(){ return this.cri; } } public class Son { /** * Nom du fichier son */ private String nomFichier; /** * Constructeur */ public Son(String fichier) { this.nomFichier = fichier; } /** * Permet une lecture du Son */ public void lire() { ... } /** * Arrete la lecture du Son */ public void stop() { ... } } public class Chat extends Animal //Héritage { /** * Constructeur */ public Chat(String nom) { super(nom, "miaulement.ogg"); //Appel du Constructeur d'Animal } } public class Animalerie { /** * Liste de tous les Animaux */ private LinkedList<Animal> members; /** * Constructeur */ public Animalerie(){ this.members = new LinkedList<Animal>(); //Agrégation } /** * Ajout d'un Animal dans l'Animalerie */ public void ajouteAnimal(Animal monanimal) { members.add(monanimal); } };