В чем заключается сходство между паттернами 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);
}
}
Пояснение кода:
Код показывает разницу в точках применения, а заодно и сходство.
IOrderRepositoryскрывает способ получения и сохранения заказа. Клиент работает с заказом как с объектом, не зная, SQL это, ORM или API.OrderServiceFacadeскрывает сложную последовательность вызовов нескольких сервисов.- Клиенту не нужно вручную вызывать
Reserve,ChargeиCreateShipmentпо отдельности — достаточно одного методаPlaceOrder. - В обоих случаях внешний код становится проще, а изменения внутри реализации меньше затрагивают потребителей.
Ключевые моменты:
- Оба паттерна инкапсулируют сложность и дают более простой интерфейс.
- Оба снижают связанность между клиентом и внутренними деталями.
- Repository ориентирован на доступ к данным и коллекциям сущностей.
- Facade ориентирован на упрощение работы с подсистемой или набором сервисов.
- Сходство есть в форме, но не в назначении: один про данные, второй про оркестрацию.