Данная статья является единственным доступным для меня способом реакции на опус "
ASP.NET MVC Framework – ставим точки". Не имея аккаунта на хабре а значит и возможности ответить автору, хотелось хотя бы в песочнице излить душу. Что же не так в вышеупомянутом опусе? А то, что читая его и коментарии к нему понимаешь, что люди в основной своей массе не до конца разобрались, что же за зверь такой — ASP.NET MVC. Но уже собирают крестовый поход в защиту старого доброго классического ASP.NET. Еще раз повторю, что не хочу обидеть автора оригинальной статьи, а просто высказываю свое (естественно субъективное) мнение.
Но для начала некоторые факты
Ни для кого не секрет, что множество веб-фреймворков делится на подмножества компонентно-ориентированных (component based) и запросо-ориентированных (request-based). Не вдаваясь в детали, приведу несколько фактов фактов чтобы почувствовать разницу:
- request-based — все крутится вокруг запроса, при этом получаем чистый html, четкое разграничение ответственности, но есть проблемы с повторным использованием и сохранением состояния.
- component-based — здесь строится абстракция поверх стандартного для веб конвейера обработки запроса, при разработке интерфейса пользователь оперирует компонентами, состояние сохраняется автоматически (зловещий ViewState).
При всей кажущейся привлекательности request-based модели, со всей ее академической чистотой и легкой тестируемостью, модель component-based также имеет право на существование. Почему? Во первых, потому что она решает главную проблему stateless протокола http — сохранение состояния. (Попробуйте, например написать wizard на MVC фреймворке и поймете чего стоит отсутствие состояния). Во вторых, хорошо построенная абстракция компонентов позволяет решить проблему повторного использования элементов интерфейса и очень хорошо ложится на ajax.
Теперь к нашим баранам
Кто еще не понял ASP.MVC — это request-based, а классический ASP.NET — component-based. То есть это две совершенно разный парадигмы, сравнивать их также некорректно как сравнивать корову с апельсином. Каждая парадигма имеет свои плюсы. Но у классического ASP.NET есть один ну оочень зерьезный минус — тотальная порочность архитектуры. Во времена его написания программсты Microsoft не знали (или не хотели знать), о надобности тестируемости, интерфейсах, IoC, dependency injection и многом многом другом. Бесконечные синглтоны, статические методы и жесткая зависимость от конвейера обработки запроса лишили шансов покрыть тестами хоть что-то. А адаптеры данных, размещаемые прямо на странице и вовсе убили само понятие
«архитектуры». Команда, которая разрабатывала ASP.MVC, напротив, подошла к вопросу грамотно, реализовав отлично тестируемую и гибкую архитектуру. Да еще и дополнив ее обертками над стандартными аэспешнами синглтонами (HttpContext, Request и тд).
Теперь собственно к статье
Сначала автор говорит нам когда не нужно использовать ASP.NET MVC
* вам не нужен MVC Framework, если вы считаете, что он лучше классического ASP.NET. Если вы так думаете, значит вы плохо знаете ASP.NET, вам есть еще куда расти и что изучать. Если вы думаете, что MVC Framework лучше ASP.NET, значит вы не полюбили ASP.NET и не поняли всей прелести его идеологии. В таком случае вам рано переходить на MVC Framework. Переходить на новый фреймворк просто неоткуда, если у вас нет должного понимания и любви к базовому механизму. Изучить ASP.NET, поймите почему и как там все устроено. MVC Framework вам не нужен;
Первая неувязка в этом абзаце — как можно сказать что ЛУЧШЕ если это совершенно разные парадигмы? Зачем мне любить ASP.NET чтобы перейти на MVC? Это тоже самое что стараться выучить китайский, изучая химию.
Идем дальше
* вам не нужен MVC Framework для того, чтобы использовать паттерн MVC.
А для чего же он, пардон, тогда нужен?
В самом деле MVC не имеет никакого отношения к конкретной библиотеке. MVC Framework — это всего лишь реализация паттерна, которую никто не мешает вам создать и использовать самому в классическом ASP.NET. Попробуйте, это не трудно. MVC Framework вам не нужен, если причина только в том, что он MVC;
Да, MVC — это всего лишь паттерн. Паттерн, которай неплохо реализован для .NET в виде библиотеки ASP.NET MVC. Почему автор призывает не использовать готовое решение, а изобретать велосипед? Сложно сказать, но это, конечно, бред. Если вы хотите использовать паттерн MVC, НИ ЗА ЧТО НЕ ПИШИТЕ его сами! Используйте ASP.NET MVC! Лучше программистов Microsoft вы его все равно не напишите!
Далее перемещаем внимание в раздел «Почему вам нужен MVC»
Среди прочего читаем:
* и основная и главная причина, по которой вам нужен MVC Framework — это абсолютная расширяемость. В этом плане MVC Framework — это действительно каркас, который может быть заполнен так, как нужно вам. Можно провести следующее сравнение: классический ASP.NET — это картина, нарисованная мастером, тогда как MVC Framework — это набросок, эскиз, который зарисовать, доделать предоставляют вам самому. В MVC Framework вы способны переопределить действие механизма на любом этапе от обработки
запроса, до отправки результата.
Я, честно говоря, не совсем понимаю метафору автора с картинами (а уж то, классический ASP.NET — шедевр написанный мастером меня просто убило). В свою очередь хочу заметить, что расширяемость является неотъемлемой частью ЛЮБОЙ хорошо спроектированной программной системы. Так что здесь уместнее говорить о НЕрасширяемости стандартной модели ASP.NET, ее зажатости и антипаттерной
архитектуре.
Переход на MVC Framework не должен стать для вас поиском избавления от «проблем». Посмотрите на проблемы пристальнее и вы увидите, что все они решаются в рамках классической модели ASP.NET.
Да, хорошо можно писать на чем угодно, хоть на Алголе. Можно и классическом ASP.NET решить все проблемы. Но зачем? Только ради того, чтобы это была стандартная модель?
Сила MVC Framework в его возможностях и потенциале к расширяемости. MVC Framework — это тот конструктор, который вы должны пожелать после того, как полностью насытились проверенными инструментами.
Опять эта песня про расширяемость. Повторю, любая грамотно разработанная библиотека должна работать как конструктор, абстрагируя и пряча за интерфейсы подробности своей реализации. ASP MVC — пример такой хорошей библиотеки, а классический ASP.NET — наоборот.
Любые другие случаи, попытки избавиться от «недостатков» или «переход на паттерн MVC» — это недостаточные причины необходимости в переходе на MVC и большей частью являются ошибочной точкой зрения на вопрос.
Ошибкой родителей было зачать создателей классического ASP.NET, а желание избавится от недостатков и применить паттерн — это всегда благое дело!
Итак, подведу итог.
Были времена, когда Microsoft в своей работе над программными продуктами видели цель в создании инструментов rapid develpment. То есть быстрой (читай корявой) разработки. Ацким детещем той эпохи явился монстр ASP.NET. Сейчас времена изменились, и MS вовсю пропагандирует академически чистый подход, применение паттернов и юнит тестирования. В связи с этим надеюсь, что морально устаревшая модель классического ASP.NET в скором времени отойдет в мир иной и освободить дорогу свежим решениям!
PS. Прошу прощения за возможные ошибки и эмоциональный стиль — писАлось второпях, на одном дыхании.