Как вы собираетесь конвертировать достаточно большой ( > 300K), довольно зрелый C-код C в С++?
Тип CI имеет в виду разделение на файлы, грубо соответствующие модулям (т.е. менее гранулированные, чем типичная декомпозиция на основе OO), используя внутреннюю связь вместо частных функций и данных и внешнюю привязку для публичных функций и данных, Глобальные переменные широко используются для связи между модулями. Доступен очень обширный набор тестов интеграции, но нет тестов уровня (то есть модуля).
Я имею в виду общую стратегию:
- Скомпилируйте все в подмножестве С++ C и получите эту работу.
- Преобразование модулей в огромные классы, так что все перекрестные ссылки ограничены именем класса, но оставляют все функции и данные статическими членами и получают эту работу.
- Преобразование огромных классов в экземпляры с соответствующими конструкторами и инициализированные перекрестные ссылки; заменять статические членские обращения с косвенным доступом, если это необходимо; и заставить работать.
- Теперь подходим к проекту как к непринужденному OO-приложению и пишем единичные тесты, в которых взаимозависимы, и разлагаются на отдельные классы, где они не являются; целью здесь было бы перейти от одной рабочей программы к другой при каждом преобразовании.
Очевидно, это будет довольно много работы. Есть ли какие-либо тематические исследования/военные истории в этом переводе? Альтернативные стратегии? Другие полезные советы?
Примечание 1: программа является компилятором, и, вероятно, миллионы других программ полагаются на то, что ее поведение не меняется, поэтому опциональное переписывание в значительной степени не является вариантом.
Примечание 2: источнику почти 20 лет, и, возможно, 30% отторжения кода (строки, измененные + добавленные/предыдущие общие строки) в год. Другими словами, он поддерживается и расширяется. Таким образом, одна из целей будет заключаться в увеличении удобства обслуживания.
[Ради вопроса, предположим, что перевод в С++ является обязательным, а его оставление на C - не. Пункт добавления этого условия состоит в том, чтобы отсеять ответы "оставьте его в C".]