воскресенье, 22 июля 2012 г.

Шаблон для нового класса

Очень часто, особенно на новых проектах, приходится нажимать кнопку добавить новый класс. В проекте появляется новый файлик, но вот вас он полностью устраивает? В большинстве случаев, в этом классе присутствуют лишние пространства имен и нет нужных (да, да, я знаю как убрать неиспользуемые и добавить кликнув на имени класса используемые, но вот как добавить написав расширяющий метод Where пространство имен System.Linq?). Также, я стремлюсь оформлять класс регионами, что тоже приходиться делать ручками выполняя тупую работу. Сосбственно о чем я, под кактом различные способы, как получать новый класс именно того вида, как вам нужен.

Первый пример, будет наверно самым неправильным, но раз такой способ есть, то почему бы его не показать. Он заключается в изменении шаблона Visual Studio.
Т.к. меня больше всего раздражает отсутствие System.Linq в классах добавляемых в Silverlight проекты, то на нем и буду показывать.
Пусть, хочется, чтобы новый класс имел вот такой вид:

using System;
using System.Net;
using System.Linq;
namespace SilverlightApplication5
{
    public class MyClass
    {
        #region Конструктор
        public MyClass()
        {
        }
        #endregion
        #region Поля       
        #endregion  
        #region Свойства
        #endregion
        #region События
        #endregion
        #region Методы
        #endregion
    }
}
Все просто и красиво. Итак, для 32-х разрядных Windows идем в папку Program Files, для 64-х в папку Program Files (x86), в остальном путь будет иметь вид:
C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\ItemTemplates\CSharp\Code\1033\
В этой папке разархивируем архив SilverlightClass.zip (кстати, рядом лежит аналогичный архив для обычных классов).
Из двух содержащихся там файлов, нас интерисует SilverlightClass.cs. Открываем его в Visual Studio.
Собственно, видим вот такой код:

using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
namespace $rootnamespace$
{
       public class $safeitemname$
       {
       }
}
Правим список Namespace-ов, добавляем регионы:
using System;
using System.Net;
using System.Linq;
namespace $rootnamespace$
{
       public class $safeitemname$
       {
           #region Конструктор
           public $safeitemname$()
           {
           }
           #endregion
           #region Поля       
           #endregion     
           #region Свойства
           #endregion
           #region События
           #endregion
           #region Методы
           #endregion
       }
}
Сохраняем, и архивируем назад в файл SilverlightClass.zip.
Остается только переподключить шаблоны в Visual Studio. Для этого запускаем cmd.exe c правами администратора. Переходим в папку C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\ и запускаем devenv.exe с ключем /installvstemplates :
Все. Теперь при добавлении новых классов, у нас их структура будет такая, как мы хотели.
Пара слов о том, почему данный подход не очень правильный. Дело в том, что изменяя  стандартный шаблон, мы тем самым обрекаем себя на это при каждой переустановке системы или при переходе на другой компьютер. К тому же, при командной разработке, выкладывание всэх этих шаблонов будет утомительным мероприятием.
Второй способ, это чуть улучшенная модификация первого подхода.
Мы можем создать шаблон на основе имеющегося файла. Итак, форматируем класс так, как нам необходимо. В главном меню Visual Studio выбираем File -> Export Template:
В открывшемся окне, говорим, что на мужен шаблон элемента (Item Template) и жмем далее:
Отмечаем какой класс мы хотим вынести в шаблон и опять далее. Следующее окно не привожу, т.к. его можно пропустить кнопкой далее. А вот так выглядит последнее окно мастера:
Здесь необходимо указать имя нашему шаблону, описание, иконку и картинку с превью. После нажатия на кнопку Finish в Моих документах, в папке Visual Studio 2010\My Exported Templates появится шаблон, он же, автоматически добавится и в студию. Все, теперь добавляя новый элемент мы можем выбирать свеже созданный шаблон.
У данного подхода есть следующие приимущества.
1. Не трогаем системные шаблоны
2. Можно хранить шаблоны в хранилище кода и добавлять разработчикам на своих рабочих местах в пару кликов
3. Для класса можно иметь несколько шаблонов разного вида (в зависимости от назначения)
Третий способ, почти читерский, но так же мало применим как и первый. Пишем нужные нам шаблон класса, выделяем его мышкой и перетаскиваем на Toolbox.
Для удобства заготовку в Toolbox можно переименовать. Правда при создании нового класса, придется выделять все его содержимое, удалять и перетягивать из Toolbox-а готовый фрагмент (в котором еще и придеться править имена). В связи с этим, такой вариант не очень удобен, но оправдан, если например вынести не весь класс, а только пространства имен или регионы.
Четвертый способ, это конечно же фрагменты когда (snippet). Для создания нового фрагмента кода, выбираем добавить новый xml файл и вставляем в него вот такой код:
Прошу прощения, что картинкой, но blogger не может переворить CDATA (скачать файл можно здесь). Сохраняем его с расширением .snippet. Все, теперь мы его можем добавить в Visual Studio выбрав из главного меню Tools -> Code Snippets Manager.
После импорта, можно добавив новый класс, выделить весь код в нем, набрать myclass и нажать Tab. Будет вставлен нужный код, единственно придется ввести имя класса и пространства имен, но по крайней мере, будет подсказка, что их надо поменять, да и между ними удобно будет переходить по Tab.

Вместо выводов.
Мне нравится второй и четвертый способ, ну а так, каждый решает сам...

2 комментария:

  1. Способ №5 - File templates в Resharper.

    ОтветитьУдалить
    Ответы
    1. Может быть, у меня Resharper не стоит, поэтому рассказывал только про возможности студии

      Удалить