Visual studio извлечь метод

Обновлено: 07.07.2024

Компиляция практически всего коммерческого программного обеспечения на стадии отладки и на стадии подготовки окончательной версии продукта должна проводиться немного по-разному. Среда Visual Studio способна понимать это, поскольку сохраняет информацию обо всех параметрах, которые ей надлежит передавать компилятору. Для поддержки разных вариантов компоновки проекта Visual Studio потребуется сохранять подобную информацию в более чем одном экземпляре. Разные экземпляры такой информации называются конфигурациями. При создании проекта Visual Studio автоматически предлагает на выбор две таких конфигурации, которые называются, соответственно, Debug (Отладка) и Release (Выпуск):

Можно также определять собственные конфигурации. Это необходимо, например, для компоновки приложения с несколькими отличающимися версиями. Раньше из-за проблем, связанных с поддержкой кодировки Unicode в Windows NT, но не в Windows 95,для многих проектов на С++ было принято создавать две конфигурации — одну для Unicode,а вторую для MBCS (multibyte character set — набор многобайтных символов).

Рефакторинг и расширение кода проекта

Рефакторинг и расширение кода

Рефакторинг кода проекта

При создании приложений многие разработчики сначала заботятся об их функциональности, а когда она обеспечена, переделывают приложения таким образом, чтобы они были более управляемыми и удобочитаемыми. Это называется рефактарингом (refactoring). Под рефакторингом понимается процесс переделки кода для повышения удобочитаемости и производительности приложений, а также обеспечения безопасности типов и приведения кода к такому виду, в котором он лучше соответствует рекомендуемым приемам объектно-ориентированного программирования. К счастью, теперь в Visual Studio 2010 можно достаточно хорошо автоматизировать этот процесс.

За счёт использования меню Refactor (Рефакторинг), которое становится доступным при открытом файле кода, а также соответствующих клавиатурных комбинаций быстрого вызова, смарт-тегов (smart tags) и/или вызывающих контекстные меню щелчков, можно существенно видоизменять код с минимальным объемом усилий. В следующей таблице перечислены некоторые наиболее распространенные приемы рефакторинга, которые распознаются в Visual Studio 2010:

Чтобы увидеть процесс рефакторинга в действии, давайте модифицируем метод Main, добавив в него следующий код:

static void Main()

// Настраиваем консольный интерфейс (CUI)

Для этого выделите в окне редактора все содержащиеся внутри Main операторы, кроме последнего вызова Console.ReadLine(), и щёлкнем на выделенном коде правой кнопкой мыши. Выберем в контекстном меню пункт Refactor -> Extract Method (Рефакторинг -> Извлечь метод. ).

В открывшемся далее окне назначим новому методу имя MyConfigCUI:


Рис. 1. 1. Извлечение метода: создание нового метода из кода

После этого метод Main станет вызывать новый только что сгенерированный MyConfigCUI(), внутри которого будет содержаться выделенный ранее код:

static void Main()

private static void MyConfigCUI()

// Настраиваем консольный интерфейс (CUI)

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

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

Предлагаемые Visual Studio 2010 возможности рефакторинга представляют собой поистине замечательный способ для получения более чистого, удобочитаемого и лучше структурированного кода.

Расширение кода проекта

  • Шаблоны для вставки фрагментов кода (Code Snippet). Эти шаблоны позволяют вставлять общие блоки кода в месте расположения курсора мыши.
  • Шаблоны для окружения кода (Surround With). Эти шаблоны позволяют помещать блок избранных операторов в рамки соответствующего контекста.

Чтобы посмотреть на эту функциональность в действии, давайте предположим, что требуется обеспечить проход по поступающим в метод Main параметрам в цикле foreach.

Вместо того чтобы вводить необходимый код вручную, можно активизировать фрагмент кода foreach. После выполнения этого действия IDE-среда поместит шаблон кода foreach в месте, где в текущий момент находится курсор мыши.

Поместим курсор мыши после первой открывающей фигурной скобки в методе Main. Одним из способов активизации фрагмента кода является выполнение щелчка правой кнопкой мыши и выбора в контекстном меню пункта Insert Snippet (Вставить фрагмент. ) или Surround With (Разместить во фрагменте. ). Это приводит к отображению списка всех относящихся к данной категории фрагментов кода (для закрытия контекстного меню достаточно нажать клавишу Esc). В качестве клавиатурной комбинации быстрого вызова можно просто ввести имя интересующего фрагмента кода, которым в данном случае является foreach:


Рис. 2. 1. Вставка фрагмента кода

Отыскав фрагмент кода, который требуется активизировать, нажмём два раза клавишу Таb. Это приведет к автоматическому завершению всего фрагмента кода и оставлению ряда меток-заполнителей, в которых останется только ввести необходимые значения, чтобы фрагмент был готов. Нажимая клавишу Tab, можно переходить от одной метки-заполнителя к другой и заполнять пробелы (по завершении нажмите клавишу Escдля выхода из режима редактирования фрагмента кода).

В результате щелчка правой кнопкой мыши и выбора в контекстном меню пункта Surround With (Разместить во фрагменте) будет тоже появляться список возможных вариантов. При использовании средства Surround With обычно сначала выбирается блок операторов кода для представления того, что должно применяться для их окружения (например, блок try-catch).

Конструктор классов

Конструктор классов

Для работы с этой утилитой сначала необходимо вставить новый файл диаграммы классов. Делать это можно несколькими способами, одним из которых является щелчок на кнопке View Class Diagram (Перейти к диаграмме классов) в правой части окна Solution Explorer (Обозреватель классов), как показано на рисунке ниже (при этом важно, чтобы в окне был выбран проект, а не решение):


Рис. 1. 1. Создание диаграммы классов для проекта LC_Console

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


Рис. 1. 2. Диаграмма классов проекта LC_Console

Эта утилита работает вместе с двумя другими средствами Visual Studio 2010 — окном Class Details (Сведения о классах), которое можно открыть путём выбора в меню View (Вид) пункта Other Windows (Другие окна), и панелью Class Designer Toolbox (Конструктор классов), которую можно отобразить выбором в меню View (Вид) пункта Toolbox (Панель элементов).

В окне Class Details не только отображаются детали выбранного в текущий момент элемента в диаграмме, но также можно изменять его существующие члены и вставлять новые на лету:


Рис. 1. 3. Окно «Сведения о классах» проекта LC_Console


Рис. 1. 4.Окно Конструктор классов»

Для примера давайте перетащим из панели Class Designer Toolbox в окно Class Designer новый элемент Class (Класс), в отрывшемся окне назначим ему имя MyСаr, а затем с помощью окна Class Details добавим в него общедоступное поле типа string по имени AutoName:


Рис. 1. 5. Добавление нового класса и поля для проекта LC_Console

Теперь давайте активизируем утилиту Class Designer еще раз и перетащим на поверхность конструктора новый элемент типа Class, присвоив ему имя MySportCar. Затем выберем в Class Designer Toolbox пиктограмму Inheritance (Наследование) и щёлкнем в верхней части пиктограммы MySportCar. Далее, не отпуская левую кнопку мыши, перетащим курсор мыши на поверхность пиктограммы класса MyСаr и отпустим её. Правильное выполнение всех перечисленных выше действий приведёт к тому, что класс MySportCar станет наследоваться от класса MyСаr:


Рис. 1. 6. Итоговая диаграмма классов проекта LC_Console

Чтобы завершить данный пример, осталось обновить сгенерированный MySportCar, добавив в него общедоступный метод с именем GetAutoName:

Что? Вы можете преобразовать фрагмент кода в отдельный метод.

Когда? Если в каком-либо методе существует фрагмент кода, который должен вызываться в другом методе.

Зачем? Вы можете скопировать и вставить этот код, но это приведет к дублированию. Лучше выполнить рефакторинг этого фрагмента в отдельный метод, который можно свободно вызывать в любом другом методе.

Практическое руководство

Выделите код, который требуется извлечь:

Снимок экрана: код Visual Basic для подпрограммы Main. В этой подпрограмме выделена строка кода.

Затем выполните одно из следующих действий:

  • Клавиатура
    • Нажмите клавиши CTRL+R, а затем — CTRL+M. (Обратите внимание, что сочетание клавиш может отличаться в зависимости от выбранного профиля.)
    • Нажмите клавиши CTRL+ . чтобы активировать меню Быстрые действия и рефакторинг. Затем во всплывающем окне предварительного просмотра выберите пункт Извлечь метод.
    • Выберите Правка > Рефакторинг > Извлечь метод.
    • Щелкните код правой кнопкой мыши и выберите Рефакторинг > Извлечь > Извлечь метод.
    • Щелкните код правой кнопкой мыши и выберите меню Быстрые действия и рефакторинг. Затем во всплывающем окне предварительного просмотра выберите пункт Извлечь метод.

    Метод будет создан немедленно. Теперь вы можете переименовать метод. Для этого просто введите новое имя.

    Вы также можете обновить комментарии и другие строки, чтобы в них использовалось это новое имя. Также вы можете просмотреть изменения, прежде чем сохранить их. Для этого установите флажки в диалоговом окне Переименование, которое отображается в верхней правой части среды IDE.

    Снимок экрана: код Visual Basic для подпрограммы Main. Выделено имя метода и открыто всплывающее окно "Переименовать".

    Если вы довольны результатами, выберите Применить или нажмите клавишу ВВОД, чтобы зафиксировать изменения.

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

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

    01 public static Order GetCustomerOrder(int customerld, int orderld)

    03 DataAccess.DAL dal = new DataAccess.DAL();

    04 Order order = new Order();

    06 // Получить подробности заказа

    07 System.Data.DataTable dtOrder = dal.GetData("customerOrder", orderld);

    09 // Проверить заказ по клиенту

    10 if (customerld != (int)dtOrder.Rows[0][Mcustomer_idM])

    11 throw new ApplicationException("Invalid order for the given customer.");

    13 order.Id = (string)dtOrder.Rows[0]["id"];

    15 // Получить позиции заказа

    16 List<OrderItem> items = new List<OrderItem>();

    17 System.Data.DataTable dtltems = dal.GetData("orderlterns", orderld);

    18 foreach (System.Data.DataRow r in dtltems.Rows)

    19 Orderltem item = new Orderltem((int)r["product_id"], orderld);

    20 item.Name = (string)r["name"];

    21 item. Description = (string)r["description"];

    22 item.Quantity = (int)r["quantity"];

    23 item.UnitPrice * (double)r["unit_price"];

    2 4 items. Add (item) ;

    26 order.Items = items;

    28 // Получить подробности по клиенту

    29 System.Data.DataTable dtCustomer = dal.GetData("customer", customerld);

    30 Customer cust = new Customer(customerld);

    31 cust.Name = (string)dtCustomer.Rows[0]["name"];

    32 order.Customer = cust;

    34 return order; 1

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

    Сначала вы извлекаете код, который настраивает заказ. Для того чтобы правильно выделить код для извлечения, необходимо иметь некоторый опыт работы с этим инструментом. В данном случае извлеките строки 3—13. Это извлечет код, начиная с настройки DataAccess и до инициализации заказа. Однако это несколько сбивает с толку операцию Extract Method, поскольку вы в первых двух операциях настраиваете и объект DataAccess, и объект Order. Операция Extract Method понимает, что позже в вашем ме,тоде вам будут нужны оба этих объекта. Поэтому она создаст оба объекта как выходные параметры метода. Вам же нужен метод, который вернет экземпляр объекта Order и настроит свой собствен­ный объект DataAccess. Вы можете добиться этого следующим образом:

    1. Выделите строки 4—13 (от создания заказа и до инициализации).

    2. Выберите операцию рефакторинга Extract Method (при помощи меню, щелчка правой кнопкой мыши или клавиатурного аккорда).

    3. Visual Studio выдаст диалоговое окно Extract Method (рис. 9.11). Это диалоговое окно предоставит новое имя метода (по умолчанию — NewMethod) и сигнатуру метода. Если сигнатура метода выглядит некорректно, то вы можете отменить операцию и уточнить выделенный блок кода. В данном случае метод статический; он возвращает объект Order и принимает объекты customerld, orderld и DataAccess. Последний в сигна­туре нашей функции нам не нужен, но с этим мы скоро разберемся.

    4. Переименуйте метод во что-нибудь имеющее смысл. В данном случае переименуйте его вInitCustomerOrder.

    6. Будет создан новый метод, а старый метод заменится следующим вызовом:

    Order order = InitCustomerOrder(customerld, orderld, dal);

    Извлеченные методы создаются по умолчанию как закрытые (private).

    Описание: image204

    У нас по-прежнему есть одна проблема с извлеченным методом: он принимает экземпляр DataAccess вместо того, чтобы создать собственный экземпляр.

    К счастью, вы можете ис­пользовать еще одну операцию рефакторинга для того, чтобы решить эту проблему. В дан­ном случае надо использовать операцию Remove Parameters (см. далее в этой же главе). Важно отметить, что удаление параметра приводит к его удалению как из сигнатуры метода, так и из вызова метода. Однако оно не вставляет в новый метод вызов для создания объекта DataAccess (и не удаляет его из старого метода).*Вы должны сделать это вручную.

    Теперь давайте извлечем вызов для получения позиций заказа. Начнем с выделения строк 16—25 (см. листинг 9.1). Обратите внимание, что мы не хотим выделять вызов для настрой­ки свойств заказа (строка 26); мы просто хотим вернуть объект, который представляет все строки данного заказа. На рис. 9.12 показано выделение кода и извлечение метода. В дан­ном случае назовите новый метод Getorderitems. После извлечения метода он заменяется следующим вызовом нового метода:

    List<OrderItem> items = GetOrderItems(orderId, dal);

    Рис. 9.12. Извлечение кода в метод для возвращения позиций заказа

    Опять у нас проблема с передачей объекта DataAccess в новый метод. Эту проблему нужно решить так "же, как вы делали это раньше.

    Наконец, давайте рассмотрим извлечение той части метода, которая получает подробности по клиенту. Теперь эта процедура должна быть достаточно простой. Вы выделяете строки кода (строки 29—31) и выбираете операцию Extract Method. Вы называете новый метод GetCustomer и работаете с извлеченным параметром DataAccess.

    Новый (и гораздо более короткий) метод выглядит наподобие листинга 9.2. Кроме того, у вас теперь имеются три новых метода, которые вы сможете повторно использовать в буду­щем (и, возможно, сделать открытыми). Эти новые методы можно увидеть в листинге 9.3.

    Листинг 9,2. Статический метод после извлечений

    public static Order GetCustomerOrder(int customerld, int orderld)

    Order order = InitCustomerOrder(customerld, orderld);

    Извлечение методов

    List<OrderItem> items = GetOrderltems (orderld) ; order.Items = items;

    // Получить подробности по клиенту Customer cust = GetCustomer(customerld); order.Customer = cust;

    private static Customer NewMethod(int customerld)

    DataAccess.DAL dal = new DataAccess.DAL();

    System.Data.DataTable dtCustomer = dal.GetData("customer", customerld); Customer cust = new Customer(customerld); cust.Name = (string)dtCustomer.Rows[0]["name"]; return cust;

    DataAccess.DAL dal = new DataAccess.DAL();

    System.Data.DataTable dtltems = dal.GetData("orderltems", orderld); foreach (System.Data.DataRow r in dtltems.Rows)

    Orderltem item = new Orderltem ( (int) r ["product_id" ], orderld);

    item.Name = (string) r ["name"];

    private static Order InitCustomerOrder(int customerld, int orderld) < Order order = new Order();

    // Получить подробности заказа DataAccess.DAL dal = new DataAccess.DAL();

    System.Data.DataTable dtOrder = dal.GetData("customerOrder", orderld);

    11 Проверить заказ по клиенту

    if (customerld != (int)dtOrder.Rows[0]["customer_id"])

    throw new ApplicationException("Invalid order for the given customer.");

    order.Id = (string)dtOrder.Rows[0]["id"]; return order;

    Операция Extract Method не позволяет вам выбрать место для извлекаемого метода. Очень часто вы будете обнаруживать фрагменты кода, которые действительно нужно извлечь в метод другого класса. Для этого вам придется сначала извлечь метод, а за­тем перенести его вручную.

    Visual Studio является одним из самых мощных и распространённых инструментов разработки с 20-летней историй. Среда разработки представляет так много инструментов для работы с кодом, что в этих инструментах легко потеряться, упустив из виду какую-нибудь важную фишку. Не всегда понятно, какие инструменты из огромного набора реально полезны в повседневной жизни разработчика, а какие используются редко или добавлены в маркетинговых целях.

    Странно, что в русскоязычном интернете очень мало статей на эту тему. Когда я искал информацию, я натыкался либо на очень короткие статьи, описывающие небольшой набор узко специализированных фишек, либо, наоборот, на слишком длинные статьи (типа MSDN), в которых можно утонуть. Поэтому я решил сам написать небольшую статью на эту тему. Статья представляет собой перечисление важных возможностей Visual Studio, которыми я пользуюсь много лет. Как разработчик с 15-летним стажем, настоятельно рекомендую пользоваться этими фишками в своей работе.

    image

    Настройка Visual Studio

    Цвета и шрифты. Вы можете настраивать цвета и шрифты среды Visual Studio в окне средства→параметры→окружение→шрифты и цвета. Перед этим лучше выбрать цветовую схему в окне средства→параметры→окружение→цветовая схема, после чего можно «уточнять» цветовую схему дополнительными настройками шрифтов и цвета.

    Горячие кнопки. Вы можете настроить горячую кнопку (сочетание клавиш) на любую команду в Visual Studio. Для этого откройте окно средства→параметры→окружение→клавиатура, введите название команды и сочетание клавиш для вызова этой команды.

    Плагины. Настоятельно рекомендую установить плагин JetBrains Resharper, который внедряется в Visual Studio и предоставляет много полезных инструментов для работы с кодом.

    Навигация

    Зайти внутрь метода. Вы можете зайти внутрь вызываемого метода и посмотреть его код. Для этого нужно нажать на Ctrl и кликнуть мышкой по методу, либо установить каретку на методе и нажать F12. Команда работает не только для методов, но и вообще для всего (классов, переменных и. т. д.). Resharper интегрирует эту команду с дизассемблером, благодаря этому можно смотреть код метода, даже если в проекте нет его исходников.

    Выйти наружу метода. Вы можете найти все места в коде, где используется выбранный метод. Для этого кликните по методу мышкой и выберите в контекстном меню «Найти все ссылки». У решарпера есть аналогичная команда, но более продвинутся (rонтекстное меню→find usages). Помимо отображения всех мест где используется этот метод, решарпер может сразу же перейти в то место, откуда вызывается указанный метод, что очень удобно. Рекомендуется настроить горячую кнопку на эту команду.

    Поиск метода. Помимо стандартного поиска Ctrl+F, в студии есть и более удобный поиск с подсказками. Запустите команду правка→перейти→перейти к символу и начните набирать название метода. Студия будет сама подсказывать варианты, к какому методу перейти. Похожий инструмент есть и в решарпере (resharpernavigate→goto symbol). Рекомендуется настроить удобную горячую кнопку на эту команду.

    Работа с кодом

    Переименование. Вы можете переименовывать классы, методы и переменные с помощью команды студии контекстное меню→переименовать. Решарпер поддерживает и более продвинутое переименование (resharper→refactor→rename либо F2). В частности, решапрер при переименовании класса может заодно переименовать файл с этим классом плюс экземпляры этого класса.

    Выделение фрагмента кода в метод. Вы можете перенести выделенный фрагмент кода в отдельный метод, запустив команду правка→рефакторинг→извлечь метод.

    Создание несуществующих объектов. Студия может сама создавать недостающий с ее точки зрения код (с согласия разработчика, разумеется). Например, если вы вызовите в коде несуществующий метод, студия предложит его автоматически сгенерировать. Если вы добавите параметр в объявлении конструктора класса, студия предложит создать соответствующее поле класса с инициализацией этого поля в конструкторе.

    Вертикальное выделение. Зажмите Ctrl и выделите мышкой прямоугольную область в коде. Эту прямоугольную область можно скопировать, вставить и удалить. Помимо этого, если после выделения вы начнете набирать текст, он будет набираться одновременно во всех выделенных строках. Вертикальное выделение облегчает работу с повторяющимися похожими строками.

    Работа с проектами

    Выгрузка проекта. Если вы работаете в солюшене с большим числом проектов, лишние проекты можно «выгрузить» из студии, что бы они не мешались и не засоряли обзор. Для этого выберите в контекстом меню проекта команду «выгрузить проект». Студия будет работать так, как будто этих проектов нет в решении. Это безопасное операция (ничего не удаляется), вы всегда можете загрузить проект обратно через контекстное меню проекта (команда перезагрузить проект).

    Отладчик

    Отладчик помогает быстро исследовать код и находить причину багов, что существенно увеличивает производительность труда разработчика. Помимо очевидных методов его использования (брейкпоинт, после которого идем по шагам), у него есть и не совсем очевидные фишки:

    Окно Watch (окно контрольных значений) – в этом окне отладчика вы можете не только просматривать значения переменных, но и изменять их, а также запускать выражения и методы, просто вписав их в контрольные значения окна.

    Значения переменных – вы можете просматривать и изменять значения переменных во время отладки во всплывающем окне, которое появляется при наведении мышкой на переменную.

    Дополнительные инструменты

    Производительность. Студия поддерживает профилировщик для анализа узких мест производительности (анализ→профилировщик производительности), но этот инструмент используется редко из-за его сложности.

    Удалённая отладка. Visual Studio предоставляет техническую возможность проводить отладку удаленно, подключаясь к серверу с локальной машины. Но такая отладка долго и сложно настраивается (с привлечением администраторов сервера). Поэтому удаленную отладку применяют, только если на это есть серьезные причины.

    Операции рефакторинга кода, доступные в Visual Studio

    Встроенная поддержка рефакторинга, предлагаемая системой Visual Studio 2013 для разработчиков проектов на языке VB, ограничена символическими методами Rename и Generate Method Stub.

    Операции рефакторинга

    Операция Extract Method

    Создание метода с помощью рефакторинга

    Например, в следующем сниппете, для того чтобы вынести условное логическое выражение в отдельный метод, необходимо выделить код и выбрать команду Extract Method из контекстного меню, появляющегося после щелчке правой кнопкой мыши:

    На этом месте автоматически генерируется следующий код:

    Операция Encapsulate Field

    При рефакторинге часто требуется инкапсулировать в существующий класс некое свойство. Для этого предназначена операция Encapsulate Field. Чтобы выполнить это действие, следует выбрать переменную, которую требуется инкапсулировать, и выбрать соответствующую команду в контекстном меню. Это дает разработчику возможность указать свойство и выбрать место, в котором следует искать ссылку на него:

    Пример использовании операции рефакторинга Encapsulate Field

    На следующем шаге после указания нового свойства следует определить, какие ссылки на переменную класса следует заменить ссылкой на новое свойство. Откроется окно предварительного просмотра по завершении поиска ссылок. В верхней панели окна размещено дерево, в котором указываются поля и методы, имеющие ссылки на данную переменную. Флажок, расположенный после каждой строки, указывает, следует ли выполнять замену. Выбрав строку в верхней части окна, необходимо установить на нее фокус в нижней панели. Как только будет обеспечена корректность каждой ссылки, инкапсуляция считается завершенной. Переменная класса устанавливается закрытой, а соответствующие ссылки обновляются.

    Операция Extract Interface

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

    Извлечение интерфейса с помощью команды рефакторинга Extract Interface

    В следующем примере требуется извлечь в отдельный интерфейс первый метод:

    После выбора команды Extract Interface из контекстного меню, появляющегося после щелчка правой кнопкой мыши, и выбора метода ShouldBeInInterface, подлежащего извлечению, в диалоговом окне Extract Interface (как показано на рисунке выше), в новом файле возникает новый интерфейс, а исходный файл обновляется следующим образом:

    Операция Reorder Parameters

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

    Диалоговое окно Reorder Parameters dialog, показанное на рисунке ниже, позволяет переставлять параметры в списке в соответствии с требуемым порядком:

    Перестановка параметров метода с помощью команды рефакторинга Reorder Parameters

    Как только требуемый порядок будет достигнут, пользователь может предварительно просмотреть результат. По умолчанию параметры в каждом вызове данного метода переставляются автоматически в соответствии с новым порядком. Диалоговое окно Preview, аналогичное показанному на рисунке, позволяет контролировать обновление вызовов метода.

    Операция Remove Parameters

    Удаление параметра из метода с помощью соответствующей операции рефакторинга значительно сокращает объем поиска ошибок компиляции, которые могут при этом возникнуть. Кроме того, эта операция очень полезна при многочисленных перегрузках метода, при которых удаление параметра не может порождать ошибки компиляции. В этом случае ошибка во время выполнения программы может возникнуть только по семантической, а не по синтаксической причине.

    На рисунке ниже показано диалоговое окно Remove Parameters, которое используется для удаления параметров из списка параметров. Если параметр был удален непреднамеренно, его легко восстановить. Как указывает предупреждение, размещенное в этом диалоговом окне, удаление параметров часто приводит к неожиданным функциональным ошибкам, поэтому важно контролировать внесенные изменения. Для того чтобы оценить внесенные изменения, можно снова использовать окно предварительного просмотра.

    Использование команды рефакторинга Remove Parameters

    Операция Rename

    Переименование переменных с помощью операции рефакторинга Rename

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

    Операция Generate Method Stub

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

    Разумеется, этот код порождает ошибку при сборке, поскольку вызываемый метод еще не определен. Используя операцию рефакторинга Generate Method Stub (доступную с помощью интеллектуального указателя в самом коде), можно сгенерировать заглушку метода. Как видно из следующего примера, заглушка метода содержит входные параметры и тип возвращаемого значения:

    Меню Organize Usings

    Использование команд меню Organize Usings

    Разработчики проектов на языке VB не имеют возможности упорядочивать и удалять неиспользуемые инструкции Imports. Однако на закладке References в диалоговом окне Project Properties можно пометить пространства имен, которые должны быть импортированы в каждый исходный файл. Это позволит значительно сократить количество инструкций Imports. На этой странице можно также удалить ссылки на неиспользуемые сборки.

    Очень полезно упорядочивать директивы using в алфавитном порядке, чтобы легко управлять пространствами имен, на которые они ссылаются. Для того чтобы не делать это вручную, нужно щелкнуть правой кнопкой мыши в окне редактора кода и выбрать команду Organize Usings --> Sort Usings.

    Для того чтобы одновременно упорядочить директивы using и удалить неиспользуемые, достаточно щелкнуть правой кнопкой мыши в окне редактора кода и выбрать команду Organize Usings --> Remove and Sort.

    Файлы шаблонного кода, предусмотренные в системе Visual Studio по умолчанию, содержат директивы using в начале файла за пределами блока пространства имен. Однако, согласно принципам стиля StyleCop, директивы using должны содержаться в блоке пространства имен. Операция Organize Usings распознает текущее расположение инструкций using в файле и оставляет их на месте.

    Читайте также: