лекция. Сборник лекций по МДК _Технология разработки программного обеспе. Курс лекций для специальности спо базовой подготовки
Скачать 4.41 Mb.
|
Количество посылаемых методом сообщений (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(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(); }; Количество абстрактных классов (NAC)Количество абстрактных классов (Number of Abstract Classes-NAC), число вершин в простейшей модели иерархии наследования, значение атрибута тип которых равно абстрактный. Абстрактные классы - это классы, для которых не предполагается создавать экземпляры. В языке С++ это классы, которые имеют чистые виртуальные методы. Методы абстрактных классов реализуются в потомках абстрактного класса. Абстрактные классы создаются для увеличения повторного использования их методов в классах-потомках. Метрика NAC позволяет оценить, каким образом степень повторного использования методов с помощью абстрактных классов. Метрика связана с повторным использованием программ, поскольку создание абстрактных классов способствует повторному использованию методов и уменьшением, тем самым, затрат на выявление общих понятий в прикладной области. В литературе приводится статистика из практики – рекомендуется иметь 10-15% абстрактных классов среди общего числа классов. |