Sobes.tech
Назад к вопросам
Junior — Middle
68

В чем заключается сходство между паттернами Repository и Facade?

Ответ от нейросети

sobes.tech AI

Что хотят услышать интервьюеры:

Repository и Facade оба прячут сложность за простым интерфейсом. В обоих случаях клиентский код не знает деталей внутренней реализации и работает с понятной абстракцией. Но цель у них разная: Repository скрывает доступ к данным, а Facade — сложность подсистемы.

Определение:

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

Repository предоставляет коллекционно-подобный интерфейс для работы с данными и отделяет доменную логику от механизма хранения. Facade предоставляет единый вход в набор связанных классов или подсистем и скрывает их внутреннюю координацию.

Сходство в том, что оба уменьшают связанность между клиентом и деталями реализации, делая код чище и проще для сопровождения.

Пример использования:

Например, в приложении интернет-магазина сервис заказа не должен знать, как именно читаются данные из базы или как устроены запросы к нескольким таблицам. Для этого используют Repository.

А если при оформлении заказа нужно вызвать проверку склада, расчет доставки и создание платежа, то удобнее спрятать эту последовательность за Facade.

public interface IOrderRepository
{
    Order? GetById(int id);
    void Save(Order order);
}

public class OrderServiceFacade
{
    private readonly IInventoryService _inventory;
    private readonly IPaymentService _payment;
    private readonly IShippingService _shipping;

    public OrderServiceFacade(
        IInventoryService inventory,
        IPaymentService payment,
        IShippingService shipping)
    {
        _inventory = inventory;
        _payment = payment;
        _shipping = shipping;
    }

    public void PlaceOrder(Order order)
    {
        _inventory.Reserve(order);
        _payment.Charge(order);
        _shipping.CreateShipment(order);
    }
}

Пояснение кода:

Код показывает разницу в точках применения, а заодно и сходство.

  1. IOrderRepository скрывает способ получения и сохранения заказа. Клиент работает с заказом как с объектом, не зная, SQL это, ORM или API.
  2. OrderServiceFacade скрывает сложную последовательность вызовов нескольких сервисов.
  3. Клиенту не нужно вручную вызывать Reserve, Charge и CreateShipment по отдельности — достаточно одного метода PlaceOrder.
  4. В обоих случаях внешний код становится проще, а изменения внутри реализации меньше затрагивают потребителей.

Ключевые моменты:

  • Оба паттерна инкапсулируют сложность и дают более простой интерфейс.
  • Оба снижают связанность между клиентом и внутренними деталями.
  • Repository ориентирован на доступ к данным и коллекциям сущностей.
  • Facade ориентирован на упрощение работы с подсистемой или набором сервисов.
  • Сходство есть в форме, но не в назначении: один про данные, второй про оркестрацию.