Диаграммы классов в Visual Studio
169Программы --- Visual Studio --- Диаграммы классов
Традиционно моделирование программного обеспечения осуществляется отдельно от кодирования. Как правило, это происходит на этапе проектирования, который заканчивается до начала кодирования. В большей части случаев диаграммы моделирования, построенные на этапе проектирования, быстро устаревают в ходе разработки программного обеспечения и теряют свое значение при неизбежном изменении проекта.
Утилита Class Designer системы Visual Studio позволяет внедрить моделирование в интегрированную среду разработки в виде действий, которые можно выполнить в любое время на всем протяжении разработки проекта. Диаграммы классов динамически конструируются по исходному коду, т.е. они никогда не устаревают. Любые изменения, внесенные в исходном коде, немедленно отражаются на диаграмме классов, а любое изменение диаграммы классов отражается в коде.
Создание диаграммы классов
Процесс проектирования приложения обычно подразумевает как минимум наличие схемы классов, которые будут созданы, и описание их взаимодействия. Среда Visual Studio 2013 имеет область проектирования Class Designer, в которой можно формировать диаграмму классов. Затем в классы можно добавлять поля, свойства и методы, а также устанавливать взаимоотношения между ними.
Несмотря на то что этот объект называется диаграммой классов, он поддерживает классы, структуры, перечисления, интерфейсы, абстрактные классы и делегаты. Существует несколько способов, с помощью которых разработчик может добавлять диаграмму классов в свой проект. Например, он может открыть диалоговое окно Add New Item, чтобы создать новую пустую диаграмму классов в проекте:
Новую диаграмму классов можно добавить в проект, щелкнув на кнопке View Class Diagram инструментальной панели в окне Solution Explorer или щелкнув правой кнопкой мыши на проекте или классе, а затем выбрав команду View Class Diagram в контекстном меню. Если при этом проект был выделен, то система Visual Studio автоматически добавит все типы, определенные в проекте, в начальную диаграмму классов. Хотя в некоторых случаях это может оказаться удобным, для проекта, содержащего большое количество классов, процесс создания и уточнения такой диаграммы может оказаться слишком долгим.
В отличие от некоторых программных средств, требующих, чтобы все типы, существующие в проекте, принадлежали одной и той же диаграмме классов, в системе Visual Studio диаграмма классов может содержать сколько угодно пользовательских классов. Это позволяет добавлять в одно решение несколько диаграмм классов.
Область действия утилиты Class Designer ограничена одним проектом. Например, нельзя добавлять в диаграмму классов типы, определенные в разных проектах, даже если они являются частями одного и того же решения.
Надстройку Class Designer можно разделить на четыре компонента: область проектирования (design surface), инструментальная панель Toolbox, окно Class Details, сетка свойств. Изменения диаграммы классов сохраняются в файле с расширением *.cd, который в сочетании с исходными файлами используется для генерации схемы, демонстрируемой в области проектирования Class Designer.
Область проектирования диаграммы классов
Область проектирования надстройки Class Designer позволяет разработчику взаимодействовать с типами, используя перетаскивание компонентов. Разработчик может добавлять в область проектирования существующие типы, перетаскивая их из любого представления классов или окна Solution Explorer. Если файл, связанный с окном Solution Explorer, содержит несколько типов, то все они добавляются в область проектирования.
На рисунке ниже показана простая диаграмма классов, содержащая два класса: Customer и Order, а также перечисление OrderStatus. Каждый класс содержит поля, свойства, методы и события. Между классами существует ассоциация, поскольку класс Customer содержит свойство Orders, представляющее собой список объектов типа Order, а класс Order реализует интерфейс IDataErrorInfo. Вся эта информация содержится на диаграмме классов.
Каждый класс на диаграмме классов изображается как отдельная сущность, которую можно перетаскивать по области проектирования и при необходимости изменять размеры. Класс состоит из полей, свойств, методов и событий. На рисунке выше эти компоненты сгруппированы в разделы. Разработчик может изменять шаблон для диаграмм классов, например, перечислять компоненты в алфавитном порядке или группировать их по уровню доступа.
Надстройка Class Designer часто используется для просмотра многочисленных классов, чтобы было понятно, как они связаны друг с другом. В таком случае удобно скрывать компоненты классов, чтобы упростить диаграмму. Для того чтобы скрыть все компоненты одновременно, можно использовать переключатель, расположенный в правом верхнем углу представления класса в области проектирования. Если необходимо скрыть не все, а лишь некоторые компоненты, то их можно скрывать по отдельности или по разделам, щелкая правой кнопкой мыши на соответствующем элементе и выбирая в контекстном меню команду Hide.
Инструментальная панель Toolbox
Для того чтобы облегчить добавление элементов на диаграмму классов, в инструментальной панели Toolbox есть корешок закладки Class Designer. Чтобы создать элемент, следует перетащить его из инструментальной панели Toolbox в область проектирования и дважды щелкнуть на нем. На рисунке ниже показана инструментальная панель Toolbox с видимой закладкой Class Designer. Элементы на панели Toolbox можно разделить на сущности (entities) или соединители (connectors). Обратите внимание на то, что элемент Comment можно добавить на закладку Class Designer, но он не появляется ни в одной части кода, а просто добавляется в документацию о диаграмме классов.
Сущности (entities)
Сущности, которые можно добавить на диаграмму классов, полностью соответствуют типам в технологии .NET Framework. Добавляя новую сущность в область проектирования, необходимо присвоить ей имя. Кроме того, требуется указать, в какой файл ее следует включить: в новый или существующий.
Для того чтобы удалить сущности из диаграммы, надо щелкнуть на них правой кнопкой мыши и выбрать в контекстном меню команду Remove From Diagram. В этом случае они не удаляются из исходного кода, а исчезают из диаграммы классов. Если разработчик все же хочет удалить связанный с сущностью исходный код, следует выбрать команду Delete Code.
Для того чтобы увидеть код, связанный с сущностью, следует дважды щелкнуть на сущности или выбрать команду View Code в контекстном меню, которое открывается после щелчка правой кнопкой мыши. Сущности, включенные в инструментальную панель Toolbox, описаны ниже.
- Class (класс)
Поля, свойства, методы, события и константы можно добавлять в класс с помощью контекстного меню, открывающегося после щелчка правой кнопкой мыши или с помощью окна Class Details. Несмотря на то что класс может поддерживать вложенные типы, они не могут добавляться в область проектирования. Классы могут также реализовывать интерфейсы. Например, на рисунке выше класс Order реализует интерфейс IDataErrorInfo.
- Enum (перечисление)
Может содержать только список членов с присвоенными им значениями. Каждый метод имеет резюме и комментарии, но они появляются только в виде XML-комментария, расположенного напротив метода.
- Interface (интерфейс)
Интерфейсы определяют свойства, методы и события, которые должен реализовать класс. Интерфейсы могут также содержать вложенные типы, но напомним, что добавление вложенных типов не поддерживается утилитой Class Designer.
- Abstract Class (абстрактный класс)
Абстрактные классы не отличаются от обычных классов, за исключением того, что их имена в области проектирования набираются курсивом и снабжаются меткой Abstract (в языке C#) или Must Inherit (в языке VB).
- Struct (структура)
Это единственная сущность, кроме перечислений, которая появляется в области проектирования в прямоугольнике. Аналогично классу, структура имеет поля, свойства, методы, события и константы. Кроме того, она тоже может содержать вложенные типы. Тем не менее в отличие от класса структура не имеет деструктора.
- Delegate (делегат)
Несмотря на то что делегат появляется на диаграмме классов как сущность, он не может содержать вложенные типы. Он может содержать только параметры, определяющие его сигнатуру.
Соединители (connectors)
Между сущностями могут быть установлены отношения двух типов. Они иллюстрируются на диаграмме классов с помощью соединителей, описанных ниже:
- Inheritance (Наследование)
Соединитель Inheritance используется для того, чтобы показать отношение между классами, наследующими свойства друг друга.
- Association (Ассоциация)
Если класс содержит ссылку на другой класс, то между ними существует ассоциация. Она демонстрируется с помощью соединителя Association. Если отношение основано на коллекции, - например, на списке объектов типа Order, - его можно представить с помощью ассоциации коллекции (collection association). Ассоциация коллекции Orders показана на рисунке выше в виде соединителя, связывающего классы Customer и Order.
Ассоциацию классов (class association) можно представить либо в виде поля или свойства класса, либо в виде ассоциативной связи между классами. Для этого можно использовать контекстное меню, открывающееся после щелчка правой кнопкой мыши на поле, свойстве или линии связи между классами.
Для того чтобы показать свойство как ассоциацию коллекции, необходимо щелкнуть правой кнопкой мыши на классе и выбрать команду Show as Collection Association. В результате свойство будет скрыто в классе и показано в виде соединителя с ассоциированным классом на диаграмме.