Количество унаследованных методов (NMI)



Количество методов, унаследованных от предков (Numer of Methods Inherited - NMI) позволяет класса от его предков. В отличие от метрики DIT, эта метрика оценивает не количество уровней в иерархии наследования, а именно зависимость от предков. Возможно базовые классы не оказывают сильного влияния на потомков, если имеют небольшое количество методов.

Метрика связана с повторным использованием программ, чем ниже доля унаследованных методов в подклассе, тем больше вероятность того, что подкласс создан "неразумно".

Рекомендованные значения: число унаследо-ванных методов должно превосходить число новых методов в классе, и тем больше превосходить, чем глубже класс расположен в модели наследования

Пример:

Рассмотрим программу:

сlass View { TRect getArea(); string getName();}; с lass Node : public View { Point* clipLine(Point p1, Point p2);}; с lass ClassNode : public Node { Point clipLine(Point p1, Point p2);

};

В этом случае:

· NMI(View) = 0

· NMI(Node) = 2,

· NMI(ClassNode) = 3.

Количество потенциально наследуемых методов (PMI)

Количество методов, унаследованных классом от предков (Potencial Methods Inherited - PMI) + количество методов в самом классе. С помощью этой метрики вычисляется степень функциональности, которую данный класс предоставляет своим потомкам.

Пример:

Рассмотрим программу:

сlass View { TRect getArea(); string getName();};с lass Node : public View { Point* clipLine(Point p1, Point p2);};с lass ClassNode : public Node { Point clipLine(Point p1, Point p2);};

PMI(View) = 2, PMI(Node) = 3, PMI(ClassNode) = 4.

 

Пропорция методов наследуемых подклассом (PMIS)

Пропорция методов, унаследованных классом от предков (Proportion of Methods Inherited by a Subclass-PMIS). Эта метрика вычисляется по формуле:

PMIS = NMI /PMI

С помощью этой метрики вычисляется мера специализации класса по отношению к его предкам.

Пример:

Рассмотрим программу:

сlass View { TRect getArea(); string getName();}; с lass Node : public View { Point* clipLine(Point p1, Point p2);}; с lass ClassNode : public Node { Point clipLine(Point p1, Point p2);

};

 

В этом случае:

· NMI(View) = 0

· NMI(Node) = 2

· NMI(ClassNode) = 3

· PMI(View) = 2

· PMI(Node) = 3

· PMI(ClassNode) = 4

· PMIS(View) = 0

· PMIS(Node) = 0.666

· PMIS(ClassNode) = 0.75.

Число общедоступных методов в классе (NPM)

Число общедоступных методов в классе (The number of public methods in a class - NPM) - число точек-методов с типом доступа “общедоступный” (public) в списке операций круга-вершины полной модели наследования.

При вычислении данной метрики, рассматривают как определенные в классе, так и унаследованные методы. В некоторых случаях рассматривают пару метрик: число общедоступных методов, возвращающих значение некоторого типа, и число общедоступных методов, не возвращающих никакого значения.

Метрика связана с сопровождаемостью ОО программ. Чем больше значение метрики, тем выше затраты на сопровождение (maintenance effort in OO systems).

Степень методологической сцепленности (DMC)

Степень методологического сцепления (Density of Methodological Cohensiveness - DMC). Эта метрика вычисляется как отношение количества пар методов, которые используют общие атрибуты класса, к общему числу пар методов. В отличие от метрики LCOM, эта метрика вычисляется более просто.

Пример:

Рассмотрим программу:

class Edge : public View { 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) позволяет оценить степень коммуникационной сложности метода.

Пример:

Рассмотрим программу:

class Edge : public View { 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. Вместе с тем, в других случаях требуется именно количество посылаемых методом сообщений, поскольку сообщения и их параметры не равнозначны.

Пример:

Рассмотрим программу:

class Edge : public View { 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 (p 1, p 2) класса 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();
};


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

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






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