Категории классов
Когда система разрастается до десятка классов, можно заметить группы классов, связанные внутри и слабо зацепляющиеся с другими. Такие группы классов образуют категории.
Категория классов – это агрегат, состоящий из классов и других категорий классов.
Категория классов не имеет операций или состояний в явном виде, они содержатся в ней неявно в описаниях агрегированных классов.
Некоторые классы в категории могут быть открытыми, то есть экспортироваться для использования за пределы категории. Остальные классы могут быть частью реализации, то есть не использоваться никакими классами, внешними к этой категории.
Между категориями и классами может существовать отношение использования. Категория может использовать невложенные категории и классы. С другой стороны, и классы могут использовать категории.
В C++ категории классов реализуются с помощью введения пространств имен – namespace. Однако пространство имен позволяет реализовать более широкое понятие. Оно может включать в себя классы, другие пространства имен, свободные подпрограммы и глобальные (внутри пространства имен) данные.
Заметим, что пространства имен связаны с идеей модульности, выполняя функцию логического группирования элементов (в отличие от модулей, осуществляющих в первую очередь физическое группирование элементов).
Пример. Объединим все классы, разработанные для использования в графической системе, в одну категорию. Предоставим пользователю описания в файле GraphSys.h:
namespace GraphSys{
class Point{... };
class Color{... };
class Shape {... };
class Circle: public Shape{... };
class SolidCircle: public Circle {... };
...
}
Реализация указанных классов находится в файле GraphSys.срр:
# include "GraphSys.h"
namespace GraphSys{
Circle:: draw(){...}
SolidCircle:: draw(){...}
...
}
Обращение к членам пространства имен осуществляется с использованием явной квалификации:
GraphSys:: Circle C;
GraphSys:: SolidCircle SC;
С другой стороны, описание using в пользовательском коде позволяет не использовать все время явную квалификацию:
# include "GraphSys.h"
using namespace GraphSys;
void user_func(){
Circle C;
...
C.draw();
}
Поскольку использование объектно-ориентированного подхода особенно важно при разработке сложных программных продуктов, модели предметной области, которые приходится строить в этих случаях, тоже будут сложны. Поэтому большое значение при объектно-ориентированном подходе имеют средства, позволяющие визуализировать, сохранять и документировать принимаемые решения. Одним из таких средств является унифицированный язык моделирования UML. Разработка системы средствами UML происходит в виде построения набора диаграмм, позволяющих описать определенные части моделируемой реальности в определенных аспектах. В данном разделе мы рассмотрим основные элементы ряда диаграмм UML.