Пытаясь получить представление о том, насколько сложно поддерживать какой-либо устаревший код C ++ и C #, а также о том, есть ли риск появления в нем ошибок, было высказано предположение, что было бы полезно измерить, насколько широко или узко определены переменные. В коде используется много глобальных переменных или переменных с широкой областью действия, где локальные лучше. Распространенным явлением является обнаружение того, что эти переменные используются для 2 или 3 строк кода на нескольких уровнях области видимости, откуда они объявлены.
Я знаю, что инструменты статического анализа кода обычно пытаются количественно определить взаимосвязь и сплоченность, но есть ли что-то более конкретное для измерения области переменных / данных?
Да, это стандартная методика статического анализа. Это называется анализ переменной жизни. В эта книга, пример введения делает такой анализ.
От Статья в википедии об этом:
В теории компилятора, живой анализ переменных (или просто живость
анализ) — классический анализ потока данных, выполняемый компиляторами для
рассчитать для каждой точки программы переменные, которые могут быть потенциально
прочитайте перед следующей записью, то есть переменные, которые живут в
выход из каждой программной точки.Проще говоря: переменная является живой, если она содержит значение, которое может быть
нужно в будущем.
Я сосредоточусь на локальных переменных в ОО-языках (Java, C #, C ++). Я могу подумать о ряде мер, касающихся области действия локальной переменной.
Размер области локальной переменной
количество операторов, доступных для локальной переменной Это не должно быть слишком большим, поскольку это указывает на слишком длинный метод. Однако подсчет операторов метода может быть более адекватным измерением для этого.
Доступное количество локальных переменных
количество доступных локальных переменных для каждого оператора метода. Это не должно быть больше 3, так как это затрудняет выбор локальной переменной для использования в выражении.
Плотность использования локальной переменной
процент операторов, обращающихся к локальной переменной, по сравнению с операторами, где локальная переменная доступна. Низкие значения указывают на то, что метод не очень последовательный.
Когерентная модификация количества локальных переменных
количество модификаций локальных переменных в одном блоке Это указывает на то, что более одной локальной переменной принадлежат друг другу. Таким образом, они должны сформировать собственный объект, тем самым увеличивая согласованность.
Ты можешь попробовать CppDepend и это язык запросов кода CQLinq для обнаружения некоторых глобальных переменных, используемых только одним методом или, возможно, одним классом.
from f in Fields where f.IsGlobal && f.MethodsUsingMe.Count()==1 select f