Как писать высококлассный код. Часть четвертая. Code Analysis и FxCop

вторник, 1 февраля 2011, Александр Краковецкий

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

Сегодня был один интересный твит приблизительно такого содержания:

посоветовал тут почитать эту серию статей своим знакомым... отказхались =\

По этому поводу могу только сказать, что, к сожалению, таких «знакомых» много, что явно не способствует повышению культуры качества кода. Но это оффтопик, продолжим на чем мы остановились.

Предыдущие части серии:

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

  • Code Analysis, который входит в состав Visual Studio высших редакций (Premium и Ultimate)
  • Microsoft FxCop (бесплатный инструмент)
  • Microsoft StyleCop (бесплатный инструмент)

Все эти инструменты содержат набор правил, по которым происходит проверка. Эти правила со временем дополняются и расширяются.

Многие считают, что Code Analysis и есть FxCop из-за похожего поведения и набора правил. На самом деле это правда только отчасти, так как эти продукты позиционируются отдельно, несмотря на то, что движок у них общий. Действительно, актуальные версии FxCop попадают в релиз Visual Studio, но все-таки некоторые отличия у них есть.

FxCop версии 10.0 входит в состав Visual Studio 2010, а также Microsoft Windows SDK for Windows 7 and .NET Framework 4 версии 7.1. А в этом документе в качестве примера можно ознакомиться с различиями между Code Analysis и FxCop для Visual Studio 2005 и 2008.

Посмотрим также на описания этих инструментов.

Visual Studio Code Analysis:

[The] code analysis for managed code tool analyzes managed assemblies and reports information about the assemblies, such as violations of the programming and design rules set forth in the Microsoft .NET Framework Design Guidelines.

FxCop:

FxCop is an application that analyzes managed code assemblies (code that targets the .NET Framework common language runtime) and reports information about the assemblies, such as possible design, localization, performance, and security improvements. Many of the issues concern violations of the programming and design rules set forth in the Design Guidelines for Class Library Developers, which are the Microsoft guidelines for writing robust and easily maintainable code by using the .NET Framework.

По сути, разница в них в том, что FxCop содержит наиболее актуальный набор правил для валидации. Поэтому дальше я особо не буду акцентировать внимание на их различиях, просто помните, что Code Analysis входит в состав Visual Studio, а FxCop – отдельный продукт.

Все правила входят в специальные наборы:

  • Все правила. В этом наборе правил содержатся все правила. При использовании этого набора возможно получение большого числа предупреждений. С его помощью можно получить наиболее полную картину всех проблем в коде. Данный подход может помочь в принятии решения относительно выбора боле узкого набора правил, наилучшим образом соответствующего проектам.
  • Базовые правила определения правильности. В этих правилах основное внимание уделяется логическим и наиболее распространенным ошибкам, происходящим при использовании API платформы. Данный набор правил следует использовать для получения более широкого списка предупреждений, чем список, полученный при использовании минимального набора правил.
  • Базовые правила и рекомендации по разработке. В этих правилах основное внимание уделяется рекомендациям по обеспечению простоты понимания и использования кода. Данный набора правил следует добавлять, если в проекте содержится код библиотек, или в случае необходимости принудительного применения рекомендаций для простоты обслуживания кода.
  • Расширенные правила определения правильности. Эти правила дополняют базовые правила проверки правильности с целью повысить число выдаваемых ошибок логики и использования платформы. Особое внимание в них уделяется конкретным сценариям, таким, как COM-взаимодействие и мобильные приложения. Этот набор правил рекомендуется включать, если к проекту применим один из этих сценариев, или для поиска дополнительных ошибок в проекте. Расширенные правила и рекомендации по разработке. Эти правила дополняют базовые правила и рекомендации по разработке с целью повысить число выдаваемых ошибок удобства использовании и удобства поддержки. В этих правилах основное внимание уделяется правилам именования. Данный набора правил рекомендуется добавлять, если в проекте содержится код библиотек, или в случае необходимости принудительного применения наивысших стандартов написания простого в обслуживании кода.
  • Правила глобализации. В этих правилах основное внимание уделяется проблемам, препятствующим правильному отображению приложения на различных языках с использованием различных языковых стандартов и региональных параметров. Этот набор правил следует добавлять, если для приложения выполняется локализация, глобализация или и то, и другое.
  • Минимальные правила и рекомендации. В этих правилах основное внимание уделяется наиболее критическим проблемам кода, включая возможные бреши в системе безопасности, сбои приложения и другие важные ошибки логики и разработки. Данный набор правил должен входить в любой настраиваемый набор правил проекта.
  • Правила безопасности. В этом наборе правил содержатся все правила безопасности корпорации Майкрософт. Его следует добавлять для получения максимального числа уведомлений о проблемах безопасности.

Вы можете сами устанавливать уровень информирования об ошибках, исключать некоторые правила или целые наборы.

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

Разбираем пример

Возьмем пример из предыдущей статьи:

using System;
using System.Threading;
using System.Globalization;
using System.Collections.Generic;
using System.Collections;

namespace BeautifulCode
{
    class Program
    {
        static void Main(string[] args)
        {
            Thread thread = Thread.CurrentThread;
            thread.CurrentCulture = new CultureInfo("ru-RU");

            DateTime dt = DateTime.Now;
            Console.WriteLine(dt.ToString());

            int count = Count(new string[] {"1", "2", "3" });

            ArrayList list = new ArrayList();
            list.Add(1);
            var item = (int)list[0];

            try
            {
            }
            catch (Exception ex)
            {
                var value = count.ToString();
                value = value + ";";
            }
        }

        public static int Count(IList<string> array)
        {
            return array.Count;
        }

        public static int Count(string[] array) 
        {
            return array.Length;
        }
    }
}

При компиляции было видано 7 предупреждений. Рассмотрим их более детально.

Warning 1 The variable 'ex' is declared but never used D:\Work\BeautifulCode\BeautifulCode\Program.cs 28 30 BeautifulCode

Это предупреждение выдал не инструмент анализа кода, поэтому пропустим его.

Warning 2 CA2210 : Microsoft.Design : Sign 'BeautifulCode.exe' with a strong name key. BeautifulCode

Эта ошибка говорит о том, что сборку необходимо подписать ключом. Это можно сделать в свойствах проекта –> Signing -> Sign the assembly -> вводим имя, нажимаем Ок.

Warning 3 CA1811 : Microsoft.Performance : 'Program.Count(IList)' appears to have no upstream public or protected callers. D:\Work\BeautifulCode\BeautifulCode\Program.cs 37 BeautifulCode

Метод int Count(IList array) никто не использует, скорее всего, он нам не нужен.

Warning 4 CA1804 : Microsoft.Performance : 'Program.Main(string[])' declares a variable, 'ex', of type 'Exception', which is never used or is only assigned to. Use this variable or remove it. D:\Work\BeautifulCode\BeautifulCode\Program.cs 28 BeautifulCode

Ошибка, идентичная первой, но уже от имени Code Analysis.

Warning 5 CA1804 : Microsoft.Perfyormance : 'Program.Main(string[])' declares a variable, 'item', of type 'int', which is never used or is only assigned to. Use this variable or remove it. D:\Work\BeautifulCode\BeautifulCode\Program.cs 23 BeautifulCode

Переменная item нигде не используется – наверное, ее стоит удалить.

Warning 6 CA1801 : Microsoft.Usage : Parameter 'args' of 'Program.Main(string[])' is never used. Remove the parameter or use it in the method body. D:\Work\BeautifulCode\BeautifulCode\Program.cs 12 BeautifulCode

Входящий параметр нигде не используется. Также не обходимо удалить.

Warning 7 CA1305 : Microsoft.Globalization : Because the behavior of 'int.ToString()' could vary based on the current user's locale settings, replace this call in 'Program.Main(string[])' with a call to 'int.ToString(IFormatProvider)'. If the result of 'int.ToString(IFormatProvider)' will be displayed to the user, specify 'CultureInfo.CurrentCulture' as the 'IFormatProvider' parameter. Otherwise, if the result will be stored and accessed by software, such as when it is persisted to disk or to a database, specify 'CultureInfo.InvariantCulture'. D:\Work\BeautifulCode\BeautifulCode\Program.cs 30 BeautifulCode

Здесь просто песня. Такое больше описание посвящено вопросу, рассмотренному в предыдущей статье – а именно необходимости указывать настройки глобализации.

Исправленный код будет иметь вид:

using System;
using System.Threading;
using System.Globalization;
using System.Collections.Generic;
using System.Collections;

namespace BeautifulCode
{
    class Program
    {
        static void Main()
        {
            Thread thread = Thread.CurrentThread;
            thread.CurrentCulture = new CultureInfo("ru-RU");

            DateTime dt = DateTime.Now;
            Console.WriteLine(dt.ToString());

            int count = Count(new string[] {"1", "2", "3" });
            count++;

            ArrayList list = new ArrayList();
            list.Add(1);

            try
            {
            }
            catch (Exception ex)
            {
                var value = count.ToString(CultureInfo.CurrentCulture);
                value = value + ex.Message;
            }
        }

        public static int Count(string[] array) 
        {
            return array.Length;
        }
    }
}

Теперь давайте проверим этот же код с помощью FxCop:

alt text

Как мы видим, результаты одинаковые.

Нужно также отметить, что вы сами можете писать собственный правила и подключать их в свои проекты.

Включаем Code Analysis в вашем проекте

Для того, чтобы включить анализ кода в вашем проекте, необходимо в настройках в вкладке Code Analysis включить опцию Enable Code Analysis on Build (defines CODE_ANALYSIS constant):

alt text

После чего при компиляции при налички ошибок будут показываться дополнительные предупреждения:

alt text

Дополнительные ссылки:

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

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


Microsoft Украина


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

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

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

Комментарии

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