- •Анализ программного обеспечения с использованием объектно-ориентированных метрик
- •Введение
- •Метрические особенности объектно-ориентированных программных систем
- •Локализация
- •Инкапсуляция
- •Информационная закрытость
- •Наследование
- •Абстракция
- •Объектно-ориентированные метрики для измерения характеристик систем
- •Количество строчек кода (loc)
- •Цикломатическая сложность Мак-Кейба (mvg)
- •Количество комментариев (com)
- •Число классов – получателей сообщений данного класса(Fan-out, Fan-in)
- •Количество "взвешенных" методов на класс (wmc)
- •Глубина дерева наследования (dit)
- •Количество потомков (noc)
- •Ширина иерархии наследования (bih)
- •Глубина класса в графе наследования (nl)
- •Связанность между классами объектов (cbo)
- •Количество реакций на класс (rfc)
- •Отсутствие сцепления в методах (lcom)
- •Количество строк текста на класс (kloc)
- •Число методов в классе (nm)
- •Число новых методов в классе (nnm)
- •Количество унаследованных методов (nmi)
- •Количество потенциально наследуемых методов (pmi)
- •Пропорция методов наследуемых подклассом (pmis)
- •Число общедоступных методов в классе(npm)
- •Степень методологической сцепленности (dmc)
- •Количество посылаемых методом сообщений (nms)
- •Сообщения и аргументы (maa)
- •Количество абстрактных классов (nac)
- •Степень абстрактности классов (dac)
- •Количество переопределеных методов в подклассе (nmo)
- •Пропорция переопределения методов в подклассе (pom)
- •Степень взаимосвязи между классами (dcbo)
- •Количество скрытых методов экземпляра (PrIm)
- •Мера Мак-Клура (mmk)
- •Литература
Количество абстрактных классов (nac)
Количество абстрактных классов (Number of Abstract Classes-NAC), число вершин в простейшей модели иерархии наследования, значение атрибута тип которых равно абстрактный. Абстрактные классы - это классы, для которых не предполагается создавать экземпляры. В языке С++ это классы, которые имеют чистые виртуальные методы. Методы абстрактных классов реализуются в потомках абстрактного класса. Абстрактные классы создаются для увеличения повторного использования их методов в классах-потомках. Метрика NAC позволяет оценить, каким образом степень повторного использования методов с помощью абстрактных классов. Метрика связана с повторным использованием программ, поскольку создание абстрактных классов способствует повторному использованию методов и уменьшением, тем самым, затрат на выявление общих понятий в прикладной области.
В литературе приводится статистика из практики – рекомендуется иметь 10-15% абстрактных классов среди общего числа классов.
Степень абстрактности классов (dac)
Степень абстрактности классов (Density of Abstract Classes-DAC). Эта метрика содержит отношение абстрактных классов к общему числу классов. Как дополнение к метрике NAC, эта метрика позволяет сравнивать абстрактность программ разного размера.
В литературе упоминается также метрика число аггрегатных связей ("the number of aggregation relationships"), которая отражает, по сути, один из вариантов определенной выше метрики, а именно, число классов, представители которых являются полями данного класса. В терминах полной модели взаимодействия компонентов метрика может быть выражена как число кругов-вершин, связанных с данной вершиной дугами с видимостью, равной “компонент класса”.
Количество переопределеных методов в подклассе (nmo)
Количество переопределенных методов в подклассе (Number of Methods Overwritten-NMO) - Число дуг со значениями переопределение метода и переопределение свойства атрибута тип, выходящих из вершины промежуточной модели наследования классов. Эта метрика определяет количество методов класса-предка, переопределенных в классе-потомке. Правильное проектирование системы предполагает расширение классов-предков, а не их переопределение. Большая величина этой метрики сигнализирует об ошибках проектирования.
На практике рассматривают такую метрику не только для классов, но и для компонентов классов – методов и свойств. В терминах модели метрика число переопределений для метода определяется как число дуг с типом “переопределение метода”, выходящих из точки-метода в промежуточной модели наследования классов.
Метрика связана с сопровождаемостью программ, поскольку чрезмерная глубина иерархии наследования классов в сочетании с переопределением методов в подклассах увеличивает сложность ОО программ.
Рекомендуемые значения - большие значения метрики оправданы лишь для так называемых frameworks (framework – collection of classes that provide a set of services for a particular domain; a framework thus exports a number of individual classes and mechanisms that clients can use or adapt [4]).
Пример:
Рассмотрим программу:
class View {
Rect area;
virtual Rect getArea()
{ return area; }
};
class SegmentedEdge : public View {
vector<Point> segments;
virtual Rect getArea() {
Rect r(segments[0]);
for (int i = 1; i < segments.size(); i++)
r |= Rect(segments[i]);
return r;
}
};
Метрика NMO(SegmentedEdge) = 1, поскольку класс SegmentedEdge переопределяет метод класса getArea() класса View.
Класс Viewявляется базовым классом для классов, которые представляют на экране некоторые фигуры. Для этого классаошибочнобыл реализован метод, который "выдает" прямоугольную область, к которую попадает фигура. Для этого в классеViewимеется переменнаяarea. Однако этот методgetAreaпереопределяется в классеSegmentedEdge, который представляет на экране ломаную линию. При этом переменнаяView::area и методView::getArea()становятся излишними. Правильным решением было бы сделатьView::getArea()чистой виртуальной, а базовый классViewабстрактным.
Метрика NMO(SegmentedEdge) в этом случае становится равной 0.