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» без конкретного паттерна — это был бы шум.
См. также
- Рекомендации — когда hot zones выпускаются в actionable advice.
- Поиск циклов — фактор
+50% inCycle.