Вопрос проверяет понимание принципа инверсии зависимостей и использования интерфейсов для создания гибкой и тестируемой архитектуры.
Интерфейсы в программировании определяют контракт — набор методов, которые должна реализовать любая подходящая сущность. Когда код зависит от интерфейса, а не от конкретного класса, появляется возможность подменять реализации без изменения использующего кода. Это ключевой принцип слабой связанности (loose coupling).
interface ILogger {
log(message: string): void;
}
class ConsoleLogger implements ILogger {
log(message: string) {
console.log(message);
}
}
class FileLogger implements ILogger {
log(message: string) {
// запись в файл
}
}
class App {
constructor(private logger: ILogger) {}
run() {
this.logger.log('App started');
}
}
// Подмена реализации
const app = new App(new ConsoleLogger());
// или
const app2 = new App(new FileLogger());Интерфейсы — это инструмент для построения гибкой архитектуры. Используйте их везде, где возможна смена реализации: в сервисах, репозиториях, адаптерах. Это делает код тестируемым, расширяемым и независимым от конкретных библиотек или внешних систем.