Я унаследовал не слишком большой унаследованный код C ++, который в настоящее время реинжиниринг.До сих пор я достаточно хорошо понимаю большую часть кода и могу его использовать, хотя обслуживание - ад.Я думаю, что главная трудность заключается в массовом использовании директив препроцессора для управления поведением программы.
Рассмотрим следующие примеры:
void function(){
... // lots of code
#ifdef PARAMETER == 1
do_one_thing();
#elif PARAMETER == 2
do_another_thing();
...//etc
#endif
...//lots of code
}
или
void function(double arg1,
#ifdef SOME_PP_VAR1 == 5
double arg2,
#endif
)
и такие вещи, как
#ifdef SOME_PP_VAR2 == 2
typedef myVector std::vector<double>;
#elif SOME_PP_VAR2 == 7
typedef myVector std::vector<int>;
#endif
в глобальном масштабе.Или даже
#ifdef SOME_PP_VAR2 == 2
#include "some_header.hpp"
#elif SOME_PP_VAR2 == 7
#include "some_other_header.hpp"
#endif
Около 30 таких переменных препроцессора устанавливаются в файле конфигурации, который передается в систему сборки, а затем в компилятор.Он в основном контролирует все и присутствует практически в любом файле.Кстати, в некоторых местах #ifs даже вложены.
Поэтому довольно сложно писать юнит-тесты.Мне нужно было бы собрать все возможные комбинации переменных препроцессора и проверить каждую.
Мои (плохие) идеи на данный момент таковы:
- Переписать код с нуля, возможно, вдругой язык.(Высокий риск, слишком много времени).
- Заменить переменные препроцессора константами.(Не всегда выполнимо).
Вы когда-нибудь сталкивались с такой ситуацией и как справились с ней?
С уважением и заранее спасибо.