Skip to content

Hot zones

Hot zone — модуль, который сильно болит при изменении: от него зависит много всего, он сам много от чего зависит, и в идеале он ещё либо большой, либо в цикле. Hotness score ранжирует модули, чтобы худшие проступали первыми.

Score

Для каждого модуля:

couplingScore = log2(fanIn + 1) * log2(fanOut + 1)        // нормировано 0..1 на проект
hotnessScore  = couplingScore * (1 + 0.5 * inCycle) * sizeFactor

Где:

  • fanIn — сколько модулей импортируют этот.
  • fanOut — сколько модулей этот импортирует.
  • inCycle — булевое: входит ли модуль хотя бы в один SCC.
  • sizeFactor — log-шкала строк кода, нормированная на ≈ 0.5..1.5.

log2(x+1) притупляет длинный хвост — модуль с 200 импортёрами не в 100× хуже модуля с 20. Произведение (fan-in × fan-out, log-шкала) ловит ощущение «застрял посередине»: модуль, на котором и много кто висит, и который много кого тянет, рефакторится тяжелее, чем тот, что тяжёл только в одну сторону.

+50% за нахождение в цикле отражает то, что циклы умножают цену любого изменения. Размер важнее coupling-а меньше, поэтому sizeFactor — множитель, не первичный член.

Ранжирование

Top-N модулей по hotnessScore — hot zones проекта. Десктоп подсвечивает их тёплым цветом и выводит в Insights. CLI отдаёт их в поле hotZones JSON-конверта.

Чем hot zones не являются

  • Это не баги. У heavily-used утилиты должен быть высокий fan-in. У координирующего файла должен быть высокий fan-out. Hot zones — указатели внимания, а не «исправь это».
  • Они не привязаны к grade напрямую. В проекте могут быть легитимные hot zones (роутер, провайдер контекста) и при этом A-grade. Grade в основном определяется циклами и нарушениями слоёв.

Когда hot zones становятся рекомендациями

Hot zone повышается до рекомендации, только когда копятся дополнительные сигналы. Самый явный кейс — split-god-module: fan-in в топ-5%, fan-in ≥ 8 и ≥ 300 строк кода. Все три порога должны срабатывать. Мы намеренно не рекомендуем «сделай что-то с hot zone X» без конкретного паттерна — это был бы шум.

См. также

Выпущено под лицензией BUSL-1.1.