Модуль-концентратор
ID: hub_module | Степень критичности: Средняя (по умолчанию)
«Модуль-концентратор» (Hub Module) — это центральная точка в графе зависимостей, характеризующаяся одновременно высоким Fan-in (много потребителей) и высоким Fan-out (много зависимостей), при этом содержащая относительно мало внутренней логики.
Почему это «запах»
Модули-концентраторы являются опасными «точками отказа» в вашей архитектуре. Поскольку они находятся в центре многих путей, они становятся крайне хрупкими. Незначительное изменение в таком модуле может вызвать массовый волновой эффект во всей кодовой базе, что делает их рефакторинг трудным и рискованным.
Примеры
Плохо
Модуль, который просто реэкспортирует или координирует множество несвязанных сервисов и сам используется всем приложением.
// app-hub.ts
import { AuthService } from './auth';
import { ApiService } from './api';
import { LoggerService } from './logger';
import { ConfigService } from './config';
// ... еще 10 импортов
export class AppHub {
constructor(
public auth: AuthService,
public api: ApiService,
public logger: LoggerService
// ... еще 10 зависимостей
) {}
}Хорошо
Разбейте концентратор на конкретные, сфокусированные координаторы или используйте внедрение зависимостей на уровне потребителя, чтобы избежать центрального узла.
// auth-coordinator.ts (сфокусирован на координации аутентификации)
import { AuthService } from './auth';
import { SessionStore } from './session';
export class AuthCoordinator {
constructor(
private auth: AuthService,
private session: SessionStore
) {}
}Конфигурация
rules:
hub_module:
severity: medium
min_fan_in: 5
min_fan_out: 5
max_complexity: 5ESLint правило
Этот детектор доступен как правило ESLint для получения обратной связи в реальном времени.
// eslint.config.js
export default [
{
rules: {
'@archlinter/no-hub-modules': 'warn',
},
},
];Смотрите Интеграция с ESLint для инструкций по настройке.
Как исправить
Разбейте концентратор! Определите различные пути передачи данных или управления, проходящие через концентратор, и выделите их в отдельные, более узкоспециализированные модули.
Параметры по умолчанию
min_fan_in:5- минимальное количество модулей, зависящих от данного модуляmin_fan_out:5- минимальное количество модулей, от которых зависит данный модульmax_complexity:5- максимальная цикломатическая сложность модуля