От концепции к коду: Комплексное руководство по диаграммам классов UML & Практический пример
Введение
Диаграммы классов языка унифицированного моделирования (UML) служат чертежом для архитектуры программного обеспечения, соединяя абстрактные требования с конкретной реализацией кода. Визуализируя структуру системы — её классы, атрибуты, операции и взаимосвязи между ними — разработчики могут обеспечить надёжный дизайн до написания единой строки кода.
Настоящее руководство разбирает ключевый синтаксис диаграмм классов UML с помощью комплексной шпаргалки и применяет эти концепции к реальной ситуации: Единая платформа доставки едыК концу этой статьи вы поймёте, как моделировать сложные системы, включающие наследование, интерфейсы, композицию и агрегацию.

Часть 1: Основные элементы (Синтаксис и легенда)
Прежде чем углубляться в практический пример, необходимо определить терминологию, используемую в диаграммах UML.
1. Структура класса и видимость
Класс представляется прямоугольником, разделённым на три отсека:
-
Верхний отсек: Имя класса (например,
FlightBooking). -
Средний отсек: Свойства/Атрибуты (например,
+ nameProperty: String). -
Нижний отсек: Методы/Операции (например,
+ isActive(): boolean).
Модификаторы видимости:
-
+Публичный (Public): Доступен любому другому классу. -
-Приватный (Private): Доступен только внутри класса. -
#Защищённый: Доступен внутри класса и его подклассов. -
~Пакет: Доступен только внутри того же пакета.
2. Специальные типы классов
-
Интерфейсы (
<<interface>>): Контракты, определяющие методы без реализации. Представлены зелёным прямоугольником (в этой шпаргалке) или стандартной нотацией.-
Пример:
UserRepoс+ method(): void.
-
-
Абстрактные классы (
<<abstract>>): Базовые классы, которые нельзя инстанцировать напрямую. Они могут содержать абстрактные методы.-
Пример:
Componentс+ render(): void // абстрактный.
-
-
Перечисления: Набор именованных констант.
-
Пример:
JobStatus.
-
Пример диаграммы классов системы заказов

@startuml
skinparam classAttributeIconSize 0
skinparam shadowing false
‘ — ИНТЕРФЕЙСЫ —
interface PaymentGateway {
+ process(amount: double): boolean
}
‘ — АБСТРАКТНЫЕ КЛАССЫ —
abstract class Order {
# orderId: String
# totalAmount: double
+ {abstract} calculateTax(): double
+ getSummary(): String
}
‘ — КЛАССЫ —
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
}
« — ОТНОШЕНИЯ — »
Order <|– PhysicalOrder
Order <|– DigitalOrder
Order *– «1..*» OrderItem : содержит
Order ..> PaymentGateway : использует
PaymentGateway <|.. PayPalGateway
@enduml
Часть 2: Отношения и кратность
Линии, соединяющие классы, определяют, как они взаимодействуют.
1. Типы ассоциаций
-
Наследование (Обобщение):Сплошная линия с пустым треугольником. Отношение «Является».
-
Пример:
АвтомобильиМотоциклнаследуют отТранспортное средство.
-
-
Реализация:Пунктирная линия с пустым треугольником. Класс выполняет контракт интерфейса.
-
Пример:
АвтомобильреализуетУправляемый.
-
-
Композиция (Сильное владение): Сплошная линия с заполненным ромбом. «Часть» не может существовать без «целого».
-
Пример:
Ресторан(Целое) владеетМеню(Часть). Если ресторан закрывается, меню исчезает.
-
-
Агрегация: Сплошная линия с пустым ромбом. Отношение «имеет-а», при котором части могут существовать независимо.
-
Пример:
ЗаказагрегируетРесторан(Ресторан существует даже если заказ удалён).
-
2. Легенда кратности
Числа в концах линий указывают на кардинальность:
-
1: Ровно один. -
0..1: Ноль или один (Опционально). -
1..*: Один или более (Обязательный список). -
*: Много (Ноль или более).
Пример концепций наследования, реализации, композиции и агрегации

Часть 3: Реальный кейс: Единая платформа доставки еды
В этом разделе анализируется центральная диаграмма из шпаргалки, с подробным разбором архитектуры приложения для доставки еды.
1. Иерархия пользователей (Наследование и композиция)
Система начинается с общего классаПользователь, помеченного какАбстрактный. Это гарантирует, что не создаются объекты общего типа «Пользователь», а только конкретные типы.
-
Наследование:
КлиентиВодительнаследуютПользователь. -
Композиция:
-
КлиентимеетАдрес доставки(Сильная принадлежность). -
ВодительимеетДанные о транспортном средстве(Сильная принадлежность).
-
В этом разделе демонстрируются глубокая вложенность и коллекции.
-
Реализация интерфейса:
Ресторанреализует<<интерфейс>> Локализуемый, обеспечивая наличие данных о местоположении для каждого ресторана. -
Цепочка композиции:
-
Ресторан(1) сильно владеетМеню(1). -
МенюсодержитКатегория меню(1..*). -
Категория менюсодержитПозиция меню(*). -
Примечание: Эта структура гарантирует, что позиция меню не может существовать без категории, которая, в свою очередь, не может существовать без меню.
-
3. Обработка заказов и платежи
-
Структура заказа:
-
Заказимеет отношение сРесторан(Агрегация). -
Заказсильно владеетСтрока заказа(1..*). -
ЗаказимеетОплата(0..1), указывающее, что оплата является необязательной на начальном этапе создания.
-
-
Стратегия оплаты (Полиморфизм):
-
Система использует интерфейс
<<interface>> PaymentProcessor. -
Конкретные классы
StripeProcessorиPayPalProcessorреализуют этот интерфейс. Это позволяет системе переключаться между платёжными шлюзами без изменения основнойЗаказалогики.
-
4. Абстрактный класс против интерфейса (Пример с транспортным средством)
В правом верхнем углу шпаргалки разъясняется распространённое заблуждение:
-
Абстрактный класс (
Vehicle):CarиMotorcycleнаследуют отVehicle. Это подразумевает, что они разделяют основные данные/структуру (например,engineType,wheels). -
Интерфейс (
Drivable):автомобилемреализуетинтерфейс Управляемый. Это подразумеваетавтомобилемимеет специфическое поведение (drive()) котороеМотоциклможет не иметь (или может быть реализовано иначе).
Часть 4: Визуализация с помощью PlantUML
Ниже представлен код PlantUML для генерации основной структуры «Единой платформы доставки еды», описанной в кейс-стади. Вы можете скопировать его в любой редактор PlantUML, чтобы увидеть диаграмму.

@startuml
' Параметры стиля для соответствия стилю шпаргалки
skinparam classAttributeIconSize 0
skinparam linetype ortho
skinparam shadowing false
' --- ЛЕГЕНДА / СТЕРЕОТИПЫ ---
interface "Управляемый" as Drivable {
+ drive(): void
}
interface "Локализуемый" as Locatable {
+ getCoordinates(): Coordinate
}
interface "Обработчик платежей" as PaymentProcessor {
+ process(amount: double): boolean
}
abstract class "Пользователь" as User {
# id: int
# name: String
# email: String
+ login(): void
}
abstract class "Транспортное средство" as Vehicle {
# model: String
# year: int
}
class "Автомобиль" as Car
class "Мотоцикл" as Motorcycle
class "Клиент" as Customer
class "Водитель" as Driver
class "Ресторан" as Restaurant
class "Меню" as Menu
class "Категория меню" as MenuCategory
class "Позиция меню" as MenuItem
class "Заказ" as Order
class "Строка заказа" as OrderLineItem
class "Платеж" as Payment
class "Обработчик Stripe" as StripeProcessor
class "Обработчик PayPal" as PayPalProcessor
' --- ОТНОШЕНИЯ ---
' Иерархия транспортных средств
Vehicle <|-- Car
Vehicle <|-- Motorcycle
Car ..|> Drivable : Реализует
' Иерархия пользователей
User <|-- Customer
User <|-- Driver
' Композиции клиента/водителя
Customer *-- "1" ShippingAddress : Сильное владение
Driver *-- "1" VehicleDetails : Сильное владение
' Экосистема ресторана
Restaurant ..|> Locatable : Реализует
Restaurant "1" *-- "1" Menu : Композиция
Menu "1" *-- "1..*" MenuCategory : Коллекция
MenuCategory "1" *-- "*" MenuItem : Коллекция
' Экосистема заказа
Order "1" o-- "1" Restaurant : Агрегация
Order "1" *-- "*" OrderLineItem : Композиция
Order "1" --> "0..1" Payment
' Обработчики платежей
PaymentProcessor <|.. StripeProcessor
PaymentProcessor <|.. PayPalProcessor
' Специфические ассоциации (пример самоассоциации из легенды)
class "Сотрудник" as Employee
Employee --> "отчитывается перед" Employee
@enduml
Заключение
Владение диаграммами классов UML необходимо любому программному архитектору или разработчику. Как показано в Единой платформе доставки еды кейс-стади, UML позволяет нам визуализировать сложные отношения — например, разницу между автомобилем наследующим от транспортного средства и реализующим интерфейс Управляемый.
Строго соблюдая синтаксические правила, касающиеся множественности (1, , 1..) и владение (композиция против агрегации) команды могут предотвратить архитектурные ошибки, такие как потерянные записи данных или жесткие конструкции, которые трудно расширять. Независимо от того, проектируете ли вы простую систему входа или многостороннюю торговую площадку, хорошо составленная диаграмма UML остается самым эффективным инструментом для передачи вашего видения.












