Количество унаследованных методов (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; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!