Недавно я все больше и больше расстраивался проблемой, которую я вижу в моей кодовой базе проектов.
Я работаю над крупномасштабным проектом Java, который имеет > 1M строк кода. Интерфейсы и структура классов разработаны очень хорошо, и инженеры, пишущие код, очень компетентны. Проблема заключается в том, что в попытке сделать код чище люди пишут классы Утилиты всякий раз, когда им нужно повторно использовать некоторые функции, в результате с течением времени и по мере того, как в проекте растет все больше и больше полезных методов. Однако, когда следующий инженер сталкивается с необходимостью такой же функциональности, он не знает, что кто-то уже реализовал класс (или метод) утилиты где-то в коде и реализует другую копию функций в другом классе. Результатом является много дублирования кода и слишком много полезных классов с перекрывающимися функциональными возможностями.
Существуют ли какие-либо инструменты или какие-либо принципы проектирования, которые мы, как команда, можем реализовать для предотвращения дублирования и низкой видимости классов полезности?
Пример: У инженера A есть 3 места, которые ему необходимо преобразовать XML в String, поэтому он пишет класс утилиты, называемый XMLUtil, и помещает в него статический метод toString(Document)
. Инженер B имеет несколько мест, где он сериализует документы в различных форматах, включая String, поэтому он пишет класс утилиты, называемый SerializationUtil, и имеет статический метод с именем serialize(Document)
, который возвращает строку.
Обратите внимание, что это больше, чем просто дублирование кода, так как вполне возможно, что 2 реализации вышеприведенного примера отличаются (например, один использует API-интерфейс трансформатора, а другой использует Xerces2-J), поэтому это можно рассматривать как "передовой практики"...
Обновление: Я предполагаю, что лучше описать текущую среду, в которой мы развиваемся. Мы используем Hudson для CI, Clover для покрытия кода и Checkstyle для статического анализа кода. Мы используем гибкое развитие, включая ежедневные переговоры и (возможно, недостаточные) обзоры кода. Мы определяем все наши классы полезности в .util, который благодаря этому размеру теперь имеет 13 подпакетов и около 60 классов под корневым (.util) классом. Мы также используем сторонние библиотеки, такие как большинство баннеров apache и некоторые банки, которые составляют Guava.
Я уверен, что мы можем уменьшить количество утилит наполовину, если мы поставим кого-то на задачу реорганизации всего пакета, мне было интересно, есть ли какие-либо инструменты, которые могут сделать эту операцию менее дорогостоящей, и если есть любые методологии, которые могут как можно больше задержать проблему от повторения.