Introduktion
Jeg tror, alle har hørt ordsproget "Mål to gange, skær en gang". Det er et rigtigt råd i programmering. Det er altid bedre at tænke over implementeringen, før du bruger tid på at udføre den. Under implementeringen skal du ofte oprette klasser og tænke på, hvordan de vil interagere. En visuel gengivelse af det hele kan ofte hjælpe dig med at finde den mest korrekte løsning. Det er her, UML Class Diagram kommer os til hjælp.Hvad er UML?
Hvis du ser på relevante billeder i søgemaskiner, vil du se, at UML har noget at gøre med diagrammer, pile og firkanter. Du skal vide, at UML står for Unified Modeling Language. Forenet er det vigtige ord her. Det betyder, at vores billeder ikke kun vil blive forstået af os, men også af alle andre, der kender UML. Det er lingua franca til tegning af diagrammer.Ifølge Wikipedia,
"UML er et generelt udviklende, modelleringssprog inden for software engineering, der er beregnet til at give en standard måde at visualisere designet af et system på."Det mest interessante, som ikke alle ville gætte på, er, at UML har specifikationer. Og der er endda en UML 2-specifikation. Mere information om specifikationen er tilgængelig på Object Management Groups hjemmeside. Faktisk udvikler denne gruppe UML-specifikationerne. Det er også interessant, at UML ikke er begrænset til at beskrive strukturen af klasser. Der er mange typer UML-diagrammer. Wikipedia har en kort beskrivelse af forskellige typer UML-diagrammer: UML-diagrammer . For at vende tilbage til UML-klassediagrammer, er det værd at nævne bogen "Head First Design Patterns" , der bruger UML-diagrammer til at illustrere designmønstre. Den nederste linje er, at UML virkelig bruges. Og det viser sig, at det er ret nyttigt at kende det og forstå, hvordan man bruger det.
Ansøgning
Lad os finde ud af, at vi kan arbejde med UML i en IDE. Vi bruger IntelliJ IDEA som vores IDE. Hvis du bruger IntelliJ IDEA Ultimate, så har vi "UML Support" plugin installeret "ud af æsken". Det lader dig automatisk generere smukke klassediagrammer. Brug for eksempel Ctrl+N eller menupunktet "Naviger" -> "Klasse" for at gå til ArrayList-klassen. Vælg nu "Diagram" -> "Vis diagram popup" i kontekstmenuen for klassens navn. Som et resultat får vi et smukt diagram.

@startuml
class ArrayList {
}
class LinkedList {
}
@enduml
For at se resultatet i IDEA skal du vælge "Vis" -> "Værktøjsvinduer" -> "PlantUML". Vi får bare to firkanter, der repræsenterer klasser. Vi ved, at begge disse klasser implementerer List- grænsefladen. Dette klasseforhold kaldes erkendelse. Dette forhold er repræsenteret ved hjælp af en pil med en stiplet linje. Lad os tegne det:
interface List
List <|.. ArrayList
List <|.. LinkedList
List er et af Indsamlingsklassens børn. Det vil sige, at den arver Samling . Dette forhold kaldes generalisering. Det ligner en pil med en almindelig kontinuerlig linje. Lad os tegne det:
interface Collection
Collection <|-- List
For den næste type relation skal du tilføje til ArrayList- klassebeskrivelsen en post om en pakke-privat array af elementer:
~Object[] elementData
Nu vil vi vise, at ArrayList indeholder nogle objekter. I dette tilfælde vil der være et aggregeringsforhold. ArrayLister et aggregat, da det indeholder andre objekter. Vi siger aggregering, fordi listens objekter kan eksistere uden listen: de er ikke integrerede dele af listen. Deres levetid er ikke bundet til listens levetid. Ordet "aggregat" kommer til os fra latin og oversættes som "samlet", det vil sige noget, der består af noget. For eksempel har vi i livet en pumpesamling (aggregat), som består af en pumpe og en motor. Selve samlingen kan skilles ad, og vi kan lade nogle af dens komponenter ligge. For eksempel at sælge eller sætte ind i en anden forsamling. Det er på samme måde i en liste. Dette udtrykkes med en tom rombe ved aggregatet og en kontinuerlig linje. Vi repræsenterer dette som følger:
class Object{
}
ArrayList o- Object
Nu vil vi vise, at i modsætning til ArrayList indeholder LinkedList-klassen Node s — containere, der refererer til de lagrede data. I dette tilfælde er noder en del af LinkedList og har ikke en selvstændig eksistens. En node er ikke selve indholdet. Den indeholder kun en henvisning til indholdet. Når vi f.eks. tilføjer en streng til en LinkedList , tilføjer vi en ny node , der indeholder en reference til strengen, samt et link til den forrige og næste node. Dette forhold kaldes sammensætning. Det er afbildet ved at tegne en sammenhængende linje med en fyldt rombe på kompositten (noget lavet af bestanddele). Nu vil vi repræsentere forholdet som tekst:
class Node{
}
LinkedList *-- Node
Og nu skal du lære at skildre en anden vigtig type forhold: afhængighed. Det bruges, når en klasse bruger en anden, men klassen hverken indeholder eller arver den brugte klasse. For eksempel ved LinkedList og ArrayList , hvordan man opretter en ListIterator . Vi repræsenterer dette som pile med en stiplet linje:
class ListIterator
ListIterator <... ArrayList : create
ListIterator <... LinkedList : create
Efter at have gjort alt dette får vi: 
Automatisering
Der er forskellige måder til automatisk at generere PlantUML-diagrammer. IDEA har for eksempel SketchIT- plugin'et, men det tegner ikke diagrammer helt korrekt. Lad os sige, at implementeringen af grænseflader er tegnet forkert (det vises som arv). Internettet har eksempler på, hvordan du kan integrere dette i dit projekts byggeproces. For eksempel kan du finde ud af, hvordan du bruger uml-java-docklet med Maven. For at demonstrere bruger vi Maven Archetype til hurtigt at oprette et Maven-projekt. Løb
mvn archetype:generate
Som svar på Vælg et tal eller anvend filter, skal du forlade standarden - bare tryk på Enter. Det vil altid være "maven-archetype-quickstart". Vælg den seneste version. Dernæst vil vi besvare nogle spørgsmål og afslutte oprettelsen af projektet: 
mvn clean install
og
mvn javadoc: javadoc
Hvis vi nu åbner den genererede dokumentation (explorer target\site\apidocs\index.html), vil vi se UML-diagrammerne. I øvrigt er implementeringsforholdet nu vist korrekt :)
GO TO FULL VERSION