Как писать высококлассный код. Часть вторая. Возможности Visual Studio 2010
В первой части мы поговорили о том, почему код не всегда должен быть идеальным, а также определили высококлассный код как такой, который не содержит ошибок, является простым и читабельным. Во второй части поговорим о встроенных возможностях Visual Studio 2010, которые могут усложнить жизнь разработчикам, но привнести большой вклад в написание высококлассного кода.
Ошибки и предупреждения
Все мы знаем, что если код содержит хотя бы одну синтаксическую ошибку, то проект не скомпилируется. При этом Visual Studio покажет нам список всех таких ошибок и даже точное их местоположение (класс и номер строки).
Если у вас не показываются номера строк, то включить эту функцию можно таким образом: Tools –> Options –> Text Editor –> All Languages и отметить чекбокс Line numbers:
Но как ни странно, это только вершина айсберга по обнаружению ошибок. Ведь синтаксические ошибки исправляются легко.
Для теста создадим простое консольное приложение и напишем простой код:
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 мы можем настроить проверку таким образом, чтобы все предупреждения трактовались как ошибки:
При компиляции кода с помощью утилит необходимо добавлять специальный ключ /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 комментариях и т.д.
В результате мы можем видеть все ошибки и оперативно их исправлять:
И даже выбирать варианты из словаря:
Думаю, можно поискать и другие расширения, которые решают задачу проверки грамматики.
Рефакторинг
Visual Studio содержит много возможностей по рефакторингу кода. Рассмотрим эти возможности более детально. Usings. Часто мы подключаем большое количество Usings, но, как правило, в финальном варианте часть Usings не нужна. Удалить ненужные Usings можно таким образом: правой кнопкой по свободному пространству – Organize Usings – Remove Unused Usings. Кроме того, вы (можете) должны их также отсортировать. А лучше все сразу – Remove and Sort. (Об обнаружении такого рода ошибок также вскоре поговорим).
Также есть решение для удаления ненужных Usings одним движением для всего проекта. Для этого можно воспользоваться расширением PowerCommands for Visual Studio 2010, где среди прочих полезных функций есть возможность автоматического форматирования кода и удаления Usings при сохранении файла (по умолчанию данная функция отключена.):
Детальнее о расширении можно почитать здесь.
Для 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.
Там же вы можете найти и использовать другие команды:
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 Украина | Украинское подразделение компании Microsoft. |