Перейти к содержанию

Посредничество (Indirection)

Indirection предлагает ввести промежуточный слой между подсистемами, чтобы ослабить прямую зависимость.

Опора на ООП

Indirection опирается на интерфейсы, инкапсуляцию и низкую связанность: вместо прямой связи два участника работают через промежуточный объект или слой.

Что показывает пример на 1С

  • прикладной код работает с NotificationGateway.
  • шлюз уже сам решает, какой отправитель использовать: email, Telegram или другой канал.
  • доменный код не зависит напрямую от конкретного канала доставки.

Пример

CommonModules.NotificationGateway.NotifyManager(SalesOrder);
Procedure NotifyManager(SalesOrder) Export

    Sender = CommonModules.TelegramSender;
    Sender.Send(SalesOrder.Manager, SalesOrder.Number);

EndProcedure
Procedure Send(User, MessageText) Export

    // Telegram integration.

EndProcedure

Близость к Adapter, Proxy и Decorator

Indirection близок к Adapter, Proxy и Decorator, потому что во всех четырех случаях между клиентом и реальной реализацией появляется промежуточный слой.

Снаружи это действительно похоже:

  • клиент не идет напрямую к конечному объекту;
  • появляется дополнительный объект или модуль между слоями;
  • часть зависимости скрывается за более удобной точкой входа.

Но у Indirection намерение шире и архитектурнее.

  • Indirection нужен, чтобы развязать две части системы через промежуточный слой.
  • Adapter нужен, чтобы перевести один контракт в другой.
  • Proxy нужен, чтобы контролировать доступ, создание или способ обращения к объекту.
  • Decorator нужен, чтобы нарастить поведение поверх существующего компонента.

Для 1С это удобно различать так:

  • NotificationGateway между прикладным кодом и каналами доставки - это Indirection;
  • обертка над старым общим модулем с неудобным API - это Adapter;
  • модуль, который проверяет права или лениво создает тяжелый сервис - это Proxy;
  • слой логирования, ретраев или метрик вокруг отправителя - это Decorator.

Где полезен в 1С

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

Когда принцип применяют неправильно

  • если промежуточный слой ничего не упрощает;
  • если из-за лишней прослойки архитектура становится мутнее;
  • если Indirection превращается в бесконечную матрешку сервисов.