Ответ 1
Вы можете попробовать Lazy С++. Я не использовал его, но я считаю, что это инструмент командной строки, который сделает именно то, что вы хотите.
Исходный код нашего приложения - сотни тысяч строк, тысячи файлов, а местами очень старые - приложение было впервые написано в 1995 или 1996 году. За последние несколько лет моя команда значительно улучшила качество источник, но остается одна проблема, особенно ошибка: у многих классов есть много методов, полностью определенных в их заголовочном файле.
У меня нет проблем с методами, объявленными inline в заголовке в некоторых случаях - конструктором структуры, простым методом, в котором inlining измеримо делает его быстрее (у нас есть некоторые математические функции, подобные этому) и т.д. Но либеральное использование встроенных методов без видимых причин:
Эта последняя причина может теперь вызвать проблемы для нас, и это хорошая причина пройти через кодовую базу и переместить большинство определений в исходный файл.
Наша кодовая база огромна. Есть ли автоматизированный инструмент, который может сделать (для большинства) это для нас?
Примечания:
Вы можете попробовать Lazy С++. Я не использовал его, но я считаю, что это инструмент командной строки, который сделает именно то, что вы хотите.
Если код работает, я бы проголосовал против любого крупного автоматизированного переписывания.
Много работы могло бы быть связано с его исправлением.
Небольшие итеративные улучшения со временем - лучший метод, так как вы сможете тестировать каждое изменение в изоляции (и добавлять модульные тесты). В любом случае ваша главная жалоба на то, что вы не можете найти код, не является реальной проблемой и уже решена. Уже есть инструменты, которые будут индексировать вашу базу кода, чтобы ваш редактор перешел к правильному определению функции, не требуя его поиска. Взгляните на ctags или эквивалент для вашего редактора.
Беспокойство
Субъективное
Сложно найти реализацию метода (особенно поиск по дереву классов для виртуальной функции, только для поиска одного класса была указана его версия в заголовке...)
Уже имеются инструменты для поиска функции.
ctags
создаст файл, который позволит вам перейти непосредственно к функции из любого подходящего редактора (vim/emacs). Я уверен, что ваш редактор, если один из них имеет эквивалентный инструмент.
Вероятно, увеличивается размер скомпилированного кода
Вряд ли. Компилятор выберет встроенную или не основанную на внутренних показателях, а не погоду, она будет помечена в исходном тексте.
Наверное, вызывает проблемы для нашего компоновщика, который, как известно, неровный для больших кодовых баз. Справедливости ради, за последние несколько лет он стал намного лучше, но он не идеален.
Вряд ли. Если ваш компоновщик является чешуйчатым, значит, он нечеткий, он не будет иметь большого значения, если функции определены так, как это не имеет никакого отношения, если они все равно вложены.
У вас есть ряд проблем для решения:
В обоих случаях вам нужен надежный синтаксический анализатор С++ с полным разрешением имен, чтобы точно определить зависимости.
Затем вам нужны механизмы, которые могут надежно модифицировать исходный код С++.
Наш DMS Software Reengineering Toolkit с его С++ Front End. DMS используется для крупномасштабной реструктуризации кода на С++; см. http://www.semdesigns.com/Company/Publications/ и отследить первую статью "Пример: реконструирование моделей компонентов С++ с помощью автоматической трансформации программы". (Там более старая версия этой статьи вы можете скачать оттуда, но опубликованный лучше). AFAIK, DMS - единственный инструмент, который когда-либо применялся для преобразования С++ в больших масштабах.
Эта SO-дискуссия о реорганизации кода напрямую затрагивает проблему группировки.
XE2 включает новый статический анализатор. Возможно, стоит попробовать новую версию С++ Builer.