1. Количество абстрактных классов (nac)

Количество абстрактных классов (Number of Abstract Classes-NAC), число вершин в простейшей модели иерархии наследования, значение атрибута тип которых равно абстрактный. Абстрактные классы - это классы, для которых не предполагается создавать экземпляры. В языке С++ это классы, которые имеют чистые виртуальные методы. Методы абстрактных классов реализуются в потомках абстрактного класса. Абстрактные классы создаются для увеличения повторного использования их методов в классах-потомках. Метрика NAC позволяет оценить, каким образом степень повторного использования методов с помощью абстрактных классов. Метрика связана с повторным использованием программ, поскольку создание абстрактных классов способствует повторному использованию методов и уменьшением, тем самым, затрат на выявление общих понятий в прикладной области.

В литературе приводится статистика из практики – рекомендуется иметь 10-15% абстрактных классов среди общего числа классов.

    1. Степень абстрактности классов (dac)

Степень абстрактности классов (Density of Abstract Classes-DAC). Эта метрика содержит отношение абстрактных классов к общему числу классов. Как дополнение к метрике NAC, эта метрика позволяет сравнивать абстрактность программ разного размера.

В литературе упоминается также метрика число аггрегатных связей ("the number of aggregation relationships"), которая отражает, по сути, один из вариантов определенной выше метрики, а именно, число классов, представители которых являются полями данного класса. В терминах полной модели взаимодействия компонентов метрика может быть выражена как число кругов-вершин, связанных с данной вершиной дугами с видимостью, равной “компонент класса”.

    1. Количество переопределеных методов в подклассе (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.