Я уверен, что многие из вас видели огромное количество open-source проектов, которые предлагают наборы сниппетов для Visual Studio. С одной стороны, конечно, подобные проекты – пустая трата времени обычного разработчика, т.к., говоря образно, к вам в монастырь приходит некто со своим уставом и диктует, что для счастливой и вечной жизни вам нужно таки заучить несколько комманд, которые вы потом будете использовать. Согласитесь, не глупо ли?
Но применения у снипетов есть, причем не частные а именно общие. И этот пост – попытка продемонстрировать набор темплейтов, который может пригодиться каждому.
Предыстория
Дело это происходило несколькими годами ранее, когда я еще был наивный и глупый и верил в светлое безкризисное будущее. В то время, мне в голову стукнула идея попробовать как-то расширить механизм сниппетов дабы попробовать попередавать в сниппеты параметры. Поскольку делать это в принципе невозможно (сорри!), в результате я обратился к кодогенерации, замутил проект и даже опубликовал на CodeProject не очень то популярную статью.
Идея была хорошая, но в результате получился трэш. И я бы рад забыть про эту идею не наткнись я, уже в 2010м году, на программу под названием CodeRush. Эта программа – плагин для производительности для Visual Studio – основной своей фичей мнит как раз реализацию удобых темплейтов которые позволяют… ну, по сути дела они делают то же что и обычные сниппеты для студии, но с одним капитальным различием.
В CodeRush используются только стандартные конструкции. Например, шорткаты для создания класса, метода, свойства. Написав c, создается класс. Написав ms, создается метод, который возвращает строку. А написав, например, pl.s, создается свойство типа List<string>.
Все подобные конструкты мы создаем каждый день в нашей работе. Это вещи, которые могут сэкономить массу времени людям которые, например, имея отличные знания C# не очень ориентируются в том как создавать типы на F#. И тут меня осенило. Ведь я, фактически, могу сам создать свой стандартный словарь сокращений для различных .Net-конструктов, выбрав те механизмы и типы, который лично я считаю наиболее удобными. Более того, я могу воспользоваться всей мощью мною любимого Решарпера, дабы иметь доступ к дополнительной, нужной мне информации – например к названию типа, в котором я сейчас нахожусь.
И понеслось…
Стандартный Словарь
Первым делом, мне пришлось выбрать те основные конструкты, которые будут доступны пользователю. Я выбрал следующие:
-
class -
static class -
interface -
struct -
enum -
abstract class -
Тестовый класс (с аттрибутом
TestFixtureи дефолтным методом с аттрибутомTest)
Что касается начинки класса, то мне понравились следующие элементы:
-
Private field
-
Private static field
-
Private readonly field
-
Public method
-
Test method (то же самое что и public method, но помечен как
[Test]) -
Auto-property (другие типы свойств делать не захотелось т.к. это уже реализовано в Решарпере через рефакторинги)
-
Dependency property (то же самое что
propdpв студии, только не надо писать лишний раз имя содержащего класса)
Теперь что касается типов. На вкус и цвет, как говориться, товарищей нет, поэтому в плане примитивных ValueType все может и понятно, а вот из reference types пришлось выбирать. В результате получилось вот это:
-
Примитивные типы:
bool, char, float, byte, double, int, string, long, uint, Guid, DateTime -
Более сложные типы:
Exception, StringBuilder, List<T>, HashSet<T>(на самом деле не уверен что конкретно этот тип много кто использует),Dictionary<T,U>
Вполне очевидно, что пользователи могут предпочесть другие типы, но я не могу поддержать их все. Один тип, который я решил поддержать отдельно – это IEnumerable<T>. Помните я публиковал небольшой пост о возможных фичах C#5? Так вот, оттуда я вычерпнул идею превратить ~ (тильду) в аналог IEnumerable. На практике, это значит что написав m~s вы получите метод, который возвращает IEnumerable<string>.
Реализация
Первое, что я сделал – это взял типичный шаблон Решарпера и пропустил через XSD.EXE, получив объектное представление. После этого, сделал для каждой концепции массив, и поместил все во вложенные циклы: типы объектов (класс, метод, и т.д.), типы значения, различные вариации вроде массивов или Nullable.
Отдельный код с циклом создал и для дженериков, чтобы был вариант как задать тип руками List<MyType>, так и сделать “шаблоный” тип – например vl.s делает List<string>.
Остальное все дело техники. Создать XML-файл из готовых кусочков совсем несложно, на самом деле. Правда результат получился немаленький – аж 1Мб (на текущий момент) шаблонов, в количестве где-то 1200 штук. И это, понятное дело, еще не все – ведь будут новые идеи, захочется добавлять полезные фичи. Но это как пойдет.
Дайте Мне Скорее!
Скачать все темплейты можно тут. Чтобы их установить, сначала идем в меню ReSharper→Live Templates, потом в открывшемся окне нажимаем кнопочку Import, выбираем XML-файл. И ждем. Долго. Очень долго. Ведь шаблонов “за тыщу”. Ну а потом собственно пользуемся.
Вообщем, шаблон я выложил, но это work in progress, так что если что — пишите комментарии! Спасибо!
P.S. С Новым 2011м Годом! Я на самом деле не склонен подводить итоги, поэтому скажу кратко – я даже не 2010й год отдельно рассматриваю, а полосу 2008-2010, в которой, увы, было очень мало радостей – а точнее, почти не было. И хоть и хочется сказать что “кризис ушел”, на самом деле это, конечно же не так. Но не знаю как вам, а лично мне остается одно: работать, работать, работать.
9 responses to “Полезный набор Live Template’ов”
Здравствуйте Дмитрий спасибо за темлэйты,
только вот не пойму некоторые shortcut повторяются и проблемы при вставке кода например
p~[ r~[ r~ повторяются по 2 раза.
Спасибо, пофиксил и обновил файл.
nd0 тоже дублируется.
Наверняка есть и другие, поэтому стоит программно отфильтровать все дубляжи.
Хмм, только что проверил, вроде дублирования больше нет.
Не пофиксил. Дубляжей еще полно, если заглянуть в XML. Удачи.
Теперь точно все пофикшено :)
Спасибо!
Не вникал, но шорткат p выдает такое:
public
{
typename
}
MyProperty
{
get;
set;
}
Проблема пофикшена :)