Skip to content

Модуль-концентратор

ID: hub_module | Степень критичности: Средняя (по умолчанию)

«Модуль-концентратор» (Hub Module) — это центральная точка в графе зависимостей, характеризующаяся одновременно высоким Fan-in (много потребителей) и высоким Fan-out (много зависимостей), при этом содержащая относительно мало внутренней логики.

Почему это «запах»

Модули-концентраторы являются опасными «точками отказа» в вашей архитектуре. Поскольку они находятся в центре многих путей, они становятся крайне хрупкими. Незначительное изменение в таком модуле может вызвать массовый волновой эффект во всей кодовой базе, что делает их рефакторинг трудным и рискованным.

Примеры

Плохо

Модуль, который просто реэкспортирует или координирует множество несвязанных сервисов и сам используется всем приложением.

typescript
// 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 зависимостей
  ) {}
}

Хорошо

Разбейте концентратор на конкретные, сфокусированные координаторы или используйте внедрение зависимостей на уровне потребителя, чтобы избежать центрального узла.

typescript
// auth-coordinator.ts (сфокусирован на координации аутентификации)
import { AuthService } from './auth';
import { SessionStore } from './session';

export class AuthCoordinator {
  constructor(
    private auth: AuthService,
    private session: SessionStore
  ) {}
}

Конфигурация

yaml
rules:
  hub_module:
    severity: medium
    min_fan_in: 5
    min_fan_out: 5
    max_complexity: 5

ESLint правило

Этот детектор доступен как правило ESLint для получения обратной связи в реальном времени.

javascript
// eslint.config.js
export default [
  {
    rules: {
      '@archlinter/no-hub-modules': 'warn',
    },
  },
];

Смотрите Интеграция с ESLint для инструкций по настройке.

Как исправить

Разбейте концентратор! Определите различные пути передачи данных или управления, проходящие через концентратор, и выделите их в отдельные, более узкоспециализированные модули.

Параметры по умолчанию

  • min_fan_in: 5 - минимальное количество модулей, зависящих от данного модуля
  • min_fan_out: 5 - минимальное количество модулей, от которых зависит данный модуль
  • max_complexity: 5 - максимальная цикломатическая сложность модуля

Released under the MIT License.