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