Какими инструментами можно автоматически производить анализ C++ проекта на различные метрики сложности кода?
На данный момент работаю на проекте с унаследованной кодовой базой от предыдущих проектов. В коде ад и кошмар. Очень много копипаста целыми блоками кода, огромные куски закоментированного кода, функции до нескольких тысяч строк. Но как всегда нет времени на код ревью и рефакторинг. Проект довольно большой, чтобы вручную ходить по коду и рефакторить.
Я поискал средства анализа кода, но ничего такого, что помогло мне в моём случае не нашёл. Возможно плохо искал, и тогда прошу посоветовать те программные решения, которые используете вы или какие то идеи по решению данной проблемы. В худшем, у меня есть мысли как это автоматизировать с помощью скрипта на python. Например, для начала написать код для поиска кусков скопированного кода, очень больших функций (больше ~100 строк) и классов. Потом дополнять функциональность, чтобы можно было потом быстро сканировать проект и выявлять места для рефакторинга.
Не боитесь "капнуть на пятно чистым"? После такого рефакторинга, который вы планируете, код не станет намного лучше - это будет та же легаси-каша, но с заплатками рефакторинга, которые к тому же налеплены механически, без понимания того, что происходит в этом конкретном месте.
Имхо, разбивка проекта на модули и чистка их в порядке "пахучести" более перспективна - вы хотя бы за часть кода сможете быть спокойны.
А так - ну, найдете вы километровые функции. Ну, разобьете их на десять стометровок. Код от этого действительно улучшится? Имхо, без взгляда на функции с более высокого уровня рефакторинг - мартышкин труд.
которые к тому же налеплены механически, без понимания того, что происходит в этом конкретном месте.
Не, не механически. Скрипт будет только давать рекомендации обратить внимание на эти куски кода. Скрипт ничего с кодом не делает.
разбивка проекта на модули и чистка их в порядке "пахучести" более перспективна - вы хотя бы за часть кода сможете быть спокойны.
Отличная идея! Странно, что самому в голову не пришла. Я впервые имею дело с такого рода проектом и не хотел бы, как вы говорите "капнуть на пятно чистым".
А так - ну, найдете вы километровые функции. Ну, разобьете их на десять стометровок. Код от этого действительно улучшится? Имхо, без взгляда на функции с более высокого уровня рефакторинг - мартышкин труд.
Я полагаю так, что если у меня больше 40 функций, размером овер 1к строк, то наверняка есть копипаст и нет нормального реюза кода. Смысл анализа больших функций в том, чтобы повысить реюз. Ну и задуматься над архитектурой, чтобы не случилось того, о чем вы говорите.
Вообще, глядя на проект, даже непонятно с чего начинать. Вроде он модульный, но при этом легче от этого не становится(
pixik: с тестов, например. Они не только помогут ничего не сломать при рефакторинге, но и дадут понимание того, что происходит и как оно должно происходить.
Ну, и реюз кода - не самоцель, на самом деле. Копипаста тоже может работать веками и надежно. Дублирование логики в разных участках кода - вот это попахивает.
Например, у вас выводятся файлы в определенном формате, но с разными вариациями - у вас будет ряд функций, выполняющих примерно одни и те же действия. Приведение их к единой функции со сложной логикой может только ухудшить сопровождение - и не дать никакой практической пользы, особенно если время от времени добавляются новые варианты, и добавить их копированием и правкой примерно аналогичного варианта намного легче, чем прописать новые варианты той сложной логики.