Блог Томаша Фиялковского о программировании

Искусство программирования — это искусство организации сложности: умение управлять множеством и избегать его хаоса максимально эффективно. Модульность в проектах — одна из ключевых техник, которая позволяет поддерживать читаемость кода, его масштабируемость и удобство сопровождения. По мере развития проектов, особенно крупных по масштабу, модульность становится важным элементом, обеспечивающим порядок и прозрачность структуры кода.

Однако по мере продвижения проекта и внесения новых изменений, а также при смене состава разработчиков, легко забыть первоначальные предположения архитектуры. В этом на помощь приходят автоматизированные тесты. Но что именно тестировать и как это делать? Без надёжных тестов мы не можем гарантировать, что наша модульная структура отвечает поставленным целям.

Некоторые аспекты модулей, такие как зависимости между модулями и циклы в языке Java, можно проверять с помощью ArchUnit. Однако эта библиотека не решает всех задач. Рассмотрим два других особенно важных случая.

1. Когда модулей много, а один из них содержит подавляющее большинство кода, модульность теряет смысл. Например, если у нас 15 модулей, а один из них содержит 80% кода, говорить о настоящей модульности нельзя, поскольку почти весь код сосредоточен в одном модуле. Такая ситуация требует устранения через автоматизированные тесты размера модулей.

2. Некоторые модули должны быть особенно небольшими. Важно также гарантировать, что отдельные модули остаются компактными и стабильными с точки зрения частоты вносимых в них изменений. Например, модуль «commons» должен быть маленьким и содержать общую функциональность, часто используемую в разных частях проекта. Если этот модуль разрастается, это может создать проблемы при управлении и изменении кода. Разумеется, это упрощённая оценка: более важно минимизировать интерфейс модуля и поддерживать его стабильность по изменениям, что не всегда равнозначно минимизации размера модуля.

Поскольку описанные проблемы представляют для меня существенный интерес, я решил проверить их через тесты. Реализация может быть очень простой и сводиться к подсчёту строк кода в пакетах. К моему удивлению, я не нашёл готового инструмента, который позволял бы быстро проверить размер модулей. Поэтому я подготовил Java-библиотеку для тестирования размера модулей — module-size-calculator.

Эта библиотека позволяет анализировать размер модулей в проекте по числу строк кода (LOC). Теперь можно писать тесты, проверяющие распределение кода по модулям и утверждающие допустимые границы. Библиотека поддерживает различные утверждения относительно размера модулей, а если какого‑то варианта проверки нет, можно использовать классические JUnit-утверждения на основании сгенерированного отчёта. Также библиотека умеет генерировать отчёт в виде диаграммы-пирога для Mermaid, которую затем можно включить, например, в документацию.

Модульность — ключевой аспект проекта. Тестируйте её, чтобы она не утратила своих свойств со временем. Programming Chi (или Qi) — блог о скромных идеях, ошибках и неудачах, с которыми я сталкиваюсь каждый день. К счастью, наряду с неудачами бывают многочисленные успехи и элегантные решения, о которых я тоже надеюсь писать.