Генерация и рефакторинг кода с помощью диаграмм в Visual Studio
167Программы --- Visual Studio --- Генерация и рефакторинг кода с помощью диаграмм
Одна из главных целей системы 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.