Коротка відповідь
middleFacade — це патерн, що створює простий інтерфейс над складною підсистемою. У TS це клас, який агрегує декілька сервісів і надає методи‑обгортки, наприклад `init()` або `shutdown()`. Приклад: `class PaymentFacade { constructor(private stripe: Stripe, private paypal: PayPal) {} async charge(amount:number){ await this.stripe.charge(amount); await this.paypal.refund(); }}`
Повне пояснення
1. Що це і навіщо
Facade — патерн структури, що забезпечує простий інтерфейс над складною підсистемою. Використовується, коли треба приховати внутрішню логіку і надати клієнту «чистий» API.
2. Принцип роботи / алгоритм
Патерн створює об’єкт‑обгортку, який агрегує декілька компонентів (Context). Клієнт викликає методи фасаду, а фасад розподіляє запити між підсистемами. Діаграма: Client → Facade → SubsystemA, SubsystemB.
3. Реалізація (JS / TS)
- Базова реалізація
class Facade {
constructor(private a: A, private b: B) {}
doSomething() { this.a.action(); this.b.action(); }
}
- Веб‑dev приклад – API Gateway, що об’єднує REST і GraphQL:
class ApiFacade {
constructor(private rest: RestClient, private gql: GraphQLClient) {}
async fetchUser(id:string){ return this.rest.get(`/users/${id}`); }
}
- Новачковий спрощений – об’єднання двох логін‑сервісів:
class AuthFacade { login(email,password){ return this.emailService.login(email,password); } }
4. Тестування (Jest або Vitest)
test('Facade delegates to subsystems', () => {
const a = { action: jest.fn() } as any;
const b = { action: jest.fn() } as any;
new Facade(a,b).doSomething();
expect(a.action).toBeCalled();
expect(b.action).toBeCalled();
});
5. Проблеми та edge cases
- Неправильне використання ролей – фасад замість об’єкта‑контексту.
- Зайва абстракція – коли фасад не додає ніякої цінності.
- Cyclical dependencies – фасад залежить від підсистем, а підсистеми залежать від фасаду.
- Плутанина з Proxy – обидва схожі, але різні цілі.
- Performance‑пастки – фасад може збільшити кількість викликів, якщо не кешує.
6. Оптимізація та продуктивність
Фасад не змінює алгоритм підсистем, тому вплив мінімальний. Перевага – зменшення кількості викликів клієнта, що може знизити накладні витрати.
7. Без JS / архітектурні альтернативи
У чистій HTML/CSS можна створити «фасад» через wrapper‑компонент, що обгортає декілька елементів і надає спрощений API через атрибути. У бекенді можна використати Service‑Layer, що об’єднує репозиторії.
8. Cheatsheet + follow-up
- Cheatsheet:
class Facade { constructor(subsystems) {} public method() { /* delegate */ } } - Interview Q1: Як фасад допомагає із тестуванням?
- Interview Q2: Коли не слід використовувати фасад?