Я унаследовал не слишком большой унаследованный код 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 таких переменных препроцессора задаются в файле конфигурации, который передается системе сборки, а затем компилятору. Он в основном контролирует все и присутствует практически в любом файле. Кстати, в некоторых местах #if даже вложены.
Поэтому писать юнит-тесты довольно сложно. Мне пришлось бы построить все возможные комбинации переменных препроцессора и протестировать каждую.
Мои (плохие) идеи на данный момент таковы:
Вы когда-нибудь сталкивались с такой ситуацией и как вы с ней справлялись?
С уважением и заранее спасибо.
Я бы сделал специальный комментарий рядом с любой из этих вещей, чтобы вы могли быстро обработать весь исходный код, используя какой-нибудь инструмент анализа, и вытащить все различные условия. После того, как вы извлекли эти данные, вы можете проверить, какие комбинации действительно используются. (Кто использует #ifdef в качестве аргумента? Я действительно имею в виду!)
@tadman Это одна из моих любимых частей. Фактически я создаю небольшой музей таких фрагментов кода. Может быть, я опубликую это, когда оно будет на высоте.
Звучит как чертовски готовый пост на Medium или Dev.to.





Этот метод кодирования - полное безумие, и чем раньше вы избавитесь от всех этих утверждений
#ifdef, тем лучше. Возможно, вы захотите создать собственные сценарии сборки, чтобы скомпилировать его в N различных формах, а затем убедиться, что он работает правильно в этих формах. Позже, когда вы перейдете к менее варварским методам программирования, вы сможете убедиться, что ничего не изменилось. Нет простого способа сделать это. Кто-то вырыл глубокую яму, чтобы вы могли выбраться из нее.