Sunday, April 12, 2009

Список интересных подкастов: выпуск #1

Недавно прослушал несколько интересных подкастов. Хотел бы поделиться некоторыми наиболее интересными на мой взгляд:

Carl, Richard и Ward Bell обсуждают вопросы использования ORM в целом и Entity Framework в частности. Послушав этот подкаст, вы узнаете какие проблемы есть у Entity Framework v1.0 (дизайнер, POCO, etc.), еще раз про ситуацию с LINQ to SQL и Entity Framework, о которой я уже писал, почему NHibernate, несмотря на свои функциональные преимущества, не очень популярен в широких кругах программистов, когда стоит использовать ORM, когда не стоит, а также какие есть проблемы разработки RIA приложений, в частности проблема единственности модели данных, когда и на сервере, и на клиенте приходится делать одинаковую модель, чем тут может быть полезен DevForce .NET Silverlight-разработчикам (хотя после выхода RIA Services часть проблемы с моделью вроде бы как уходит).

Гость программы, Doug Crockford рассказывает про свой профессиональный опыт, а также про создание формата данных JSON, автором которого он является (!). Также довольно много обсуждений того, почему DOM - ахиллесова пята клиентских скриптов, различных стандартов, на которых строится JavaScript, а также его будущего. Весьма познавательно.

Robert C. Martin (Uncle Bob) в гостях у Скотта рассказывает последнему, что такое Single Responsibility Principle, Open Closed Principle, Liskov Substitution Principle, Interface Segregation и Dependency Inversion Principle (SOLID). Очень детально и на примерах. Рекомендую всем, кто начинает понимать, что кроме внешнего качества продукта, есть еще его внутреннее качество - качество кода.

Просто отличный подкаст о людях, которые разрабатывают софт не только для крупных организаций, и не только за деньги. Приложение, которое вносит свою лепту в дело борьбы с раком, разработанное в Scripps Institute, в котором поучаствовало много программистов со всего мира, объединенных одной целью. WPF, Sharepoint, Scrum, и многое другое. Если вы хотите изменить мир к лучшему, то послушайте как это делают другие люди: возможно, у вас появится руководство к действию.

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

А какие подкасты нравятся вам?

Saturday, April 4, 2009

ASP.NET MVC: такие разные модели

Как известно, ASP.NET MVC основан на паттерне Model-View-Controller. Первым компонентом этого паттерна является модель, которую я бы и хотел рассмотреть сегодня поподробнее.

Модель - это самый абстрактный компонент шаблона MVC. Моделью может быть все, что угодно, что не является контроллером и представлением :) На самом деле, модель - это то, что мы привыкли называть данными, и бизнес-логика, которая работает с этими данными, состояниями приложения и т.д. То есть, в терминах 3-звенной архитектуры, моделью можно назвать вашу бизнес-логику и все то, что лежит ниже ее, то есть слой доступа к данным и сами эти данные. А в терминах DDD моделью, наверно, можно назвать слой ваших сервисов и все, что под ним: репозитории, инфраструктуру и т.д. Причем данные эти могут находится абсолютно где угодно, а не только в базе данных: где-то на веб-сервисах, в файловой системе, распределенном кеше или даже в конфигурационном файле.

В ASP.NET MVC же модель - это несколько более широкое понятие, так как различных моделей в ASP.NET MVC не одна, а целых две. То, что мы рассмотрели выше, называется моделью предметной области, или доменной моделью (Domain Model). Однако есть еще одна модель - т.н. модель представления (View Model). Что же это такое?

View Model - это реализация одноименного подхода (или паттерна) к передаче данных в представление, который используется не только в ASP.NET MVC, но и в других местах, например, в Silverlight или WPF. View Model отличается от Domain Model тем, что он предназначен не для представления предметной области, а лишь для передачи данных из контроллера в представление в удобной форме. Ведь не всегда вашему представлению нужны все данные сущности, а иногда, наоборот, нужны данные в каком-нибудь специфическом аггрегированном формате, или просто набор этих данных, не связанный между собой ничем, кроме того факта, что он будет отображен на одной и той же странице. То есть, по сути, View Model - это некая проекция данных Domain Model, которая необходима конкретному представлению.

Например, у нас есть страница, которая показывает категории продуктов слева в меню, и список продуктов конкретной категории в области контента. Для отрисовки этой страницы (представления) ей необходимо получить от контроллера список категорий, выбранную категорию и список продуктов этой категории. Самый простой способ - передать эти данные через dictionary ViewData. Но это как-то не по-ковбойски :) Никакой безопасности типов + возможность ошибиться в строке ключа. Тогда остается лишь передавать данные через типизацию класса ViewPage<Type>, где Type - это тип передаваемого объекта, который будет доступен через свойство Model в представлении. Однако, у нас в Domain Model нет такого типа, который бы содержал две необходимые нам коллекции и одну сущность. Поэтому нужно его создать и назвать, например, ProductsListViewModel. Данный тип будет вспомогательным, его единственное назначение - это послужить контейнером для передачи данных из контроллера в представление.

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

<%= Model.Categories %>

Во-вторых, если мы когда-то решим, что нам бы не помешало создать Partial View (ascx-контрол, по-русски) для показа списка категорий, нам будет достаточно подключить его на страницу при помощи следующего вызова:

<% Html.RenderPartial("CategoriesList", Model.Categories); %>

И даже если мы когда-нибудь захотим еще и подсвечивать выбранную категорию, то мы легко можем создать CategoriesListViewModel, который будет содержать коллекцию категории и ссылку на выбранную категорию, а потом использовать эту новую модель в ProductsListViewModel. При этом наш контрол будет наследоваться от ViewUserControl<CategoriesListViewModel>. Красота, все разложено по полочкам, предельно просто и понятно.

Пара слов о том, где хранить созданные классы View Model. Как вы уже поняли, их может быть довольно много, в зависимости от количества представлений и их сложности. Я предложил бы хранить их в замечательной папочке Models, которую Visual Studio вам заботливо генерирует при создании проекта ASP.NET MVC. Классы Domain Model вы там все равно, скорее всего, хранить не будете (по крайней мере, я бы советовал для них создавать отдельную сборку). А если даже и будете, то никто не мешате создать две папки Model/DomainModel и Model/ViewModel.

Самые внимательные уже наверно увидели сходство паттерна View Model с DTO (Data Transfer Object). И сходство действительно есть, причем значительное. И там, и там - проекции данных для передачи куда-то. Только, в отличие от DTO, которые могут передаваться как угодно далеко, хоть на деревню дедушке, View Model объекты передаются всего лишь по соседству в представление. Так что можете пользоваться этой аналогией, если вам так будет проще понять смысл View Model и его назначение.

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

Model:

Stephen Walther: Understanding Models

View Model:

DataModel and ViewModel
DataModel-View-ViewModel pattern series

Sunday, March 29, 2009

Entity Framework vNext: сущности, сами отслеживающие свои изменения

Команда ADO.NET продолжает свой эксперимент по публичному проектированию следующей версии Entity Framework. Надо сказать, что результаты пока что весьма спорны: с одной стороны, они действительно публикуют все идеи и предлагают их обсуждать, с другой - очень часто возникает впечатление, что все решения уже приняты, и максимум, на что можно рассчитывать - это какие-то незначительные изменения в деталях.

Вот, например, одно из последних нововведений - это концепция сущности, которая сама отслеживает свои изменения. Я поначалу не до конца понял идею и до середины статьи думал, что ADO.NET team решил реализовать сделать свою версию Castle ActiveRecord, воспользовавшись одноименным паттерном. Однако потом я-таки въехал в идею - никакого Active Record там нет. Смысл в том, что теперь у разработчиков появится возможность сгенерировать достаточно "умные" сущности (при помощи T4), которые будут сами отслеживать свое состояние и фиксировать изменения. Сохранять изменения в таких сущностях вы сможете просто вызвав метод ApplyChanges у ObjectContext, которому вы можете передать подобный объект (да, наверно, и коллекцию). Кроме того, если вы просто создадите эту сущность, она будет жить с состоянием Added до тех пор, пока кто-то не решит записать ее в базу. Фактически, теперь вы можете создать сущность при помощи одного контекста, а потом сохранить при помощи другого, то есть сущность становится намного более независимой от контекста, который ее породил. В статье подобная сущность даже называется POCO-объектом, хотя все-таки до true POCO там еще далеко.

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

Однако, лично у меня возникает один вопрос: как быть с ассоциациями (навигационными свойствами)? Теперь, когда сущность отделена от контекста, она не может им воспользоваться для того, чтобы заполнить данными незагруженное навигационное свойство. Как быть? Задал вопрос разработчикам там же в комментариях - может, ответят.

Другие нововведения:

1) Новый тип ассоциаций (foreign key)
2) Упрощенная настройка шаблонов генерации сущностей (T4)
3) Функции, определяемые в модели
4) Общие улучшения для N-tier архитектур
5) Концепция подхода Model First
6) и многое другое (там действительно куча информации)

PS. Надо сказать, нашумевший Vote of no confidence, о котором я уже писал, сделал свое дело, и вторая версия EF будет намного более солидной и зрелой. Еще бы немножко улучшить производительность - и будет достаточно интересная альтернатива NHibernate.

Saturday, March 21, 2009

Материалы доклада по ASP.NET MVC

Как я и обещал, выкладываю материалы доклада по ASP.NET MVC, который я делал в прошедшую пятницу, 20 марта, на очередной встрече UNETA в Харькове.

Презентация:

Исходный код тестового приложения выкладывать не буду, т.к. есть отличный пример http://nerddinner.codeplex.com/, о котором я уже упоминал, и к которому мне особо добавить нечего. Пользуйтесь им для ознакомления и изучения. Очень маленькое 185-страничное описание этого приложения можно найти здесь, а живую попытку Скотта Хенселмана (Scott Hanselman) написать это приложение перед широкой аудиторией за 75 минут с перерывами на шутки - здесь. Кстати, там внизу можно его скачать и насладиться просмотром на скорости 1.3-1.4, если у вас не так много времени :) На главной странице MIX'09 вы также можете найти кучу других интересных докладов, особенно по ASP.NET MVC и Silverlight. Такое впечатление, что MIX'09 прошел под эгидой этих двух технологий. В общем, рекомендую.

Да! Чуть не забыл. А если все получится, то, возможно, чуть позже будет еще и видео :)

Wednesday, March 18, 2009

ASP.NET MVC 1.0 released

Я еще не нашел официального подтверждения, но на Microsoft Downloads он уже висит:

http://www.microsoft.com/downloads/details.aspx?FamilyID=53289097-73ce-43bf-b6a6-35e00103cb4b&displaylang=en

Думаю, в ближайшее время об этом будет официально объявлено на MIX'09 :)

Вдобавок сообщаю, что в эту пятницу, 20 марта, я буду делать доклад по ASP.NET MVC на харьковской UNETA. Какое приятное совпадение, правда? :) Так что с одной стороны поздравляю всех, что ЭТО произошло, а с другой приглашаю на нашу встречу. С учетом того, что второй доклад будет по Silverlight, а докладчиками будут Сергей Лутай и Андрей Каща, уверен, что будет интересно.

Приходите.

Friday, March 13, 2009

Обеды для гиков

Несколько всем известных гиков (nerds, geeks), Scott Guthrie, Scott Hanselman, Rob Conery и Phil Haack, пишут книгу об ASP.NET MVC, который они же, собственно, и разрабатывают. Книжка эта, надеюсь, будет доступна уже довольно скоро, а пока что они решили выложить отрывок книги в бесплатный доступ. В отрывке этом описывается процесс создания сайта http://www.nerddinner.com, который предназначен для того, чтобы помочь другим гикам отрываться от своих любимых компьютеров, собираться в кучки за завтраком/обедом/ужином и обсуждать свои гиковские темы под пиво/виски/сок.

Так что всем, кто хочет побыстрее окунуться в изучение новой веб-технологии, и заодно на реальном примере посмотреть, как правильно разрабатывать приложения на ASP.NET MVC, рекомендуется зайти на http://nerddinner.codeplex.com и скачать оттуда исходный код и тесты.

Тем же, кто проникнулся идеей организовать первый гиковский обед на просторах бывшего СССР, никто не запрещает это делать. Жаль только, что сайт этот пока что не сильно распространен в нашей части света, поэтому не ожидайте большого наплыва желающих, разве что вы не пнете их сами :)

Посты авторов об этом событии:

http://weblogs.asp.net/scottgu/archive/2009/03/10/free-asp-net-mvc-ebook-tutorial.aspx
http://www.hanselman.com/blog/FreeASPNETMVCEBookNerdDinnercomWalkthrough.aspx
http://blog.wekeroad.com/blog/nerddinner-and-a-free-book/
http://haacked.com/archive/2009/03/10/chapter-one-pro-aspnetmvc.aspx

Кстати, кто еще не успел проникнуться идеей о том, что MVC – это шаг в правильном направлении для веб-разработки и наше общее будущее, можете узнать о нем больше на официальном сайте, где уже собралось довольно много материалов и видео-уроков, полностью описывающих процесс создания приложения и различные tips & tricks. И еще, кроме блогов вышеперечисленных товарищей, рекомендую блог Stephen Walther’а, который содержит ОЧЕНЬ много советов и трюков по ASP.NET MVC и отрывки из будущей книги Стивена по все тому же ASP.NET MVC.

Приятных обедов! :)

Thursday, March 12, 2009

О философии в программировании (и не только)

Очень понравились несколько философских фраз, которые запросто подходят и к программированию, поэтому оставляю здесь – удобно ссылаться в будущем, и, может, кто-то еще не видел :)

Классика кунг-фу (взято с RSDN):

Сначала ты не знаешь, что нельзя делать то-то.
Потом знаешь, что нельзя делать то-то.
Потом ты понимаешь, что иногда таки можно делать то-то.
Ну, а потом ты понимаешь, что помимо того-то существует еще шестьдесять шесть способов добиться желаемого, и все из них практически равноправны.
Когда тебя спрашивают "как мне добиться желаемого", ты быстро перебираешь в уме эти шестьдесять шесть способов, прикидываешь то общее, что в них есть, вздыхаешь и говоришь: "Вообще-то, главное – это гармония."
И на вопрос обиженных учеников: "А как ее добиться?", ты говоришь: "Никогда не делайте то-то".

Сколько раз уже убеждался в простоте и правоте этой формулировки…

Искусство мыть слона

Слон большой. В нём много работы вообще и даже много разных видов работ. Нужно знать, что делать, когда делать, когда переставать это делать.
* Какую часть слона ты начнёшь мыть первой?
* Когда сочтёшь её чистой и перейдёте к следующей части?
* Как, собственно, убедить других, что слон уже вымыт (у них может быть и, по-видимому, действительно будет своё мнение по этому вопросу)?

Суть в том, что не стоит браться за мытье сразу всего слона. Ответь на мелкие вопросы и получишь более полный ответ и понимание, куда двигаться дальше.

За последнее особая благодарность Андрею Каще, который привел эту фразу в качестве аргумента в нашей дискуссии. Да, и еще Андрей недавно написал очень хорошую статью по модульному тестированию.