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