Цикл статей про PostSharp

Всем привет!

Хочу всех успокоить и сказать, что статьи будут. Но пока что не могу ими занятся, так как занят подготовкой к web-конференции SoftLab.NET, которая совершенно бесплатная, но надо зарегистрироваться заранее, чтобы заказать нужный пул подключений на площадке. Там я буду рассказывать про модели многопоточности и как их можно контролировать/валидировать с помощью PostSharp.

Обещаю, что еще до нового года появятся статьи про шаблоны проектирования.

До скорой встречи!

Hard’n’Heavy!

Принцип наименьшего удивления

Наконец-то появилась запись с выступления SECR-2013. Может она появилась и не на днях, но заметил я ее не так давно. Так что делюсь и оставляю себе, чтобы не забыть.

20131025-27-Принципы наименьшего удивления в разработке API приложения from Stas Fomin on Vimeo.

What I’ve learned about DDD since the book

Не далее как на прошлых выходных побывал на тренинге Patterns and Practices of Effective Domain Modeling, который вел Dino Esposito. Тренинг понравился, хотя я и не узнал фактически ничего нового. Ну это я сам виноват, так как давно копаю эту тему и много уже всякого переслушал и перечитал. Так вот, на этом тренинге на одном из слайдов была ссылка на выступление Эрика Эванса (Eric Evanse), где тот рассуждал на тему, как бы он переписал книгу “Domain Driven Design. Tackling complexity in the heart of software”. Я посмотрел это выступление и оно в целом очень интересное. Вообще мне нравятся темы, когда инициаторы каких-то идей, через несколько лет пишут или говорят о том, как они бы сейчас изменили свою книгу\концепцию. Это наверно наталкивает на мысли, что же наиболее важно оказалось. Второстепенные вещи редко поддаются сильным изменениям.

В общем, советую посмотреть тоже выступление What I’ve learned about DDD since the book

На сегодня это все =)

Hard’n’heavy!

ReSharper и Roslyn: Q&A

Как уже все знают, MS предлагает «компилятор как сервис» в виде платформы Roslyn. Может быть некоторые из вас ее уже попробовали и составили какое-то первое мнение. После того, как почитаешь внимательнее возможности Roslyn и рассмотрев примеры работы с ним, возникает закономерный вопрос:

Как это будет работать с ReSharper и будет ли он переписан? Когда будет новый решарпер для новой студии?

В предыдущий раз ReSharper появился только в момент выпуска RC или около того, насколько я помню, т.е. достаточно поздно. Как оно будет в этот раз и как будут вместе жить ReSharper и Roslyn предлагается узнать из перевода интервью с разработчиками из JetBrains.

 

После анонса и выпуска Roslyn платформы на последней конференции BUILD, мы в JetBrains немедленно оказались погребены под вопросами о судьбе ReSharper, в смысле будет ли он использовать Roslyn для анализа кода и как они могут вместе сосуществовать. Поток вопросов не иссякнет, пока не будет использоваться единый шаблон для ответов на них:

resharper

Continue reading

Различные профили Visual Studio и установка расширений к ним

Создание и запуск окружений

В большинстве случаев разработчикам не требуется работа Visual Studio в «песочнице». При этом песочница может быть достаточно большая и стабильная. Обычно все окружение и дополнения к студии находятся в единственном экземпляре. То, что студия запускается в нескольких инстансах не в счет. Окружение и настройки для них применяются одни и те же.

Однако, существует ряд задач, когда требуется получить «студию, которая словно только что установилась». Что это за задачи?

  • Тестирование дополнений для Visual Studio. Вы можете делать обзоры на дополнения, или хотите посмотреть стабильность дополнения не устанавливая его в свой рабочий экземпляр студии.
  • Разработка дополнений для Visual Studio. В этом случае все еще опаснее для разработки, так как дополнение с ошибками может надолго вывести студию из строя. Но в данном случае вы будете подстрахованы, так как для дебага студия будет запущена в «песочнице».
  • Работа с сильно различающимися настройками для нескольких проектов. Это может быть различные плагины, настройки окон, хоткеи и вообще все, что может быть настроено в студии.

Мне это понадобилось в свете тестирования дополнения к студии, которое надо устанавливать на отдельные окружения\профили. Некоторые детали о специфике задачи: Есть фреймворк, который ставится в виде VSIX пакета. Нюанс в том, что фреймворк одновременно развивается\поддерживается для нескольких номерных версий, которые не могут сосуществовать параллельно в рамках одного профиля Visual Studio.

Continue reading

Обзор новых элементов C# 6.0

В сети находится огромное количество информации по этой теме и все достаточно разрозненно. Хотелось прежде всего для себя систематизировать и обозначить новые возможности языка. Некоторые вещи являются синтаксическим сахаром, некоторые являются действительно новыми фичами. Хотя в свете возможностей предоставляемых Roslyn, понятие о «сахаре» и новых фичах несколько размывается. Ведь можно модифицировать язык и создавать свои диалекты. Так что возможно скоро большие команды будут использовать свои варианты языка. Или нет. Но это отдельная большая тема (вспоминается просто Jetbrains с их Resharper). Доступность описываемых фич описана на странице https://roslyn.codeplex.com/wikipage?title=Language%20Feature%20Status. Большая часть всех фич уже доступна и вызывает положительные эмоции. Хотя, честно сказать, не всё из того, что помечено как «должно работать» работает. Например, индексированные члены в словаре что-то не завелись, хотя остальное все работало как надо.

Активизация экспериментального компилятора

Для того, чтобы описываемые штуки завелись, необходимо использовать VS2014 cRoslynSDK, или же VS2013 с SDK, RoslynSDK. После того как все компоненты были установлены, можно создать новый проект, открыть файл проекта (.CSPROJ) в текстовом редакторе и добавить в конфигурацию сборки строку:

<LangVersion>experimental</LangVersion>

Обратите внимание, что именно с маленькой буквы надо писать «experimental», иначе не работает. Конечно, это будет поправлено ближе к релизу. После таких нехитрых приготовлений можно начинать эксперименты.

Краткий список нововведений

  • Exists: Already shipped in previous release
  • Done: Implemented for this release
  • Planned: Intended for this release
  • Maybe: Possibly intended for this release
  • Withdrawn: Probably not in this release
  • No: Not intended for this release

 

Feature Example C#
Primary constructors class Point(int x, int y) { … } Done
Auto-property initializers public int X { get; set; } = x; Done
Getter-only auto-properties public int Y { get; } = y; Done
Using static members using System.Console; … Write(4); Done
Dictionary initializer new JObject { [“x”] = 3, [“y”] = 7 } Done
Indexed member initializer new JObject { $x = 3, $y = 7 } Withdrawn
Indexed member access
  1. $name = c.$first + ” ” + c.$last;
Withdrawn
Declaration expressions int.TryParse(s, out var x); Done
Await in catch/finally try … catch { await … } finally { await … } Done
Exception filters catch(E e) if (e.Count > 5) { … } Done
Typecase Select Case o : Case s As String : … No
Guarded cases Select Case i : Case Is > 0 When i Mod 2 = 0 No
Partial interfaces Partial Interface I1 Exists
Binary literals 0b00000100 Planned
Digit separators 0xEF_FF_00_A0 Planned
Expression-bodied members public double Dist => Sqrt(X * X + Y * Y); Planned
Event initializers new Customer { Notify += MyHandler }; Planned
Null propagation customer?.Orders?[5]?.$price Done
Semicolon operator (var x = Foo(); Write(x); x * x) Maybe
Private protected private protected string GetId() { … } Withdrawn
Params IEnumerable int Avg(params IEnumerable<int> numbers) { … } Planned
Constructor Inference new Tuple(3, “three”, true); Maybe
String interpolation \{p.First} \{p.Last} is \{p.Age} years old.” Maybe
TryCast for nullable var x = TryCast(u, Integer?) Exists
Implicit implementation Class C : Implicitly Implements I Exists
NameOf operator string s = nameof(Console.Write); Planned

Continue reading

NPTV

Всем привет!

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

Собственно кратно я об этом уже писал, что блог помог мне найти работу мечты и теперь я евангелист и моя работа состоит в том, чтобы пробовать SDK нового продукта, новой платформы и выдавать свое мнение насчет того, насколько удобно будет этим пользоваться другим программистам. Само по себе это уже важное дело, я считаю, и надеюсь у меня получится подкорректировать продукт так, чтобы пользоваться платформой новой было в радость и не возникали недоумения по поводу API.

Думаю, что уже можно и стоит рассказать о том, чем я занимаюсь и о чем буду писать на профессиональной основе. Впрочем, это не значит, что количество технических статей в блоге уменьшиться или они будут направлены только на один продукт. По крайней мере я на это очень сильно надеюсь. Итак, мы разрабатываем новую платформу для интерактивного телевидения. Возможно вы уже представили себе варианты того, как это выглядит. В наиболее привычном смысле большинство представляет себе интерактивное телевидение как нечто, что может управляться зрителями. И конечно же это так. Другой вопрос как вы будете управлять телевидением. До определенной степени сейчас все мы смотрим интерактивное телевидение, так как мы можем свободно переключать каналы и формировать собственную программу передач с разных каналов. Далее можно представить себе, что скачка передач и фильмов из интернета так же позволяет нам формировать свой канал вещания для себя. Что ж, тоже элемент интерактивности. Можно пойти дальше и наиболее продвинутые каналы на своих сайтах предоставляют записи своих передач и вы можете посмотреть их в любое удобное время.

Однако все упирается в ваше время и желание заниматься этим. Хотя конечно это всегда самый сложный вопрос ))

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

Чтобы долго не томить, сразу расскажу в чем основная фишка, kill feature. Вы можете сами режиссировать трансляцию, если съемка производится разными камерами!

Continue reading

Object Explorer в MS SQL Server, как он должен быть

Давно собирался написать эту статью, о том каким должен быть Object Explorer в SQL Server.

В движок системы добавляются все новые и новые фишки, улучшается поддержка администрирования, скорость работы и так далее. Даже появляются сниппеты кода, а так же автодополнение в базовой версии, казалось бы, чего волноваться? Однако при постоянной работе с SQL Server, и когда хоткеи ReSharper’a уже хочется привнести в каждую программу, замечаешь насколько неудобная работа с объектами базы.

Все хорошо и красиво, когда в базе находится наверно не более 20 таблиц, которые можно объять одним взглядом, однако если таблиц от 50 и больше, а так же требуется работать с несколькими окружениями – работа превращается в ад. Очень легко выполнить не тот код, работая не с тем соединением. Да и просто поиск таблиц вызывает затруднения, так как обычно помнишь примерное название, а не дословное. Впрочем подобная проблема касается любых объектов в SQL Server.

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

01

Что это за база? Какой это сервер? Сколько тут еще таблиц?

Continue reading

Поведение при подписке на события

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

Для иллюстрации рассмотрим следующий пример. Пусть у нас есть некоторое приложение со списком опций и общей картинкой. Т.е. приложение выглядит примерно следующим образом:

sample

Логика работы приложения выглядит следующим образом. При выборе элемента из списка картинка предпросмотра обновляется на произвольную из выбранного альбома. Согласитесь, что все очень просто, так?

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

Код в реальности выглядит вот так. Т.е. это то, как вы его напишите с первого раза. Собственно я написал так же.

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

Итак, что вы ожидаете от такого кода? Посмотрите внимательно на названия методов, событий – решите для себя, что вы ожидаете.

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

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

Это очень странно на первый взгляд, так как я подписываюсь на событие и ожидаю, что его получат все заинтересованные компоненты, и обработка не прервется на самом интересном месте. Для того, чтобы сработало передвижение на новый элемент из listBox, необходимо дописать IsHandled = false:

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

На мой взгляд надо сделать два события:

  • ArrowNavigationCommandReceived – нет возможность использовать IsHandled для прерывания цепочки обработки.
  • ArrowNavigationCommandReceiving – есть возможность использовать IsHandled.

Ближайшая аналогия прослеживается с событиями Closed и Closing для окон (WinForm, WPF).

Что вы думаете по этому поводу? Комментарии как всегда приветствуются.

UPD: голосование пока что запилить не могу.

[poll id=”2″]

Hard’n’Heavy!