Программирование и работа с кодом
Когда классы содержат один и тот же набор параметров, может быть очень полезным определить общий контракт для всех классов. Разумеется, это делается при помощи интерфейса. Основные преимущества использования интерфейсов состоят в том, что ваш код становится более читабельным, его легче обслуживать, и работает он одинаково для похожих членов. Однако разработчики часто не понимают общности своих классов до тех пор, пока их код не написан. Это иногда делает создание интерфейсов весьма болезненной операцией.
Редактор C# в Visual Studio 2008 предоставляет операцию рефакторинга Extract Interface (извлечение интерфейса) для облегчения этого процесса. Она позволяет вам взять существующий класс или структуру и автоматически сгенерировать…
Для доступа к операции рефакторинга Extract Interface вы должны сначала поместить ваш курсор в класс, структуру или другой интерфейс, который содержит те члены, которые вы хотите извлечь. Затем вы можете использовать меню Refactor и выбрать позицию меню Extract Interface. Вы можете также вызвать Extract Interface из контекстного меню (при помощи щелчка правой кнопкой мыши) или из визуального конструктора классов.
Совет
Для вызова операции извлечения интерфейса с клавиатуры сначала поместите курсор в класс, структуру или интерфейс, который содержит те члены, которые вы хотите извлечь. Затем сыграйте аккорд <Ctrl>+<R>, <Ctrl>+<l>.
Для того чтобы лучше понять операцию извлечения интерфейса, давайте рассмотрим пример. Предположим, что вы анализируете свой код и замечаете, что некоторые ваши объекты имеют аналогичные свойства и методы. Предположим, что объекты Customer, Vendor, Manufacturer, SalesAgent и Product содержат свойства Id, Name и Description, a также методы Load, Save и Delete. В этом случае вам следует рассмотреть возможность извлечения этой общности в стандартный интерфейс, который будет реализовываться каждым из ваших объектов. Посмотрим, как в этом отношении нам может помочь операция рефакторинга Extract Interface.
Сначала вы помещаете курсор на целевой класс, члены которого вы хотите извлечь. Для нашего примера выберите класс Customer.…
Иногда вам необходимо изменить сигнатуры ваших методов (удалить элемент, добавить локальную переменную в качестве параметра или изменить порядок существующих параметров).
Эти изменения требуют также и корректировки всех вызовов данного метода. Выполнение такой корректировки вручную может привести к внесению в код новых ошибок. Предположим, что вы хотите поменять местами два параметра одного типа (например, типа int). Если вы забудете изменить вызов метода, то возможно это и будет работать, но работать оно будет неправильно. Найти такие ошибки бывает непросто. Поэтому Visual Studio предоставляет операции рефакторинга для удаления и переупорядочивания параметров, а также для превращения локальной переменной в параметр.
Операция рефакторинга Remove Parameters (Удаление параметров) позволяет вам выбрать один или более параметров данного метода, конструктора или делегата и удалить их из метода. Она делает также обновление всех вызовов данного метода и удаляет значение, передаваемое параметру.
Операция Remove Parameters вызывается при помощи размещения курсора внутри сигнатуры метода и последующего выбора в меню Refactor пункта Remove Parameters. Вы можете также добраться до этой операции через контекстное меню (щелчок правой кнопкой мыши). Кроме того, эта операция доступна также в визуальном конструкторе классов и в окне Class Details.
Совет
Для вызова с клавиатуры операции удаления параметров сначала поместите курсор в метод, содержащий параметры,…
Часто встречается объявление локальной переменной внутри метода и передача этой локальной переменной в качестве вызова другого метода. Если вы используете операцию рефакторинга для удаления параметра вызываемого вами метода, то локальная переменная в вашем вызывающем методе все равно останется. Будьте внимательны — нужно ли вам это? Если нет, то вам придется удалить локальную переменную вручную.
Очень часто разработчику приходится брать переменную из метода и делать ее параметром метода. Например, вы можете найти внутри метода значение и присвоить это значение локальной переменной. Вместо того чтобы делать поиск внутри метода, вы могли бы передать это значение в метод (вы могли бы использовать операцию рефакторинга "извлечение метода" для того, чтобы выделить присваивание значения в новый метод).
Такая трансформация локальной переменной в параметр может быть выполнена автоматически при помощи операции рефакторинга Promote Local Variable to Parameter. Она позволяет выбрать локальный член данного метода и ввести его в состав параметров данного метода. Инструмент рефакторинга обновляет также и все вызовы метода.…
Константы ведут себя как самый лучший тип локальных переменных для превращения в параметры. Причина в том, что нет проблемы с обновлением вызывающих клиентов. Если у вас есть локальная переменная с присвоенным ей постоянным значением, то вы можете обновить вызовы этим фиксированным значением.
Однако когда вы превращаете переменную, которая содержит вызов объекта в присваивании, то получите предупреждение, показанное на рис. 9.20. Превращение переменной, присваивание которой является результатом вызова другого метода, требует того, чтобы вызовы (которые необходимо обновить в результате продвижения) также имели возможность вызвать объект, который делает присваивание.
Предположим, что у вас есть объявление переменной и присваивание:
int Customerld = GetCustomerFromOrder(orderld);…
Обычно вы перемещаете параметры метода для повышения читабельности и облегчения сопровождения кода. Возможно, вы захотите разместить более важные параметры первыми в сигнатуре метода, либо вы пожелаете поддерживать порядок параметров аналогичным для всех схожих методов или перегрузок. Операция рефакторинга Reorder Parameters позволяет вам изменить порядок параметров метода, конструктора или делегата. Она также обновляет все вызовы метода и переставляет передаваемые в вызове параметры.
Вы вызываете операцию перестановки параметров при помощи установки курсора внутри сигнатуры метода (содержащего параметры, которые вы хотите переставить), а затем в меню Refactor выбираете пункт Reorder Parameters. Вы можете также получить доступ к этой операции через контекстное меню (щелчок…
Довольно часто приходится из закрытого поля вашего объекта создавать свойство. Эти поля могли быть созданы как закрытые потому, что они использовались только внутренним для объекта образом. Либо разработчик мог просто определить открытое поле (вместо того, чтобы инкапсулировать его как свойство). В любом случае, если вам нужно изготовить фактическое свойство из поля, то вы можете сделать это при помощи операции рефакторинга Encapsulate Field (Инкапсуляция поля).