Метрики Кода И Их Практическая Реализация В Subversion И Clearcase. Часть 1 - Метрики |
Метрики кода и их практическая реализация в Subversion и ClearCase. Часть 1 - метрики Аудитория: менеджеры проектов, разработчики, тестировщики, руководители, аналитики Оглавление 1 Введение 2 Метрики. 2.1 Размерно-ориентированные метрики (показатели оценки объема) 2.1.1 LOC-оценка (Lines Of Code) 2.1.1.1 Метрика стилистики и понятности программ.. 2.1.2 Итого по SLOC.. 2.2 Метрики сложности. 2.2.1 Объектно-ориентированные метрики. 2.2.2 Метрики Холстеда. 2.2.3 Метрики цикломатической сложности по Мак-Кейбу. 9 2.2.4 Метрики Чепина. 2.3 Предварительная оценка на основе статистических методов в зависимости от этапов разработки программы.. 2.3.1 Предварительная оценка сложности программы на этапе разработки спецификации требований к программе. 2.3.2 Предварительная оценка сложности на этапе определения архитектуры 2.4 Общий списочный состав метрик 2.4 Подведение итогов. 6 Ресурсы интернет. 1. Введение В отличие от большинства отраслей материального производства, в вопросах проектов создания ПО недопустимы простые подходы, основанные на умножении трудоемкости на среднюю производительность труда. Это вызвано, прежде всего, тем, что экономические показатели проекта нелинейно зависят от объема работ, а при вычислении трудоемкости допускается большая погрешность. Поэтому для решения этой задачи используются комплексные и достаточно сложные методики, которые требуют высокой ответственности в применении и определенного времени на адаптацию (настройку коэффициентов). Современные комплексные системы оценки характеристик проектов создания ПО могут быть использованы для решения следующих задач:
2. Метрики Метрики сложности программ принято разделять на три основные группы:
Метрики первой группы базируются на определении количественных характеристик, связанных с размером программы, и отличаются относительной простотой. К наиболее известным метрикам данной группы относятся число операторов программы, количество строк исходного текста, набор метрик Холстеда. Метрики этой группы ориентированы на анализ исходного текста программ. Поэтому они могут использоваться для оценки сложности промежуточных продуктов разработки. Метрики второй группы базируются на анализе управляющего графа программы. Представителем данной группы является метрика Маккейба. Управляющий граф программы, который используют метрики данной группы, может быть построен на основе алгоритмов модулей. Поэтому метрики второй группы могут применяться для оценки сложности промежуточных продуктов разработки. Метрики третьей группы базируются на оценке использования, конфигурации и размещения данных в программе. В первую очередь это касается глобальных переменных. К данной группе относятся метрики Чепина. 2.1 Размерно - ориентированные метрики (показатели оценки объема) 2.1.1 LOC-оценка (Lines Of Code) Размерно-ориентированные метрики прямо измеряют программный продукт и процесс его разработки. Основываются такие метрики на LOC-оценках. Этот вид метрик косвенно измеряет программный продукт и процесс его разработки. Вместо подсчета LOC-оценок при этом рассматривается не размер, а функциональность или полезность продукта. Наибольшее распространение в практике создания программного обеспечения получили размерно-ориентированные метрики. В организациях, занятых разработкой программной продукции для каждого проекта принято регистрировать следующие показатели:
На основе этих данных обычно подсчитываются простые метрики для оценки производительности труда (KLOC/человеко-месяц) и качества изделия. Эти метрики не универсальны и спорны, особенно это относится к такому показателю как LOC, который существенно зависит от используемого языка программирования. Пример из жизни: Количество строк исходного кода (Lines of Code - LOC, Source Lines of Code - SLOC) является наиболее простым и распространенным способом оценки объема работ по проекту. Изначально данный показатель возник как способ оценки объема работы по проекту, в котором применялись языки программирования, обладающие достаточно простой структурой: «одна строка кода = одна команда языка». Также давно известно, что одну и ту же функциональность можно написать разным количеством строк, а если возьмем язык высокого уровня (С++, Java), то возможно и в одной строке написать функционал 5-6 строк - это не проблема. И это было бы полбеды: современные средства программирования сами генерируют тысячи строк кода на пустяковую операцию. Потому метод LOC является только оценочным методом (который надо принимать к сведению, но не опираться в оценках) и никак не обязательным. В зависимости от того, каким образом учитывается сходный код, выделяют два основных показателя SLOC: количество «физических» строк кода - SLOC (используемые аббревиатуры LOC, SLOC, KLOC, KSLOC, DSLOC) - определяется как общее число строк исходного кода, включая комментарии и пустые строки (при измерении показателя на количество пустых строк, как правило, вводится ограничение - при подсчете учитывается число пустых строк, которое не превышает 25% общего числа строк в измеряемом блоке кода). Количество «логических» строк кода - SLOC (используемые аббревиатуры LSI, DSI, KDSI, где «SI» - source instructions) - определяется как количество команд и зависит от используемого языка программирования. В том случае, если язык не допускает размещение нескольких команд на одной строке, то количество «логических» SLOC будет соответствовать числу «физических», за исключением числа пустых строк и строк комментариев. В том случае, если язык программирования поддерживает размещение нескольких команд на одной строке, то одна физическая строка должна быть учтена как несколько логических, если она содержит более одной команды языка.Для метрики SLOC существует большое число производных, призванных получить отдельные показатели проекта, основными среди которых являются:
2.1.1.1 Метрика стилистики и понятности программ Иногда важно не просто посчитать количество строк комментариев в коде и просто соотнести с логическими строчками кода, а узнать плотность комментариев. То есть код сначала был документирован хорошо, затем - плохо. Или такой вариант: шапка функции или класса документирована и комментирована, а код нет. Fi = SIGN (Nкомм. i / Ni - 0,1) Суть метрики проста: код разбивается на n-равные куски и для каждого из них определяется Fi 2.1.2 Итого по SLOC Потенциальные недостатки SLOC, на которые нацелена критика:
И главное помнить: Метрика SLOC не отражает трудоемкости по созданию программы .
Пример из жизни : Гневу руководителя не было предела - нашел бездельника! И плохо было бы программисту, если бы менеджер проекта не объяснил, что: была найдена ошибка в программе, нашел ее VIP - клиент, ошибка влияет на бизнес клиента и ее нужно было срочно устранить, для этого был выбран вот этот конкретный исполнитель, который развернул стенд, залил среду клиента, подтвердил проявление ошибки и начал ее искать и устранять. Естественно, в конце концов, он поменял фрагмент кода, в котором было неправильное условие и все заработало. Согласитесь, считать трудозатраты по данной метрике глупо - необходима комплексная оценка... 2.2 Метрики сложности Помимо показателей оценки объема работ по проекту очень важными для получения объективных оценок по проекту являются показатели оценки его сложности. Как правило, данные показатели не могут быть вычислены на самых ранних стадиях работы над проектом, поскольку требуют, как минимум, детального проектирования. Однако эти показатели очень важны для получения прогнозных оценок длительности и стоимости проекта, поскольку непосредственно определяют его трудоемкость. 2.2.1 Объектно-ориентированные метрики В современных условиях большинство программных проектов создается на основе ОО подхода, в связи с чем существует значительное количество метрик, позволяющих получить оценку сложности объектно-ориентированных проектов. МетрикаОписание Взвешенная насыщенность класса 1 (Weighted Methods Per Class (WMC) Отражает относительную меру сложности класса на основе цикломатической сложности каждого его метода. Класс с более сложными методами и большим количеством методов считается более сложным. При вычислении метрики родительские классы не учитываются. Взвешенная насыщенность класса 2 (Weighted Methods Per Class (WMC2)) Мера сложности класса, основанная на том, что класс с большим числом методов, является более сложным, и что метод с большим количеством параметров также является более сложным. При вычислении метрики родительские классы не учитываются. Глубина дерева наследования (Depth of inheritance tree) Длина самого длинного пути наследования, заканчивающегося на данном модуле. Чем глубже дерево наследования модуля, тем может оказаться сложнее предсказать его поведение. С другой стороны, Увеличение глубины даёт больший потенциал повторного использования данным модулем поведения, определённого для классов-предков. Количество детей (Number of children) Число модулей, непосредственно наследующих данный модуль.Большие значения этой метрики указывают на широкие возможности повторного использования; при этом слишком большое значение может свидетельствовать о плохо выбранной абстракции. Связность объектов (Coupling between objects)Количество модулей, связанных с данным модулем в роли клиента или поставщика. Чрезмерная связность говорит о слабости модульной инкапсуляции и может препятствовать повторному использованию кода. Отклик на класс (Response For Class) Количество методов, которые могут вызываться экземплярами класса; вычисляется как сумма количества локальных методов, так и количества удаленных методов 2.2.2 Метрики Холстеда Метрика Холстеда относится к метрикам, вычисляемым на основании анализа числа строк и синтаксических элементов исходного кода программы. Основу метрики Холстеда составляют четыре измеряемые характеристики программы:
На основании этих характеристик рассчитываются оценки:
2.2.3 Метрики цикломатической сложности по Мак-Кейбу Показатель цикломатической сложности является одним из наиболее распространенных показателей оценки сложности программных проектов. Данный показатель был разработан ученым Мак-Кейбом в 1976 г., относится к группе показателей оценки сложности потока управления программой и вычисляется на основе графа управляющей логики программы (control flow graph). Данный граф строится в виде ориентированного графа, в котором вычислительные операторы или выражения представляются в виде узлов, а передача управления между узлами - в виде дуг. Показатель цикломатической сложности позволяет не только произвести оценку трудоемкости реализации отдельных элементов программного проекта и скорректировать общие показатели оценки длительности и стоимости проекта, но и оценить связанные риски и принять необходимые управленческие решения. Упрощенная формула вычисления цикломатической сложности представляется следующим образом: C = e - n + 2, Где e - число ребер, а n - число узлов на графе управляющей логики. Как правило, при вычислении цикломатической сложности логические операторы не учитываются. В процессе автоматизированного вычисления показателя цикломатической сложности, как правило, применяется упрощенный подход, в соответствии с которым построение графа не осуществляется, а вычисление показателя производится на основании подсчета числа операторов управляющей логики (if, switch и т. д.) и возможного количества путей исполнения программы. Цикломатическое число Мак-Кейба показывает требуемое количество проходов для покрытия всех контуров сильносвязанного графа или количества тестовых прогонов программы, необходимых для исчерпывающего тестирования по принципу «работает каждая ветвь». Показатель цикломатической сложности может быть рассчитан для модуля, метода и других структурных единиц программы. Существует значительное количество модификаций показателя цикломатической сложности.
2.2.4 Метрики Чепина Существует несколько ее модификаций. Рассмотрим более простой, а с точки зрения практического использования - достаточно эффективный вариант этой метрики. Суть метода состоит в оценке информационной прочности отдельно взятого программного модуля с помощью анализа характера использования переменных из списка ввода-вывода. Все множество переменных, составляющих список ввода-вывода, разбивается на четыре функциональные группы. Множество «Р» - вводимые переменные для расчетов и для обеспечения вывода. Примером может служить используемая в программах лексического анализатора переменная, содержащая строку исходного текста программы, то есть сама переменная не модифицируется, а только содержит исходную информацию. Множество «М» - модифицируемые или создаваемые внутри программы переменные. Множество «C» - переменные, участвующие в управлении работой программного модуля (управляющие переменные). Множество «Т» - не используемые в программе ("паразитные") переменные. Поскольку каждая переменная может выполнять одновременно несколько функций, необходимо учитывать ее в каждой соответствующей функциональной группе.Далее вводится значение метрики Чепина: Q = a1P + a2M + a3C + a4T, Где a1, a2, a3, a4 - весовые коэффициенты. Весовые коэффициенты использованы для отражения различного влияния на сложность программы каждой функциональной группы. По мнению автора метрики наибольший вес, равный трем, имеет функциональная группа С, так как она влияет на поток управления программы. Весовые коэффициенты остальных групп распределяются следующим образом: a1=1; a2=2; a4=0.5. Весовой коэффициент группы T не равен нулю, поскольку "паразитные" переменные не увеличивают сложности потока данных программы, но иногда затрудняют ее понимание. С учетом весовых коэффициентов выражение примет вид: Q = P + 2M + 3C + 0.5T. 2.3 Предварительная оценка на основе статистических методов в зависимости от этапов разработки программы При использовании интегрированных инструментальных средств у компаний, разрабатывающих типовые решения (под эту категорию попадают так называемые «инхаузеры» - компании, занимающиеся обслуживанием основного бизнеса) появляется возможность строить прогнозы сложности программ, основываясь на собранной статистике. Статистический метод хорошо подходит для решения подобных типовых задач и практически не подходит для прогноза уникальных проектов. В случае уникальных проектов применяются иные подходы, обсуждение которых находится за рамками данного материала. Типовые задачи как из рога изобилия падают на отделы разработки из бизнеса, потому предварительная оценка сложности могла бы сильно упростить задачи планирования и управления, тем более что есть накопленная база по проектам, в которой сохранены не только окончательные результаты, но и все начальные и промежуточные. Выделим типовые этапы в разработке программ:
Теперь попробуем рассмотреть ряд метрик, часто используемых для предварительной оценки на первых двух этапах. 2.3.1 Предварительная оценка сложности программы на этапе разработки спецификации требований к программе Для оценки по результатам работы данного этапа может быть использована метрика прогнозируемого числа операторов Nпрогн программы: Nпрогн =NF*Nед Где: NF - количество функций или требований в спецификации требований к разрабатываемой программе; 2.3.2 Предварительная оценка сложности на этапе определения архитектуры Си = NI / (NF * NIед * Ксл) Где: 2.4 Общий списочный состав метрик Таблица 1 содержит краткое описание метрик, не вошедших в детальное описание выше, но тем не менее даные метрики нужны и важны, просто по статистике они встречаются гораздо реже. Также отметим, что цель этой статьи показать принцип, а не описать все возможные метрики во множестве комбинаций. Таблица 1 - Состав метрик их влияние и анализ эффективности использования
Наименование метрики Описание краткое Описание детальное Класс или тип метрики Метрика Майерса Интервальная мера Сложность программ определяется в виде отрезка Топологическая Метрика Джилба Логическая сложность программы определяется как насыщенность программы выражениями типа IF-THEN-ELSE. При этом вводятся две характеристики: CL - абсолютная сложность программы, характеризующаяся количеством операторов условия; cl - относительная сложность программы, характеризующаяся насыщенностью программы операторами условия, т. е. cl определяется как отношение CL к общему числу операторов:
Топологическая Метрика Хансена Пара (цикломатическое число, число операторов) (A, B), где A - метрика Маккейба, B - число исполняемых операторов. Топологическая Метрика Чена Топологическая метрика Чена M(G) = (n (G), N, Q0) Топологическая Метрика Вудворда Узловая мера (число узлов передач управления) На полях листинга рисуются линии передачи управления от одного оператора к другому (предполагается, что один оператор занимает ровно одну строчку). Число пересечений этих линий даёт значений метрики. Топологическая Метрики Харрисона, Мейджела Функциональное число (сумма приведенных сложностей всех вершин управляющего графа); Данная мера учитывает уровень вложенности и протяженность программы. Каждой вершине присваиваем свою сложность в соответствии с оператором, который она изображает. Эта начальная сложность вершины может вычисляться любым способом, включая использование мер Холстеда. Выделим для каждой предикатной вершины подграф, порожденный вершинами, которые являются концами исходящих из нее дуг, а также вершинами, достижимыми из каждой такой вершины (нижняя граница подграфа), и вершинами, лежащими на путях из предикатной вершины в какую-нибудь нижнюю границу. Этот подграф называется сферой влияния предикатной вершины. Приведенной сложностью предикатной вершины называется сумма начальных или приведенных сложностей вершин, входящих в ее сферу влияния, плюс первичная сложность самой предикатной вершины. Функциональная мера (SCOPE) программы -- это сумма приведенных сложностей всех вершин управляющего графа. Функциональным отношением (SCORT) называется отношение числа вершин в управляющем графе к его функциональной сложности, причем из числа вершин исключаются терминальные. SCORT принимает разные значения для графов с одинаковым цякломатиче-ским числом. Топологическая Метрика Пивоварского Модифицированная цикломатическая мера сложности Мера Пивоварского ставит целью учесть в оценке сложности ПС различия не только между последовательными и вложенными управляющими конструкциями, но и между структурированными и неструктурированными программами. Она выражается отношением N(G) = v*(G) + ? Pt, где v*(G) - модифицированная цикломатичес-кая сложность, вычисленная так же, как и V(G), но с одним отличием: оператор CASE с я-выходами рассматривается как один логический оператор, а не как п-1 оператор, Р1 - глубина вложенности i-й предикатной вершины. Для подсчета глубины вложенности предикатных вершин используется число "сфер влияния". Под глубиной вложенности понимается число всех "сфер влияния" предикатов, которые либо полностью содержатся в сфере рассматриваемой вершины, либо пересекаются с ней. Глубина вложенности увеличивается за счет вложенности не самих предикатов, а "сфер влияния". Сравнительный анализ цик-ломатических и функциональных мер с обсуждаемой для десятка различных управляющих графов программы показывает, что при нечувствительности прочих мер этого класса, мера Пивоварского возрастает при переходе от последовательных программ к вложенным и далее к неструктурированным. Топологическая Метрика Мак-Клура Мера сложности, основанная на числе возможных путей выполнения программы, числе управляющих конструкций и переменных; Выделяются три этапа вычисления данной метрики: Метрика, направленная на измерение архитектуры системы Метрика Кафура Вводятся понятия локального и глобального потока:
Глобальный поток информации из А в В через глобальную структуру данных D существует, если
Можно определить информационную сложность модуля как сумму информационных сложностей входящих в него процедур.
Метрика, основанная на учёте потока данных Метрика Зольновского, Симмонса, Тейера Взвешенная сумма различных индикаторов (структура, взаимодействие, объем, данные) Гибридная Метрика Янгера Сложность проектирования Логическая сложность с учетом истории вычислений Топологическая Метрика 'Подсчет точек пересечения' Поток управления программы считается более сложным, если возникают точки пересечения дуг передачи управления. В графе программы, где каждому оператору соответствует вершина, т. е. не исключены линейные участки, при передаче управления от вершины a к b номер оператора a равен min(a, b), а номер оператора b - max(a, b). Точка пересечения дуг появляется, если Метрика сложности потока управления программ Метрика граничных значений Считается число входов и выходов из узловых точек графа программы. Пусть G=(V, E) - ориентированный граф программы. Число входящих вершин у дуг называется отрицательной степенью вершины, а число исходящих из вершины дуг - положительной степенью вершины. Вершины у которых положительная степень <=1 назовем принимающими вершинами, а вершины у которых положительная степень >=2 вершинами отбора. Метрика сложности потока управления программ Метрика обращения к глобальным переменным Пара (модуль, глобальная переменная) (фактическая/возможная) Пара "модуль-глобальная переменная" обозначается как (p, r), где p - модуль, имеющий доступ к глобальной переменной r. В зависимости от наличия в программе реального обращения к переменной r формируются два типа пар "модуль-глобальная переменная" : фактические и возможные. Возможное обращение к r с помощью p показывает, что область существования r включает в себя p. Метрика сложности потока данных Метрика спена Определение спена основывается на локализации обращений к данным внутри каждой программной секции. Спен - это число утверждений, содержащих данный идентификатор, между его первым и последним появлением в тексте программы. Следовательно, идентификатор, появившийся n раз, имеет спен, равный n-1. При большом спене усложняется тестирование и отладка. Метрика сложности потока данных Набор метрик Чидамбера и Кемерера (WMC, DIT, NOC, CBO, RFC, LCOM) Вводится ряд метрик, в сумме дающие представление о сложности ОО-кода. WMC - Weighted methods per class (вычисляется сложность методов каким-либо способом и берётся сумма сложностей) Метрика для ООП программ Связность Степень зависимости каждого модуля от каждого из остальных модулей Content coupling (связность по содержимому) Топологическая Характеристический полином PCN Вычисляется сложность с учётом циклической ст
|