- •Анализ программного обеспечения с использованием объектно-ориентированных метрик
- •Введение
- •Метрические особенности объектно-ориентированных программных систем
- •Локализация
- •Инкапсуляция
- •Информационная закрытость
- •Наследование
- •Абстракция
- •Объектно-ориентированные метрики для измерения характеристик систем
- •Количество строчек кода (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)
- •Литература
Степень методологической сцепленности (dmc)
Степень методологического сцепления (Density of Methodological Cohensiveness - DMC). Эта метрика вычисляется как отношение количества пар методов, которые используют общие атрибуты класса, к общему числу пар методов. В отличие от метрикиLCOM, эта метрика вычисляется более просто.
Пример:
Рассмотрим программу:
classEdge :publicView {
Point *start, *end;
Node *node1, *node2;
Node getNode1() { return node1; }
Node getNode2() { return node2; }
void setArea(Point p1, Point p2){
start = p1;
end = p2;
};
void draw(Graphics *g){
Point c1 = node1->getCenter();
Point c2 = node2->getCenter();
g->drawLine(p1, p2);
setArea(p1, p2);
}
};
Подсчитаем сцепление пар методов:
N(getNode1,getNode2) = 0
N(getNode1,setArea) = 0
N(getNode1, draw) = 1, общий атрибут node1.
N(getNode2, draw) = 1, общий атрибут node2.
N(getNode2,setArea) = 0.
N(setArea,draw) = 2, общие атрибутыnode1и node2.
Использующих общие атрибуты 3. Всего пар 6. В результате DMC = 0.5
Количество посылаемых методом сообщений (nms)
Количество сообщений, посылаемых данным методом (Number of Message-Sends-NMS) позволяет оценить степень коммуникационной сложности метода.
Пример:
Рассмотрим программу:
classEdge :publicView {
Node *node1, *node2;
void setArea(Point p1, Point p2);
void draw(Graphics *g){
Point c1 = node1->getCenter();
Point c2 = node2->getCenter();
g->drawLine(p1, p2);
setArea(p1, p2);
}
};
В этом случае:
NMS(Edge) = 2, поскольку он вызывает методgetCenter()классаNode, методdrawLine(p1, p2)классаGraphics.
Сообщения и аргументы (maa)
Сообщения и аргументы (Messages And Arguments - MAA) позволяет степень коммуникационной сложности метода учитывая количество предаваемых в сообщение параметров. При подсчете количества посылаемых методом сообщений к количеству сообщений добавляется и количество передаваемых в сообщении параметров.
Поскольку количество передаваемых в сообщениях параметров увеличивает коммуникационную сложность метода, в некоторых случаях эта метрика более точна, чем метрика NMS. Вместе с тем, в других случаях требуется именно количество посылаемых методом сообщений, поскольку сообщения и их параметры не равнозначны.
Пример:
Рассмотрим программу:
classEdge :publicView {
Node *node1, *node2;
void setArea(Point p1, Point p2);
void draw(Graphics *g){
Point c1 = node1->getCenter();
Point c2 = node2->getCenter();
g->drawLine(p1, p2);
setArea(p1, p2);
}
};
В этом случае:
MAA(Edge) = 4, поскольку он вызывает методgetCenter()классаNodeбез параметров и методdrawLine(p1, p2)классаGraphicsс двумя параметрами.
Данная метрика может быть использована для оценки необходимости повторного проектирования классов. Необходимо оценить, насколько оправдана коммуникационная сложность метода. Возможно, что необходимо переместить метод с высоким значением метрики в класс, из которого этот метод чаще всего вызывается. В этом случае, возможно, у него будет меньше параметров.
Пример:
Рассмотрим программу:
class Triangle { Point p1, p2, p3;
Graphics *g;
void draw() { g->drawTriangle(p1, p2, p3); } };
class Graphics {
Color color; Color getColor();
void drawTriangle(Point p1, Point p2, Point p3) { } };
В классе Triangleметодdrawвызывает методdrawTriangleклассаGraphicsс тремя параметрами. Это увеличивает его коммуникационную сложность. Если перенести методdrawTriangleв классTriangle, то можно будет уменьшить число параметров в этом методе.
Ниже показана программа после повторного проектирования классов. Метод drawTriangle(Point p1, Point p2, Point p3)заменен на метод draw(Color color):
class Triangle {
Point p1, p2, p3; Graphics *g; void draw() { draw(g->getColor()); } void draw(Color color) { } };
class Graphics { Color color; Color getColor(); };