Introduktion
Jag tror att alla har hört talesättet "Mät två gånger, skär en gång". Det är sant råd i programmering. Det är alltid bättre att tänka på implementeringen innan du lägger ner tid på att genomföra den. Under implementeringen behöver du ofta skapa klasser och tänka ut hur de kommer att interagera. En visuell representation av det hela kan ofta hjälpa dig att komma fram till den mest korrekta lösningen. Det är här UML Class Diagram kommer till vår hjälp.Vad är UML?
Om du tittar på relevanta bilder i sökmotorer ser du att UML har något att göra med diagram, pilar och rutor. Du måste veta att UML står för Unified Modeling Language. Enat är det viktiga ordet här. Det betyder att våra bilder inte bara kommer att förstås av oss, utan också av alla andra som kan UML. Det är lingua franca för att rita diagram.Enligt Wikipedia,
"UML är ett allmänt utvecklande, modelleringsspråk inom området mjukvaruteknik som är avsett att tillhandahålla ett standardsätt att visualisera designen av ett system."Det mest intressanta, som inte alla skulle gissa, är att UML har specifikationer. Och det finns till och med en UML 2-specifikation. Mer information om specifikationen finns på Object Management Groups webbplats. Faktum är att denna grupp utvecklar UML-specifikationerna. Det är också intressant att UML inte begränsar sig till att beskriva klassernas struktur. Det finns många typer av UML-diagram. Wikipedia har en kort beskrivning av olika typer av UML-diagram: UML-diagram . För att återgå till UML-klassdiagram, är det värt att nämna boken " Head First Design Patterns" , använder UML-diagram för att illustrera designmönster. Summan av kardemumman är att UML verkligen används. Och det visar sig att det är ganska användbart att veta det och förstå hur man använder det.
Ansökan
Låt oss ta reda på att vi kan arbeta med UML i en IDE. Vi kommer att använda IntelliJ IDEA som vår IDE. Om du använder IntelliJ IDEA Ultimate kommer vi att ha "UML Support"-plugin installerad "out of the box". Det låter dig automatiskt skapa vackra klassdiagram. Använd till exempel Ctrl+N eller menyalternativet "Navigera" -> "Klass" för att gå till klassen ArrayList. Välj nu "Diagram" -> "Visa diagram popup" i snabbmenyn för klassnamnet. Som ett resultat får vi ett vackert diagram.

@startuml
class ArrayList {
}
class LinkedList {
}
@enduml
För att se resultatet i IDEA, välj "Visa" -> "Verktygsfönster" -> "PlantUML". Vi får bara två rutor som representerar klasser. Vi vet att båda dessa klasser implementerar List- gränssnittet. Denna klassrelation kallas förverkligande. Detta förhållande representeras med hjälp av en pil med en prickad linje. Låt oss rita det:
interface List
List <|.. ArrayList
List <|.. LinkedList
List är ett av Samlingsklassens barn. Det vill säga, den ärver Collection . Detta förhållande kallas generalisering. Det ser ut som en pil med en vanlig kontinuerlig linje. Låt oss rita det:
interface Collection
Collection <|-- List
För nästa typ av relation, lägg till i klassbeskrivningen ArrayList en post om en paketets privata array av element:
~Object[] elementData
Nu vill vi visa att ArrayList innehåller några objekt. I det här fallet kommer det att finnas ett aggregeringsförhållande. ArrayListär ett aggregat, eftersom det innehåller andra objekt. Vi säger aggregering eftersom listans objekt kan existera utan listan: de är inte integrerade delar av listan. Deras livstid är inte bunden till listans livstid. Ordet "aggregat" kommer till oss från latin och översätts som "sammansatt", det vill säga något som består av något. Till exempel i livet har vi en pumpenhet (aggregat), som består av en pump och en motor. Själva monteringen kan demonteras, och vi kan lämna några av dess komponenter ifred. Till exempel att sälja eller att sätta in i en annan montering. Det är på samma sätt i en lista. Detta uttrycks med en tom romb vid aggregatet och en kontinuerlig linje. Vi kommer att representera detta på följande sätt:
class Object{
}
ArrayList o- Object
Nu vill vi visa att till skillnad från ArrayList innehåller klassen LinkedList Node s — behållare som refererar till lagrad data. I det här fallet är noder en del av LinkedList och har inte en oberoende existens. En nod är inte själva innehållet. Den innehåller endast en referens till innehållet. Till exempel, när vi lägger till en sträng till en länkad lista lägger vi till en ny nod som innehåller en referens till strängen, samt en länk till föregående och nästa nod. Detta förhållande kallas komposition. Den avbildas genom att rita en kontinuerlig linje med en fylld romb på kompositen (något gjord av beståndsdelar). Nu ska vi representera förhållandet som text:
class Node{
}
LinkedList *-- Node
Och nu måste du lära dig att skildra en annan viktig typ av relation: beroende. Den används när en klass använder en annan, men klassen inte innehåller eller ärver den använda klassen. Till exempel vet LinkedList och ArrayList hur man skapar en ListIterator . Vi representerar detta som pilar med en prickad linje:
class ListIterator
ListIterator <... ArrayList : create
ListIterator <... LinkedList : create
Efter att ha gjort allt detta får vi: 
Automatisering
Det finns olika sätt att automatiskt generera PlantUML-diagram. Till exempel har IDEA plugin-programmet SketchIT , men det ritar inte diagram helt korrekt. Låt oss säga att implementeringen av gränssnitt är felaktigt ritad (det visas som arv). Internet har exempel på hur du kan integrera detta i ditt projekts byggprocess. Du kan till exempel hitta hur du använder uml-java-docklet med Maven. För att demonstrera kommer vi att använda Maven Archetype för att snabbt skapa ett Maven-projekt. Springa
mvn archetype:generate
Som svar på Välj ett nummer eller använd filter, lämna standard - tryck bara på Retur. Det kommer alltid att vara "maven-arketyp-snabbstart". Välj den senaste versionen. Därefter ska vi svara på några frågor och avsluta projektet: 
mvn clean install
och
mvn javadoc: javadoc
Om vi nu öppnar den genererade dokumentationen (explorer target\site\apidocs\index.html), kommer vi att se UML-diagrammen. Förresten, implementeringsrelationen visas nu korrekt :)
GO TO FULL VERSION