Skip to content

Циклические зависимости

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

Циклические зависимости возникают, когда два или более модулей зависят друг от друга напрямую или косвенно.

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

  • Сильная связанность: Модули становятся неразделимыми, что затрудняет их повторное использование по отдельности.
  • Проблемы инициализации: Могут привести к импортам со значением undefined во время выполнения, если сборщик не обработает их должным образом.
  • Сложность тестирования: Трудно мокать или изолировать один модуль, не подтягивая весь цикл зависимостей.
  • Когнитивная нагрузка: Разработчикам сложнее понять потоки данных и управления.

Примеры

Плохо

typescript
// orders.ts
import { processPayment } from './payments';
export const createOrder = () => {
  /* ... */
};

// payments.ts
import { createOrder } from './orders';
export const processPayment = () => {
  /* ... */
};

Хорошо

Вынесите общую логику в третий модуль.

typescript
// types.ts
export interface Order {
  /* ... */
}

// orders.ts
import { Order } from './types';
export const createOrder = () => {
  /* ... */
};

// payments.ts
import { Order } from './types';
export const processPayment = (order: Order) => {
  /* ... */
};

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

yaml
rules:
  cycles:
    severity: critical
    exclude: ['**/*.entity.ts']

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

  • exclude: ['**/*.entity.ts'] - паттерны файлов, которые исключаются из проверки на циклы

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

  1. Вынесите общую логику: Перенесите общие части в новый модуль, от которого будут зависеть оба исходных модуля.
  2. Внедрение зависимостей: Передавайте зависимости в качестве аргументов вместо их импорта.
  3. Используйте события: Используйте шину событий или обратные вызовы для развязки модулей.

ESLint правило

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

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

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

Released under the MIT License.