Превращение локальной переменной в параметр

Оценить
(0 голоса)

Очень часто разработчику приходится брать переменную из метода и делать ее параметром метода. Например, вы можете найти внутри метода значение и присвоить это значение ло­кальной переменной. Вместо того чтобы делать поиск внутри метода, вы могли бы передать это значение в метод (вы могли бы использовать операцию рефакторинга "извлечение мето­да" для того, чтобы выделить присваивание значения в новый метод).

Такая трансформация локальной переменной в параметр может быть выполнена автомати­чески при помощи операции рефакторинга Promote Local Variable to Parameter. Она по­зволяет выбрать локальный член данного метода и ввести его в состав параметров данного метода. Инструмент рефакторинга обновляет также и все вызовы метода.

Вы вызываете операцию рефакторинга при помощи установки вашего курсора на ту строку кода, которая объявляет переменную. Затем вы выбираете в меню Refactor пункт меню Promote Local Variable to Parameter. Вы можете также получить доступ к этой операции через контекстное меню (щелчок правой кнопкой мыши).

Совет

Для вызова с клавиатуры операции рефакторинга Promote Local Variable to Parame­ter сначала установите ваш курсор на ту строку кода, которая содержит объявление переменной. Затем сыграйте клавиатурный аккорд <Ctrl>+<R>, <Ctrl>+<P>.

Примечание

Вы можете превращать в параметры локальные переменные только там, где они ини­циализируются. Иначе операция выдаст ошибку, поскольку она не знает, как обновить вызовы метода. Фактически если объявление и инициализация находятся в разных строках кода, то вы не можете использовать данную операцию рефакторинга. Этот метод рефакторинга лучше всего работает тогда, когда объявление и инициализация (присваивание) делаются в одной строке.

Давайте проработаем пример. Предположим, что у вас есть метод, который принимает идентификатор заказа и возвращает объект Order, как в следующей сигнатуре метода:

public static Order GetCustomerOrder(int orderld)

При просмотре этого метода вы замечаете, что там имеется присваивание переменной, ко­торое получает идентификатор клиента следующим образом:

int customerld = GetCustomerld(orderld);

Предположим, вы установили, что поиск идентификатора клиента по идентификатору заказа очень неэффективен по двум причинам. Во-первых, вы должны знать идентификатор клиен­та еще до вызова метода. Во-вторых, вы хотите искать заказ внутри этого метода. Когда вы ищете идентификатор клиента в заказе, то ищете заказ два раза. Поэтому вы идентифици­руете это присваивание переменной как хороший вариант для продвижения в сигнатуру ме­тода. Для этого вы должны сначала щелкнуть правой кнопкой мыши по той строке кода, в которой выполняется присваивание, а затем выбрать в контекстном меню Refactor пункт Promote Local Variable to Parameter.

В данном случае предварительного просмотра изменений нет. Вместо этого Visual Studio делает рефакторинг. Присваивание из метода удаляется. Сигнатура метода изменяется сле­дующим образом:

public static Order GetCustomerOrder(int orderld, int customerld)

Кроме того, вызовы этого метода также обновляются. В данном случае вызов GetCustomerOrder будет теперь содержать код, который ранее выполнял присваивание переменной — GetCustomerld (orderld). Вот пример:

Order newOrder = Customer.GetCustomerOrder(odrld, GetCustomerld(orderld));

Здесь есть один недостаток — код данного примера определил переменную идентификатора заказа с именем odrld (см. предыдущую строку кода). Рефакторинг использовал код при­сваивания переменной, в котором идентификатор заказа был orderld. Это приведет к ошибке компиляции, которую вам придется исправлять вручную, поскольку у вас теперь есть переменная orderld, которую вы не объявляли. Конечно, этого не случится с констан­тами или в тех случаях, когда для обозначения одних и тех же вещей вы используете в раз­ных методах согласованные имена.

Некоторые советы по превращению
Перестановка параметров
Инкапсуляции поля
Доступ к операции Encapsulate Field
Диалоговое окно Encapsulate Field

Добавить комментарий


Защитный код
Обновить

© 2017 www.visualstudios.ru. Все права защищены.