Как писать высококлассный код. Часть вторая. Возможности Visual Studio 2010

воскресенье, 30 января 2011, Александр Краковецкий

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

Ошибки и предупреждения

Все мы знаем, что если код содержит хотя бы одну синтаксическую ошибку, то проект не скомпилируется. При этом Visual Studio покажет нам список всех таких ошибок и даже точное их местоположение (класс и номер строки).

Если у вас не показываются номера строк, то включить эту функцию можно таким образом: Tools –> Options –> Text Editor –> All Languages и отметить чекбокс Line numbers:

alt text

Но как ни странно, это только вершина айсберга по обнаружению ошибок. Ведь синтаксические ошибки исправляются легко.

Для теста создадим простое консольное приложение и напишем простой код:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace CodeComplete
{
    class Program
    {
        static void Main(string[] args)
        {
            int j = 0;
            int k = 0;
            string s = "";

            for (int i = 0; i < 100; i++)
            {
                s += j.ToString();
            }
        }
    }
}

Этот код с легкостью скомпилируется и выполнится так как не содержит ошибок. Но этот код содержит одни изъян (их на самом деле здесь намного больше, но об этом потом) , а именно наличие переменной k, которая нигде не используется. Но это же не критично, скажите вы и будете правы. Но мы ведь пишем высококлассный код, не правда ли? С такой точки зрения наша программа уже не является идеальной. Справедливости ради нужно сказать, что наша Visual Studio всеми способами пытается донести, что с программой не совсем все в порядке. Если мы откроем вкладку Error List и перейдем на Warnings, то увидим там сообщение:

Warning 1 The variable 'k' is assigned but its value is never used D:\work\CodeComplete\CodeComplete\Program.cs 13 17 CodeComplete

Давайте немного усовершенствуем процесс проверки кода. В свойствах проекта во вкладке Build мы можем настроить проверку таким образом, чтобы все предупреждения трактовались как ошибки:

alt text

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

/warnaserror

После изменений свойства проекта мы увидим, что проект не скомпилируется. Ура! Мы сделали еще один маааленький шаг в область высококлассного кода.

Если вы посмотрите более детально на свойства, то увидите настройки уровней ошибок. Давайте рассмотрим их подробнее. При компиляции кода с помощью утилит можно задать правила с помощью ключа warn:

/warn:option

Option может принимать такие значения:

  • 0 – выключает все сообщения о предупреждениях
  • 1 – показывает только важные предупреждения
  • 2 – показывает предупреждения уровня 1 плюс некоторые менее важные, например, предупреждение о необходимости скрытия членов класса
  • 3 - показывает предупреждения уровня 2 плюс некоторые менее важные, например, предупреждение о конструкциях, которые всегда возвращают true или false
  • 4 (значение по умолчанию) – показывает все предупреждения плюс информационные сообщения. Как видите, вы можете сами управлять настройками вывода сообщений. Но уменьшение уровня скорее отдаляет нас от высококлассного кода, поэтому не стоит этим злоупотреблять. Детальнее читаем здесь.

Проверка грамматики

Еще одним важным (на мой взгляд) пунктом при написании кода является его грамотность с точки зрения английского языка. Все мы допускаем ошибки, очепятки и т.д. Понятно, что компилятору все равно, назовете ли вы класс MyClass или MyClas, но для последующей поддержке этот пункт очень важный.

В Visual Studio нет встроенной поддержки проверки правописания, поэтому нам понадобятся сторонние приложения.

В статье Code Spelling Checker Extension for Visual Studio 2010 (VSX) рассказывается о процессе написания расширения для Visual Studio 2010, которое поможет идентифицировать и исправить все грамматические ошибки в названиях переменных, XML комментариях и т.д.

В результате мы можем видеть все ошибки и оперативно их исправлять:

alt text

И даже выбирать варианты из словаря:

alt text

Думаю, можно поискать и другие расширения, которые решают задачу проверки грамматики.

Рефакторинг

Visual Studio содержит много возможностей по рефакторингу кода. Рассмотрим эти возможности более детально. Usings. Часто мы подключаем большое количество Usings, но, как правило, в финальном варианте часть Usings не нужна. Удалить ненужные Usings можно таким образом: правой кнопкой по свободному пространству – Organize Usings – Remove Unused Usings. Кроме того, вы (можете) должны их также отсортировать. А лучше все сразу – Remove and Sort. (Об обнаружении такого рода ошибок также вскоре поговорим).

alt text

Также есть решение для удаления ненужных Usings одним движением для всего проекта. Для этого можно воспользоваться расширением PowerCommands for Visual Studio 2010, где среди прочих полезных функций есть возможность автоматического форматирования кода и удаления Usings при сохранении файла (по умолчанию данная функция отключена.):

alt text

Детальнее о расширении можно почитать здесь.

Для Visual Studio 2008 есть решение в виде макроса (авторы - Kevin Pilch-Bisson и Chris Eargle).

Его можно создать с помощью Tools -> Macros.

Код макроса:

Public Module Module1
    Sub OrganizeSolution()
        Dim sol As Solution = DTE.Solution
        For i As Integer = 1 To sol.Projects.Count
            OrganizeProject(sol.Projects.Item(i))
        Next
    End Sub

    Private Sub OrganizeProject(ByVal proj As Project)
        For i As Integer = 1 To proj.ProjectItems.Count
            OrganizeProjectItem(proj.ProjectItems.Item(i))
        Next
    End Sub

    Private Sub OrganizeProjectItem(ByVal projectItem As ProjectItem)
        Dim fileIsOpen As Boolean = False
        If projectItem.Kind = Constants.vsProjectItemKindPhysicalFile Then
            'If this is a c# file 
            If projectItem.Name.LastIndexOf(".cs") = projectItem.Name.Length - 3 Then
                'Set flag to true if file is already open 
                fileIsOpen = projectItem.IsOpen
                Dim window As Window = projectItem.Open(Constants.vsViewKindCode)
                window.Activate()
                projectItem.Document.DTE.ExecuteCommand("Edit.RemoveAndSort")
                'Only close the file if it was not already open 
                If Not fileIsOpen Then
                    window.Close(vsSaveChanges.vsSaveChangesYes)
                End If
            End If
        End If
        'Be sure to apply RemoveAndSort on all of the ProjectItems. 
        If Not projectItem.ProjectItems Is Nothing Then
            For i As Integer = 1 To projectItem.ProjectItems.Count
                OrganizeProjectItem(projectItem.ProjectItems.Item(i))
            Next
        End If
        'Apply RemoveAndSort on a SubProject if it exists. 
        If Not projectItem.SubProject Is Nothing Then
            OrganizeProject(projectItem.SubProject)
        End If
    End Sub
End Module

Среда разработки Visual C# предоставляет в меню Рефакторинг следующие команды оптимизации:

  • Рефакторинг для извлечения метода
  • Переименовать рефакторинг
  • Рефакторинг для инкапсуляции поля
  • Рефакторинг для извлечения интерфейса
  • Рефакторинг для удаления параметров
  • Рефакторинг для упорядочения параметров

Более детально читаем на MSDN.

Форматирование кода

Форматирование кода – важная часть читабельности кода. Что использовать – пробелы или табы – я обсуждать не буду, лишь скажу, что отформатировать код можно с помощью команды Edit -> Advanced -> Format Document.

Там же вы можете найти и использовать другие команды:

alt text

Intelligence и комментирование

Написание комментариев также очень важная часть. Комментарии можно добавлять, нажав три раза символ «/», после чего будет сгенерирован шаблон комментария в XML формате. Эти комментарии используются Intelligence при вызове ваших методов. Но для того, чтобы это все работало не только у вас, необходимо включить опцию XML documentation file в свойствах проекта (вкладка Build).

Изменю код первоначального примера таким образом:

namespace CodeComplete
{
    class Program
    {
        /// <summary>
        /// Main function.
        /// </summary>
        /// <param name="args">Command-line arguments.</param>
        static void Main(string[] args)
        {
            int j = 0;
            string s = "";

            for (int i = 0; i < 100; i++)
            {
                s += j.ToString();
            }
        }
    }
}

После компиляции вы увидите созданный XML файл в папке Build такого вида:

<?xml version="1.0"?>
<doc>
    <assembly>
        <name>CodeComplete</name>
    </assembly>
    <members>
        <member name="M:CodeComplete.Program.Main(System.String[])">
            <summary>
            Main function.
            </summary>
            <param name="args">Command-line arguments.</param>
        </member>
    </members>
</doc>

При последующем вызове информация с комментариев будет показана интелисенсом.

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

Компании из статьи


Microsoft Украина


Сайт:
http://www.microsoft.com/ukr/ua/

Microsoft Украина Украинское подразделение компании Microsoft.

Ищите нас в интернетах!

Комментарии

Свежие вакансии