S — Single Responsibility (Единственная ответственность)
• Storage отвечает только за учет стока и проверку лимитов.
• Coordinates отвечает исключительно за геометрию и расчет расстояния.
• Route не считает логику отгрузок, а лишь управляет цепочкой этапов.
O — Open/Closed (Открытость для расширения / закрытость)
Интерфейс IStage позволяет добавлять новые типы этапов (например, Таможенный контроль или Заправка грузовика) без изменения кода класса Route.
L — Liskov Substitution (Подстановка Барбары Лисков)
Любая реализация IStage (MoveStage, ShipmentStage, ReceiptStage) может быть взаимозаменяема в коллекции Route.Stages.
Также: Truck и Warehouse НЕ наследуются от Storage (что нарушило бы LSP), а используют композицию.
I — Interface Segregation (Разделение интерфейсов)
Интерфейс IStage минималистичен: содержит единственный метод StageResult Execute(Truck truck), ничего лишнего.
D — Dependency Inversion (Инверсия зависимостей)
Route зависит от абстракции IStage, а не от конкретных ShipmentStage / MoveStage.