de_DEen_USes_ESfa_IRhi_INid_IDpt_PT

Einführung

Klassendiagramme der Unified Modeling Language (UML) dienen als Bauplan für die Softwarearchitektur und überbrücken die Lücke zwischen abstrakten Anforderungen und der konkreten Code-Implementierung. Durch die Visualisierung der Struktur eines Systems – seiner Klassen, Attribute, Operationen und der Beziehungen zwischen ihnen – können Entwickler ein robustes Design sicherstellen, bevor sie auch nur eine Zeile Code schreiben.

Dieser Leitfaden zerlegt die wesentliche Syntax von UML-Klassendiagrammen anhand eines umfassenden Spickzettels und wendet diese Konzepte auf ein reales Szenario an: Die einheitliche Lebensmittel-LieferplattformAm Ende dieses Artikels werden Sie verstehen, wie man komplexe Systeme modelliert, die Vererbung, Schnittstellen, Komposition und Aggregation umfassen.


UML-Klassendiagramm-Cheat-Sheet

Teil 1: Die Bausteine (Syntax & Legende)

Bevor wir in die Fallstudie eintauchen, müssen wir die in UML-Diagrammen verwendete Fachsprache festlegen.

1. Klassenstruktur & Sichtbarkeit

Eine Klasse wird durch ein Rechteck dargestellt, das in drei Bereiche unterteilt ist:

  • Oben: Klassenname (z. B. FlightBooking).

  • Mitte: Eigenschaften/Attribute (z. B. + nameProperty: String).

  • Unten: Methoden/Operationen (z. B. + isActive(): boolean).

Sichtbarkeitsmodifikatoren:

  • + Öffentlich: Zugänglich für jede andere Klasse.

  • - Privat: Nur innerhalb der Klasse zugänglich.

  • # Geschützt: Innerhalb der Klasse und ihrer Unterklassen zugänglich.

  • ~ Paket: Nur innerhalb desselben Pakets zugänglich.

2. Spezielle Klassentypen

  • Schnittstellen (<<interface>>): Verträge, die Methoden ohne Implementierung definieren. Dargestellt durch eine grüne Box (in diesem Spickzettel) oder Standardnotation.

    • Beispiel: UserRepo mit + method(): void.

  • Abstrakte Klassen (<<abstract>>): Basis-Klassen, die nicht direkt instanziiert werden können. Sie können abstrakte Methoden enthalten.

    • Beispiel: Component mit + render(): void // abstract.

  • Aufzählungen: Eine Menge benannter Konstanten.

    • Beispiel: JobStatus.

Beispiel für ein Klassendiagramm eines Bestellsystems

 

@startuml
skinparam classAttributeIconSize 0
skinparam shadowing false

‘ — Schnittstellen —
interface PaymentGateway {
+ process(amount: double): boolean
}

‘ — Abstrakte Klassen —
abstract class Order {
# orderId: String
# totalAmount: double
+ {abstract} calculateTax(): double
+ getSummary(): String
}

‘ — Klassen —
class PhysicalOrder {
– shippingWeight: double
+ calculateTax(): double
}

class DigitalOrder {
– downloadLink: String
+ calculateTax(): double
}

class OrderItem {
– productName: String
– price: double
– quantity: int
}

class PayPalGateway {
+ process(amount: double): boolean
}

‘ — BEZIEHUNGEN —”
nOrder <|– PhysischeBestellung
nOrder <|– DigitaleBestellung

Order *– „1..*“ OrderItem : enthält
nOrder ..> PaymentGateway : verwendet

PaymentGateway <|.. PayPalGateway

@enduml


Teil 2: Beziehungen & Multiplizität

Die Linien, die Klassen verbinden, definieren, wie sie interagieren.

1. Assoziationsarten

  • Vererbung (Verallgemeinerung): Durchgezogene Linie mit einem hohlen Dreieck. „Ist-eine“-Beziehung.

    • Beispiel: Auto und Motorrad erben von Fahrzeug.

  • Implementierung: Gestrichelte Linie mit einem hohlen Dreieck. Eine Klasse erfüllt einen Schnittstellenvertrag.

    • Beispiel: Auto implementiert Fahrbar.

  • Komposition (starke Ownership): Durchgezogene Linie mit einem gefüllten Diamanten. Das „Teil“ kann nicht ohne das „Ganze“ existieren.

    • Beispiel: Restaurant (Ganzes) besitzt Speisekarte (Teil). Wenn das Restaurant schließt, ist die Speisekarte weg.

  • Aggregation: Durchgezogene Linie mit einem hohlen Diamanten. Eine „hat-ein“-Beziehung, bei der Teile unabhängig existieren können.

    • Beispiel: Bestellung aggregiert Restaurant (Das Restaurant existiert auch, wenn die Bestellung gelöscht wird).

2. Legende zur Multiplizität

Zahlen an den Enden der Linien geben die Kardinalität an:

  • 1: Genau eines.

  • 0..1: Null oder eins (Optional).

  • 1..*: Eins oder mehr (Verpflichtende Liste).

  • *: Viele (Null oder mehr).

Die Konzepte Vererbung, Implementierung, Komposition und Aggregation – Beispiel

@startuml
‘ Schnittstellen und Basisklassen
interface Drivable {
+ drive()
}
abstrakte Klasse Vehicle {
+ startEngine()
}
‘ Klassen
class Car {
}
class Motorcycle {
}
class Restaurant {
– name: String
}
class Menu {
}
class Order {
}
‘ Beziehungen
‘ 1. Vererbung (Verallgemeinerung)
Vehicle <|– Car
Vehicle <|– Motorcycle
‘ 2. Implementierung
Drivable <|.. Car
‘ 3. Komposition (starke Ownership)
Restaurant *– Menu : besitzt
‘ 4. Aggregation
Order o– Restaurant : beinhaltet
‘ Multiplizitätsbeispiele
‘ Restaurant hat ein oder viele Menüs (1..*)
‘ Order beinhaltet null oder ein Restaurant (0..1)
Restaurant „1“ *– „1..*“ Menu
Bestellung “1” o– “0..1” Restaurant
@enduml

Teil 3: Praxisfallstudie: Einheitliche Essenslieferplattform

Dieser Abschnitt analysiert das zentrale Diagramm aus dem Spickzettel und zerlegt die Architektur einer Essenslieferanwendung.

1. Die Benutzerhierarchie (Vererbung & Komposition)

Das System beginnt mit einer generischen Benutzer Klasse, markiert als Abstrakt. Dies stellt sicher, dass keine generischen “Benutzer”-Objekte erstellt werden, sondern nur spezifische Typen.

  • Vererbung: Kunde und Fahrer erweitern Benutzer.

  • Komposition:

    • Kunde hat eine Lieferadresse (Starke Ownership).

    • Fahrer hat Fahrzeugdetails (Starke Ownership).

2. Das Restaurant- und Menü-Ökosystem

Dieser Abschnitt zeigt tief verschachtelte Strukturen und Sammlungen.

  • Schnittstellenimplementierung: Restaurant implementiert <<interface>> Lokalisierbar, wodurch sichergestellt wird, dass jedes Restaurant über Standortdaten verfügt.

  • Kompositions-Kette:

    • Restaurant (1) besitzt stark Speisekarte (1).

    • Speisekarte enthält Speisenkategorie (1..*).

    • Speisenkategorie enthält Speisenartikel (*).

    • Hinweis: Diese Struktur stellt sicher, dass ein Speisenartikel nicht ohne eine Kategorie existieren kann, die ihrerseits nicht ohne eine Speisekarte existieren kann.

3. Bestellabwicklung & Zahlungen

  • Bestellstruktur:

    • Bestellung steht in einer Beziehung zu Restaurant (Aggregation).

    • Bestellung besitzt stark Bestellposition (1..*).

    • Bestellung hat eine Zahlung (0..1), was anzeigt, dass die Zahlung in der ersten Erstellungsphase optional ist.

  • Zahlungsstrategie (Polymorphismus):

    • Das System verwendet eine Schnittstelle <<interface>> PaymentProcessor.

    • Konkrete Klassen StripeProcessor und PayPalProcessor implementieren diese Schnittstelle. Dies ermöglicht es dem System, die Zahlungsanbieter zu wechseln, ohne die Kern-Bestellung-Logik zu ändern.

4. Abstrakte Klasse vs. Schnittstelle (Das Fahrzeug-Beispiel)

Die obere rechte Ecke des Spickzettels klärt ein häufiges Missverständnis auf:

  • Abstrakte Klasse (Fahrzeug): Auto und Motorrad erben von Fahrzeug. Dies impliziert, dass sie Kern-Daten/Struktur teilen (z. B. Motorart, Räder).

  • Schnittstelle (Fahrbar): Auto implementiert Fahrbar. Dies impliziert Auto hat spezifisches Verhalten (drive()) das Motorrad möglicherweise nicht hat (oder möglicherweise anders implementiert).


Teil 4: Visualisierung mit PlantUML

Im Folgenden finden Sie den PlantUML-Code zur Generierung der Kernstruktur der im Fallstudienbeispiel beschriebenen “Unified Food Delivery Platform”. Sie können diesen Code in jeden PlantUML-Editor kopieren, um das Diagramm anzuzeigen.

@startuml
' Skinparams für das Styling, um dem Vibe des Spickzettels zu entsprechen
skinparam classAttributeIconSize 0
skinparam linetype ortho
skinparam shadowing false

' --- LEGENDE / STEREOTYPEN ---
interface "Drivable" as Drivable {
  + drive(): void
}

interface "Locatable" as Locatable {
  + getCoordinates(): Coordinate
}

interface "PaymentProcessor" as PaymentProcessor {
  + process(amount: double): boolean
}

abstract class "User" as User {
  # id: int
  # name: String
  # email: String
  + login(): void
}

abstract class "Vehicle" as Vehicle {
  # model: String
  # year: int
}

class "Car" as Car
class "Motorcycle" as Motorcycle
class "Customer" as Customer
class "Driver" as Driver
class "Restaurant" as Restaurant
class "Menu" as Menu
class "MenuCategory" as MenuCategory
class "MenuItem" as MenuItem
class "Order" as Order
class "OrderLineItem" as OrderLineItem
class "Payment" as Payment
class "StripeProcessor" as StripeProcessor
class "PayPalProcessor" as PayPalProcessor

' --- BEZIEHUNGEN ---

' Fahrzeug-Hierarchie
Vehicle <|-- Car
Vehicle <|-- Motorcycle
Car ..|> Drivable : Implementiert

' Benutzer-Hierarchie
User <|-- Customer
User <|-- Driver

' Kunden-/Fahrer-Kompositionen
Customer *-- "1" ShippingAddress : Starke Ownership
Driver *-- "1" VehicleDetails : Starke Ownership

' Restaurant-Ökosystem
Restaurant ..|> Locatable : Implementiert
Restaurant "1" *-- "1" Menu : Komposition
Menu "1" *-- "1..*" MenuCategory : Sammlung
MenuCategory "1" *-- "*" MenuItem : Sammlung

' Bestellungs-Ökosystem
Order "1" o-- "1" Restaurant : Aggregation
Order "1" *-- "*" OrderLineItem : Komposition
Order "1" --> "0..1" Payment

' Zahlungsprozessoren
PaymentProcessor <|.. StripeProcessor
PaymentProcessor <|.. PayPalProcessor

' Spezifische Assoziationen (Selbst-Assoziationsbeispiel aus der Legende)
class "Employee" as Employee
Employee --> "reports to" Employee

@enduml

Fazit

Die Beherrschung von UML-Klassendiagrammen ist für jeden Softwarearchitekten oder Entwickler unerlässlich. Wie in der Unified Food Delivery Platform Fallstudie gezeigt wurde, ermöglicht es uns UML, komplexe Beziehungen zu visualisieren – wie den Unterschied zwischen einem Auto, das von einem Fahrzeug erbt versus die Implementierung einer Fahrbar Schnittstelle.

Durch die strikte Einhaltung der Syntaxregeln bezüglich Multiplizität (1, , 1..) und Eigentum (Komposition vs. Aggregation) können Teams architektonische Fallstricke vermeiden, wie etwa verwaiste Datensätze oder starre Designs, die schwer zu erweitern sind. Ob Sie ein einfaches Anmeldesystem oder einen Multi-Vendor-Marktplatz entwerfen, ein sorgfältig erstelltes UML-Diagramm bleibt das effektivste Werkzeug, um Ihre Vision zu kommunizieren.