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


Дата добавления: 2021-03-18; просмотров: 74; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!