Ответ
-
Разделение ответственностей (SoC)
Каждый модуль/компонент должен решать одну задачу. Например, UI-логика отдельно от бизнес-логики. -
Dependency Injection (DI)
Внедрение зависимостей через параметры или контекст, а не жесткие импорты.
// Плохо
class AuthService {
private api = new ApiService(); // Жесткая зависимость
}
// Хорошо
class AuthService {
constructor(private api: ApiService) {} // DI
}
-
Использование интерфейсов/абстракций
Зависимости от абстракций, а не конкретных реализаций. -
Принцип единой ответственности (SRP)
Функция/класс должен иметь одну причину для изменения. -
Чистые функции
Функции без сайд-эффектов, зависящие только от входных параметров. -
Тестируемость
Код должен легко покрываться unit-тестами (изоляция зависимостей). -
Слоистая архитектура
Разделение на presentation, domain, data слои (например, по аналогии с Clean Architecture).