Я унаследовал довольно большой проект с десятками тысяч строк, но предыдущие разработчики упаковали их только в 6 файлов (OMG!) …
Поэтому для удобства чтения я хотел бы автоматически разбить все классы на их собственные файлы cpp / h.
Есть ли инструмент, способный на такое?
Для того, чтобы реорганизовать базу кода C ++, вам нужен инструмент, который может анализировать C ++, сохраняя файлы заголовков, и в то же время следовать #include и обрабатывать их. Для каждой пары зависимых элементов вы должны составить отображение «a-зависит от b», а затем кластеризовать их. Наконец, вы должны быть в состоянии восстановить исходный код в соответствии с кластеризацией.
И вы хотите сделать это по всей базе кода, а не по одному модулю компиляции.
Это довольно сложный инструмент для поиска: -} Я не думаю, что вы найдете его с полки.
Наш инструментарий реинжиниринга программного обеспечения DMS имеет много из этого. Это общая система анализа и преобразования программ, имеет полный интерфейс C ++ и имеет управляемый препроцессор, поэтому она может расширять / не расширять #include при необходимости. Он может захватывать отношения «зависит от b» (мы сделали это в системе C с 26 миллионами строк кода) и обладает доказанной способностью символически рассуждать о состояниях препроцессора; есть потенциал для захвата «а-зависит-от-б, если».
С этой информацией вам нужно кластеризоваться. Я думаю, чтобы сделать это, вам нужен какой-то общий алгоритм кластеризации и некоторый пользовательский ввод для его переопределения («Я настаиваю, оставьте этот файл #include в покое, и эти две явно не связанные вещи будут идти вместе»). Часть преобразования программы в DMS может затем использоваться для механического разделения кода и включения файлов в сгруппированные зависимые объявления.
DMS — сложный инструмент; в конце концов, он имеет дело с неприятными вещами, такими как C ++. Настроить его для выполнения вышеупомянутых задач нетривиально, но я думаю, что это в пределах технической досягаемости.
Тем не менее, ничто из этого не поможет вам немедленно решить проблему приобретения инструмента, который поможет вам решить вашу проблему сегодня.
Я почти уверен, что нет инструмента, который будет выполнять эту задачу автоматически. Это все еще активная область исследований. Например, см.На пути к автоматическому расщеплению классов с помощью межгрупповой кластеризацииMsgstr «Я знаю пару инструментов для Java, которые предоставляют некоторую помощь (JDeodorant, доб-с), но они не полностью автоматические. Я не знаю ни одного инструмента C ++.
Вы не говорите, какой редактор или платформу вы используете, и поэтому неясно, почему большие файлы являются проблемой.
Я думаю, что это ваше решение:
Хороший редактор должен уметь находить класс по имени, иметь браузер классов, который позволяет переходить к определению любого класса, члена, функции или любого другого определения, находить использование любого символа с помощью щелчка правой кнопкой мыши или клавиатуры. ярлык и, как правило, сделает поиск по нему настолько простым, что размер файла не будет иметь значения.
С другой стороны, возможно, у вас есть хороший редактор, и вам просто нужно научиться делать эти вещи в нем.