Skip to content
IRC-CodingIRC-Coding
UML диаграммыДиаграмма классовДиаграмма последовательностиДиаграмма активностиДиаграмма прецедентов

UML диаграммы: классы, последовательность, активность

UML - стандарт моделирования ПО. Диаграммы классов, последовательности, активности, прецедентов с связями и примерами.

S

schutzgeist

5 min read
UML диаграммы: классы, последовательность, активность

UML диаграммы: классы, последовательность, действия и прецеденты

Этот материал охватывает основные типы UML-диаграмм с практическими примерами, связями между элементами и рекомендациями по применению.

Суть

UML (Unified Modeling Language) это стандартная нотация для графического моделирования программных систем. Язык предоставляет различные типы диаграмм для описания разных аспектов разработки ПО.

Определение

Unified Modeling Language (UML) представляет собой стандартизованный Object Management Group (OMG) язык моделирования для объектно-ориентированной разработки.

Основные группы диаграмм:

  • Структурные диаграммы: статические аспекты (классы, компоненты, развёртывание)
  • Диаграммы поведения: динамические аспекты (действия, последовательности, состояния)
  • Диаграммы взаимодействия: коммуникация между объектами

Ключевые типы:

  • Диаграмма классов: классы, атрибуты, методы и связи между ними
  • Диаграмма последовательности: временные последовательности и поток сообщений
  • Диаграмма действий: ход процессов и точки принятия решений
  • Диаграмма прецедентов: требования и взаимодействие акторов

UML служит инструментом обмена информацией между разработчиками, архитекторами и заинтересованными сторонами. Также используется при генерации кода и документировании.

Ключевые моменты для тестирования

  • Диаграмма классов: статическая структура с атрибутами, методами и связями
  • Диаграмма последовательности: временные взаимодействия между объектами
  • Диаграмма действий: ход процессов с решениями и параллелизмом
  • Диаграмма прецедентов: функциональные требования и взаимодействие акторов
  • Типы связей: ассоциация, агрегация, композиция, наследование
  • Модификаторы видимости: public (+), private (-), protected (#), package (~)
  • Кратности: 1, , 0..1, 1.., 0..*
  • Релевантно для профессионального сертификата при проектировании программной архитектуры

Основные компоненты

Диаграмма классов

  1. Классы: прямоугольники с именем, атрибутами, методами
  2. Атрибуты: свойства с типом и видимостью
  3. Методы: операции с параметрами и типом возврата
  4. Связи: линии между классами

Диаграмма последовательности

  1. Акторы: участники взаимодействия
  2. Линии жизни: вертикальные линии для объектов
  3. Сообщения: горизонтальные стрелки между линиями жизни
  4. Активационные блоки: прямоугольники на линиях жизни

Диаграмма действий

  1. Действия: скруглённые прямоугольники
  2. Решения: ромбы для ветвлений
  3. Начало/конец: кружки для старта и завершения процесса
  4. Синхронизационные планки: для параллельных процессов

Диаграмма прецедентов

  1. Прецеденты: овалы для функциональности
  2. Акторы: фигурки людей для пользователей и ролей
  3. Границы системы: прямоугольники вокруг прецедентов
  4. Связи: линии между акторами и прецедентами

Практические примеры

1. Диаграмма классов (система электронной торговли)

@startuml ECommerceClassDiagram

class Kunde {
  -kundenId: Long
  -name: String
  -email: String
  -adresse: String
  +getKundenId(): Long
  +bestellen(produktId: Long, menge: Int): Bestellung
  +getBestellungen(): List<Bestellung>
}

class Bestellung {
  -bestellId: Long
  -bestelldatum: Date
  -gesamtbetrag: Decimal
  -status: String
  +berechneGesamtbetrag(): Decimal
  +setStatus(status: String): void
  +getPositionen(): List<Bestellposition>
}

class Produkt {
  -produktId: Long
  -name: String
  -preis: Decimal
  -lagerbestand: Int
  +getPreis(): Decimal
  +pruefeVerfuegbarkeit(menge: Int): Boolean
  +reduziereLagerbestand(menge: Int): void
}

class Bestellposition {
  -positionsId: Long
  -menge: Int
  -einzelpreis: Decimal
  +berechneGesamtpreis(): Decimal
}

' Beziehungen
Kunde "1" -- "0..*" Bestellung : erstellt >
Bestellung "1" -- "1..*" Bestellposition : enthält >
Bestellung "1" -- "*" Produkt : bezieht sich auf >
Produkt "0..*" -- "0..*" Bestellposition : wird bestellt >

@enduml

2. Диаграмма последовательности (процесс оформления заказа)

@startuml BestellSequenzDiagramm

actor Kunde
participant "BestellService" as Service
participant "ProduktService" as Produkt
participant "ZahlungsService" as Zahlung
participant "LagerService" as Lager

Kunde -> Service: bestelleProdukte(produkte, menge)
activate Service

Service -> Produkt: pruefeProdukte(produkte)
activate Produkt
Produkt --> Service: verfuegbarkeitsInfo
deactivate Produkt

alt alle Produkte verfügbar
    Service -> Lager: reserviereLager(produkte, menge)
    activate Lager
    Lager --> Service: reservierungsBestaetigung
    deactivate Lager
    
    Service -> Zahlung: verarbeiteZahlung(kunde, betrag)
    activate Zahlung
    Zahlung --> Service: zahlungsBestaetigung
    deactivate Zahlung
    
    Service -> Lager: bestätigeReservierung(reservierungsId)
    activate Lager
    Lager --> Service: bestätigungErfolgt
    deactivate Lager
    
    Service --> Kunde: bestellBestaetigung(bestellId)
else Produkte nicht verfügbar
    Service --> Kunde: verfuegbarkeitsFehlerr(produkte)
end

deactivate Service

@enduml

3. Диаграмма действий (обработка заказа)

@startuml BestellAktivitaetsDiagramm

start

:Bestellung eingegangen;

if (Produkt verfügbar?) then (ja)
  :Lagerbestand prüfen;
  
  fork
    :Zahlung verarbeiten;
  fork again
    :Lieferadresse prüfen;
  end fork
  
  if (Zahlung erfolgreich?) then (ja)
    :Bestellung bestätigen;
    :Lagerbestand reduzieren;
    :Versand veranlassen;
    stop
  else (nein)
    :Bestellung ablehnen;
    :Lagerreservierung aufheben;
    stop
  endif
else (nein)
  :Verfügbarkeitsfehler melden;
  :Alternative Produkte vorschlagen;
  stop
endif

@enduml

4. Диаграмма прецедентов (система электронной торговли)

@startuml ECommerceUseCaseDiagram

actor Kunde
actor Administrator
actor Lieferant

rectangle "E-Commerce System" {
  usecase "Produkt suchen" as UC1
  usecase "Produkt ansehen" as UC2
  usecase "Warenkorb verwalten" as UC3
  usecase "Bestellung aufgeben" as UC4
  usecase "Bestellung verfolgen" as UC5
  usecase "Bewertung abgeben" as UC6
  usecase "Produkt verwalten" as UC7
  usecase "Bestellungen bearbeiten" as UC8
  usecase "Lieferung verwalten" as UC9
}

' Beziehungen
Kunde --> UC1
Kunde --> UC2
Kunde --> UC3
Kunde --> UC4
Kunde --> UC5
Kunde --> UC6

Administrator --> UC7
Administrator --> UC8

Lieferant --> UC9

' Include-Beziehungen
UC4 --> UC3 : <<include>>
UC4 --> UC2 : <<include>>

' Extend-Beziehungen
UC6 --> UC4 : <<extend>>

@enduml

5. Java код из диаграммы классов

// Kunde.java
public class Kunde {
    private Long kundenId;
    private String name;
    private String email;
    private String adresse;
    private List<Bestellung> bestellungen = new ArrayList<>();
    
    public Long getKundenId() {
        return kundenId;
    }
    
    public Bestellung bestellen(Long produktId, int menge) {
        Bestellung bestellung = new Bestellung();
        bestellung.setBestelldatum(new Date());
        // Bestellposition hinzufügen
        Bestellposition position = new Bestellposition();
        position.setMenge(menge);
        bestellung.addPosition(position);
        
        bestellungen.add(bestellung);
        return bestellung;
    }
    
    public List<Bestellung> getBestellungen() {
        return new ArrayList<>(bestellungen);
    }
}

// Bestellung.java
public class Bestellung {
    private Long bestellId;
    private Date bestelldatum;
    private BigDecimal gesamtbetrag;
    private String status;
    private List<Bestellposition> positionen = new ArrayList<>();
    
    public BigDecimal berechneGesamtbetrag() {
        return positionen.stream()
            .map(Bestellposition::berechneGesamtpreis)
            .reduce(BigDecimal.ZERO, BigDecimal::add);
    }
    
    public void setStatus(String status) {
        this.status = status;
    }
    
    public List<Bestellposition> getPositionen() {
        return new ArrayList<>(positionen);
    }
    
    public void addPosition(Bestellposition position) {
        positionen.add(position);
    }
}

// Produkt.java
public class Produkt {
    private Long produktId;
    private String name;
    private BigDecimal preis;
    private int lagerbestand;
    
    public BigDecimal getPreis() {
        return preis;
    }
    
    public boolean pruefeVerfuegbarkeit(int menge) {
        return lagerbestand >= menge;
    }
    
    public void reduziereLagerbestand(int menge) {
        if (pruefeVerfuegbarkeit(menge)) {
            lagerbestand -= menge;
        } else {
            throw new IllegalArgumentException("Nicht genügend Lagerbestand");
        }
    }
}

// Bestellposition.java
public class Bestellposition {
    private Long positionsId;
    private int menge;
    private BigDecimal einzelpreis;
    
    public BigDecimal berechneGesamtpreis() {
        return einzelpreis.multiply(new BigDecimal(menge));
    }
}

Связи в UML подробнее

Ассоциация

Kunde 1..* --* Bestellung
  • Классы взаимозависимы
  • Жизненные циклы независимы друг от друга

Агрегация

Fahrzeug 1 --* Reifen
  • Шины могут существовать без автомобиля
  • Отношение “имеет”

Композиция

Auto 1 --* Motor
  • Мотор существует только как часть автомобиля
  • Отношение “является частью”

Наследование

Fahrzeug <|-- Auto
  • Auto наследует от Fahrzeug
  • Отношение “является”

Реализация

Interface <|.. Klasse
  • Класс реализует интерфейс
  • Связь реализации

Кратности

СимволЗначениеПример
1Ровно один1 Kunde
0..1Ноль или один0..1 Adresse
*Ноль или больше* Bestellungen
1..*Минимум один1..* Positionen
0..*От нуля до любого числа0..* Produkte
2..4От 2 до 42..4 Räder

Модификаторы видимости

СимволЗначениеОписание
+publicДоступно везде
-privateДоступно только внутри класса
#protectedДоступно внутри класса и подклассов
~packageДоступно только внутри пакета

Преимущества и недостатки

Достоинства UML

  • Стандартизация: единая нотация для всех
  • Наглядность: сложные связи становятся понятны
  • Коммуникация: общий язык для команды
  • Документирование: возможна автоматическая генерация
  • Генерация кода: прямое преобразование в исходный код

Недостатки

  • Сложность: большие системы становятся громоздкими
  • Кривая обучения: требуется освоение синтаксиса
  • Избыточное проектирование: лишняя детализация моделей
  • Поддержка: изменения требуют обновления диаграмм

Типичные вопросы на тестировании

  1. Чем отличаются агрегация и композиция? Агрегация: “имеет” (части могут существовать независимо), композиция: “является частью” (части существуют только вместе с целым).

  2. Объясните кратности 1.. и 0..1!* 1..*: минимум один, можно много. 0..1: ноль или ровно один.

  3. Когда используются диаграммы последовательности? Для отображения временных последовательностей и взаимодействия между объектами.

  4. Какова цель диаграмм прецедентов? Моделирование требований с позиции пользователей и акторов.

Основные источники

  1. https://www.uml.org/
  2. https://de.wikipedia.org/wiki/Unified_Modeling_Language
  3. https://plantuml.com/
Назад к блогу
Share:

Nächster Artikel in Архитектура программного обеспечения

Weiterlesen
3-Tier Архитектура: UI, Business, Data Access

Похожие статьи