1. Степень методологической сцепленности (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

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

    1. Сообщения и аргументы (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(); };