Лабораторная работа № 3
Качественный анализ программного модуля на основе метрик кода
Цель работы: оценить сопровождаемость кода на основе метрики предлагаемой компанией Micorsoft. Получить базовые представления о таких метриках как, количество строк кода, цикломатическая сложность, глубина наследования и связность классов.
Методические указания по выполнению работы
Индекс сопровождаемости кода определяется по формуле:
MI = MAX(0, (171 — 5.2 * ln(HV) — 0.23 * CC — 16.2 * ln(LoC)) * 100 / 171),
Где,
– Объем программы (Halstead Volume),
CC –Цикломатическая сложность;
LoC – Количество строк кода.
Метрики Холстеда
Метрика Холстеда относится к метрикам, вычисляемым на основании анализа числа строк и синтаксических элементов исходного кода программы.
Основу метрики Холстеда составляют четыре измеряемые характеристики программы:
n1 (Number of Unique Operators) — число уникальных операторов программы, включая символы-разделители, имена процедур и знаки операций (словарь операторов);
n2 (Number of Unique Operands) — число уникальных операндов программы (словарь операндов);
N1 (Number of Operators) — общее число операторов в программе;
N2 (Number of Operands) — общее число операндов в программе.
На основании этих характеристик рассчитываются оценки:
Словарь программы (Halstead Program Vocabulary, HPVoc): n = n1 + n2;
Длина программы (Halstead Program Length, HPLen): N = N1 + N2;
Объем программы (Halstead Program Volume, HPVol): V = N log2 n;
Объем программы по Холстеду определяет объем кода, запрограммированного алгоритма. Размер метрики должен быть от 20 до 1000 для одной функции и от 100 до 8000 для одного файла. Если размер метрики превышает верхнюю границу, то рекомендуется более детально изучить функциональную нагрузку на исследуемый элемент и разбить его на несколько составляющих либо провести оптимизацию алгоритма.
Операнды
При расчете метрики Холстеда используются следующие операнды
Идентификаторы – все идентификаторы которые не являются зарезервированными словами
Идентификаторы типов - зарезервированные слова обозначающие тип данных : bool, char, double, float, int, long, short, signed, unsigned, void.
Константы числовые, символьные, строковые константы.
Операторы
Ключевые слова следующих категорий, которые интерпретируются как операторы:
Идентификаторы класса памяти: inline, register, static, typedef, virtual, mutable.
Квалификаторы типа: const, friend, volatile.
Зарезервированные слова: asm, break, case, class, continue, default, delete, do, else, enum, for, goto, if, new, operator, private, protected, public, return, sizeof, struct, switch, this, union, while, namespace, using, try, catch, throw, const_cast, static_cast, dynamic_cast, reinterpret_cast, typeid, template, explicit, true, false, typename
Операторы языка программирования:! != % %= &&& || &= ( ) * *= + ++ += , - -- -= -> . ... / /= : :: <<<<<= <= = == >>= >>>>= ? [ ] ^ ^= { } | |= ~
Следующие управляющие структуры for (...) if (...) switch (...) while for (...) and catch (...) интерпретируются как один оператор.
Цикломатическая сложность
Эта метрика определяет структурную сложность кода . Для того чтобы найти эту метрику необходимо определить количество «веток» алгоритма. Фактически подсчет сводится к определению числа операторов if, for, while и case в операторе switch. Приложение с большой цикломатической сложностью требует больше тестов для покрытия.
Количество строк кода
Определяет число строк кода. Количество строк кода показывает непосредственное число строк кода, то есть не включает в себя пустые строки и комментарии. Большое количество строк показывает, что на исходный файл имеет сильную смысловую нагрузку и требует разбиения.
Глубина дерева наследования
Показывает максимальную длину цепочки наследуемых классов. Чем больше эта величина тем сложнее сопровождать потомков в связи с возможными проблемами связанными с переопределениями наследуемых методов.
Связностьклассов
Определяет число ссылок между двумя разными классами. Чем выше это значение, тем сложнее эволюция данного программного обеспечения за счет их взаимозависимостей.
Порядок работы
1. Для разработанного программного обеспечения вычислить предложенные метрики
2. Сделать вывод на базе метрики сопровождаемости.
Пример
Вычислить метрику программного модуля для вычисления корня квадратного уравнения (SqrRoot.h and SqrRoot.cpp)
1.Вычисление метрики Холстеда
Опреаторы |
Число операторов |
Операнды |
Число операндов |
:: |
7 |
a |
2 |
= |
8 |
b |
2 |
== |
1 |
c |
2 |
. |
6 |
mAparam |
5 |
!= |
1 |
mBparam |
5 |
< |
1 |
mCparam |
3 |
- |
3 |
result.x1 |
3 |
/ |
3 |
result.x2 |
3 |
* |
2 |
result.status |
2 |
- binary |
3 |
det |
3 |
return |
1 |
4 |
3 |
{ |
12 |
2 |
2 |
} |
12 |
||
( |
13 |
||
) |
13 |
n1 = 15
n2 = 12
N1 = 86
N2 = 35
N= N1+N2 = 86+35=121
n=n1+n2= 15+12 =27
V=N*log2(n)=121*log2(27) = 575
Цикломатическая сложность
Определяем как сумму цикломатических сложностей всех непустых методов класса
CC = 8
Число линий кода
LoC = 15
Индекс сопровождаемости
MI = MAX(0, (171 — 5.2 * ln(575) — 0.23 * 8 — 16.2 * ln(15)) * 100 / 171)= 54
Глубина дерева наследования =1 (нет наследования)
Связность классов =1 (есть ссылки между двумя классами)
Вывод
Модуль имеет приемлемый индекс сопровождаемости в «зеленой» зоне (20-100)
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.