Нашли ошибку или опечатку? Выделите текст и нажмите

Поменять цветовую

гамму сайта?

Поменять
Обновления сайта
и новые разделы

Рекомендовать в Google +1

Генерация и рефакторинг кода с помощью диаграмм в Visual Studio

167

Одна из главных целей системы Visual Studio и технологии .NET Framework - уменьшить объем кода, который должны писать разработчики. Эта цель достигается двумя путями: либо уменьшается общий объем кода, который должен быть написан, либо уменьшается объем кода, который должен быть написан вручную. Первый подход основан на очень богатом наборе базовых классов, включенных в каркас .NET Framework. Второй подход, нацеленный на уменьшение кода, который должен быть написан вручную, поддерживается средствами генерации кода и рефакторинга, включенными в утилиту Class Designer.

Генерация кода методом перетащить и отпустить (drag-and-drop)

Почти каждое действие, выполненное над диаграммой классов, приводит к изменению исходного кода и, по существу, представляет собой определенный уровень генерации кода. Мы уже писали о многих таких изменениях в предыдущих статьях, например, о добавлении свойства или метода в окне Class Details.

Однако некоторые более сложные действия, связанные с генерацией кода, можно выполнить, манипулируя диаграммой классов. Как уже упоминалось ранее, с помощью соединителя Inheritance можно установить отношение наследования между базовым и производным классами. При этом файл кода производного класса обновляется, отражая внесенные изменения. Но если базовый класс является абстрактным, как, например, класс Product на рисунке ниже, то надстройка Class Designer может выполнить дополнительный анализ и генерацию кода. Если базовый класс является абстрактным и содержит абстрактные члены, то они автоматически реализуются в производных классах. Это показано на рисунке справа, где абстрактные свойства Description, Price и SKU были добавлены в класс Book. Метод GetInventory() не был реализован, потому что не был помечен как абстрактный.

Простая диаграмма классов с использованием абстрактных классов

Соединитель Inheritance можно использовать еще в одной операции, которая приводит к автоматической генерации кода. На рисунке ниже, слева, в диаграмму был добавлен интерфейс ICrudActions. Когда соединитель Inheritance перетаскивается из класса в интерфейс, все члены интерфейса реализуются в классе:

Реализация интерфейса с помощью диаграммы классов

Следующий пример содержит код, сгенерированный, когда интерфейс ICrudActions был добавлен в класс Book:

#region ICrudActions Members
public Guid UniqueId
{
    get
    {
        throw new NotImplementedException();
    }
    set
    {
        throw new NotImplementedException();
    }
}

public void Create()
{
    throw new NotImplementedException();
}

public void Update()
{
    throw new NotImplementedException();
}

public void Read()
{
    throw new NotImplementedException();
}

public void Delete()
{
    throw new NotImplementedException();
}
#endregion

Генерация кода с помощью технологии IntelliSense

Доступ к остальным функциям, связанным с генерацией кода с помощью надстройки Class Designer, обеспечивает подменю, имеющее довольно странное имя IntelliSense. Поскольку эти функции применяются только к классам, это меню становится видимым только тогда, когда разработчик выбирает какой-нибудь обычный или абстрактный класс на диаграмме.

В этом меню доступны две функции генерации кода: Implement Abstract Class и Override Members. Функция Implement Abstract Class гарантирует, что все абстрактные члены из базового класса будут реализованы в производном классе. Для того чтобы получить доступ к этому классу, необходимо щелкнуть правой кнопкой мыши на производном классе, выбрать команду IntelliSense, а затем команду Implement Abstract Class.

Подобное делает и функция Override Members, которая используется для того, чтобы выбирать подлежащие замещению открытые свойства или методы в базовом классе. Для доступа к этой функции необходимо щелкнуть правой кнопкой мыши на производном классе, выбрать команду IntelliSense, а затем команду Override Members. Диалоговое окно, показанное на рисунке ниже, содержит базовые классы, а также свойства и методы, которые еще не были замещены.

Выбор переопределяемых методов на диаграмме классов

Рефакторинг с помощью надстройки Class Designer

В статье "Рефакторинг кода" мы видели, как система Visual Studio поддерживает рефакторинг кода с помощью окна редактирования кода. Надстройка Class Designer тоже имеет много функций, связанных с рефакторингом при работе с сущностями на диаграмме классов.

Для того чтобы получить доступ к функции рефакторинга в надстройке Class Designer, необходимо щелкнуть правой кнопкой мыши на сущности или на любом из ее членов и выбрать команду из меню Refactor. В этом меню доступны следующие функции рефакторинга:

Rename Types and Type Members

Переименовывает тип или его член на диаграмме классов или в окне Properties. Переименование типа или его члена приводит к изменениям всех фрагментов кода, где ранее встречалось его старое имя. Можно даже убедиться, что эти изменения распространяются также на все комментарии и статические строки.

Encapsulate Field

Быстро создает новое свойство на основе существующего поля и аккуратно обновляет код, добавляя в него ссылки на новое свойство.

Reorder or Remove Parameters (только для языка C#)

Изменяет порядок следования параметров метода в типе или удаляет параметр из метода.

Extract Interface (только в языке C#)

Разработчик может извлекать члены типа в новый интерфейс. Эта функция позволяет выбирать только то подмножество членов, которое необходимо выделить в новый интерфейс.

Для того чтобы копировать и перемещать члены между типами, можно также использовать стандартные операции Cut, Сору и Paste, предусмотренные в системе Windows.

Пройди тесты