среда, 10 сентября 2008 г.

Свершилось чудо или EF vs Linq2SQL

Тут на днях чудо свершилось, вышел ADO.Net Entity Framework. =) Я, признаться уже и не надеялся, что продукт до релиза доживет и следил за тем что там происходит без особого интереса. Но приятно было услышать, что MS таки преодолела проклятье "ObjectSpaces". :)

Напомню, в кратце, в чем там было дело. Давным давно, еще до выхода FW 1.1 на конференции PDC 2003, традиционно проходящей в Лос-Анжелесе, MS официально объявил о начале работ над технологией взаимодействия с данными под официальным названием "ObjecSpaces". Суть в том, что команда OS нашла фатальный недостаток в существующих ORM (их придумали не они), и решила этот недостаток устранить. Ну, поскольку дело хорошее, то с песнями и плясками приступили, и на вышеупомянутом PDC был предложен даже некий прототип... Но что-то пошло не так, что именно сейчас уже дело темное, и спустя какое-то время проект был заморожен. Тем временем, активно шли работы над другим забавным проектом, под названием WinFS - грубо говоря, это должна была быть объектная файловая система, причем данные должны были лежать в SQLServer-е. Очевидно при таком сценарии без ORM никуда вот и команда ObjectSpaces быстро нашла фатальный недостаток в их системе мапинга (ее придумали не они) и дружно влилась в стройные ряды WinFS team (причем предполагалось, что ObjecSpaces будет поставляться вместе с WinFS в качестве библиотеки). Но, что-то пошло не так, сейчас уже дело темное, и проект WinFS оказался заморожен. Тем временем, в светлые головы Коробкина, Хайлсберга и других талантливых ребят из MS пришла идея LINQ Project, и они начали ее продвигать и разрабатывать. Ясен байт, что подсистема LINQ-а, отвечающая за работу с RDBMS практически ORM (тогда она называлась DLINQ) и команда OS не смогла устоять перед искушением, нашла, по привычной схеме, фатальный недостаток и занялась рализацией DLINQ. В этот момент я, признаюсь, стал тревожится за успех этого во всех отношениях достойного мероприятия, но тут DLINQ трансформировался в Linq2SQL, и от него отделился Entity Frmework, куда и ушла команда OS в полном составе. С этого момента за Linq2SQL можно было быть спокойным, он зарелизился почти в срок... Релиз же EF был отложен, что уже не вызвало удивления. :) И тут, наконец-то случилось чудо, и MS преодолев злой рок разродился релизом ADO .Net Entity Framework. =)))Релиз, безусловно, еще сыроват, не достигнута основная цель всего мероприятия, о чем немного позже, но, тем не менее, это полноценный релиз.. :)
И так, что же такое Entity Framework и для чего он вообще нужен? Зачем MS поддерживать два, практически дублирующих друг-друга решения, EF и Linq2SQL?

На самом деле, это довольно разумно и у каждого решения есть своя, довольно четко просматривающаяся ниша. Универсальные, всемогучие подходы, вообще вызывают подозрение, тем более в такой скользкой и мутной области, как ORM. Более того, классические универсальные ORM обладают общим фатальным недостатком, именно в силу своей универсальности - вместо решения прикладной задачи, с ростом проекта начинаешь бороться с ORM....
Формально Linq2SQL - ORM, он действительно занимается тем, что мапит данные на объекты и обратно, и официально он тоже считается "типа ORM", но это не совсем ORM в общепринятом понимани. Это очень легковесное решение по мапингу данных на SQL и обратно и выполнению запросов прямо к данным, и в этом его прелесть. Он не перегружен ни чем лишним, практически ничего не требует от бизнес-объектов с которыми работает и отлично справляется со своими задачами. Не смотря на свою легковесность и отсутствие функционала, присущего большим классическим ORM, Linq2SQL покрывает практически все потребности при разработке типичного слоя данных. Дело в том, что подавляющее большинство приложений, кторые вообще имеют дело с данными, являются так называемыми "Data Driven" решениями, то есть, их модель предметной области практически полностью совпадает с моделью данных. Таким приложениям не нужны дополнительные прослойки, хитрые абстрагирования бизнес-логики от данных и прочий мутный функционал, и именно для таких приложений Linq2SQL - находка, аналогов почти нет. Причем уникальность и удачность решения заключается в том, что в данном случае ребята честно признались "Да, Data != Object" и работают с данными, как с данными, а не пытаются построить из них "полноценные объекты", как это делает большинство ORM. И, как я уже замечал выше, класс приложений для которых данный подход является наиболее удачным - весьма широк.
Entity Framework же, в свою очередь, задумывался как полноценный взрослый ORM для больших мальчиков, которые любят большие игрушки. Ключевое отличие, как уже наверное известно всем, заключается в том, что при использовании EF разработчик имеет дело не напрямую с данными, а с некоей концептуальной моделью приложения. Эта концептуальная модель призвана оградить хрупкую психику разработчика от ужасов работы с данными и служить этаким фронтендом, абстрагирующим суровую действительность. Результатом этой абстракции можно пользоваться как в прикладном коде, так и выставить наружу через веб-сервис или сереализовать в причудливый XML для загадочных целей, ...Причем по задумке, которую, насколько мне известно, пока еще не реализовали, эта концептуальная модель должна быть первичной. То есть, сначала строится модель, а потом, на ее основе, должны автоматически генериться и модель данных и код. Таким образом, вышеупомянутый абстрактный концепт играет роль некоего DSL (языка предметной области), в терминах которого описываются сущности и их взаимодействие между собой, после чего сторится уже конкретная реализация в данных и коде. На данный момент реализован только подход, который задумывался исключительно для поддержки legacy решений - когда первичной является модель данных, а уже на ее основе строится модель концептуальная, собственно этим, как я подозреваю, и объясняется путаница и частичное пересечение с Linq2SQL... Но, видимо ребятам уже совсем свербило выпуститься - и их можно понять... :) Будем надеяться, что все еще будет реализовано. Подобный подход, с явно выделеной концептуальной моделью, так же является достаточно востребованым. Как правило, нужда в нем возникает в Enterprise проектах, с большим количеством бизнес-логики слабо завязанной на данные или когда логика и/или схема данных может меняться в ходе эксплуатации системы, например, при разработке не конечного приложения под конкретного заказчика, а платформы для семейства решений. Приложений такого рода, безусловно меньше, но зато они обычно довольно масштабны. Это не значит, что все Enterprise решения - отданы на откуп EF, там вполне может оказаться очень к месту и Linq2SQL, но применение EF все-таки, в первую очередь, следует искать именно в больших проектах. Для подавляющего большинства рядовых решений, начиная от финансовых систем для родной бухгалтерии и заканчивая веб-приложениями, все концептуальные приседания вокруг абстракций скорее всего окажутся просто не нужны, и даже наоборот, лишь затруднят поддержку.

Вообще весь проект Entity Framework-а постоянно окружали какие-то слухи и непонятная движуха. Еще до выхода, ряд несознательных товарищей опубликовали "Вотум недоверия" (Entity Framework Vote of Confidence), весьма истеричный документ, упрекающий MS в том, что этот продукт сделали не так как хотелось авторам этого опуса. Даже если закрыть глаза на то, что с чисто технической точки зрения, большинство претензий довольно нелепы, а остальное просто недоделки, сама форма возмущения выглядит совсем не профессионально. Особенно забавляют отсылки к тому что "мы круты, мы тоже писали ORM, мы лучше знаем...". ;)Хуже другое. Очень надеюсь, что мои опасения не оправдаются, но вся эта суета вокруг EF наводит на неприятные мысли. Складывается впечатление, что внутри MS есть две группировки, каждая из которых тянет одеяло на себя, к счастию, силы разума вроде бы побеждают, судя по продуктам, но их оппоненты в отчаянии пытаются использовать совсем уж грязные приемы, а именно задействовать коммюнити и заставить их кричать, что все делается не так. Иными словами, есть нехорошее ощущение, что ребята с этим вотумом выступили не сами, а им кто-то посоветовал, а так как MS к коммюнити старается прислушивается, то это очень серьезный аргумент во внутренней политике. Кроме того, плохо еще и то, что подобный шаг подрывает доверие к коммюнити, есть гораздо более цивилизованные способы донести свою мысль до тех, кто принимает решения в MS.Очень надеюсь, что я ошибаюсь и ребят из NHibrnate-а просто немного занесло.. )

Комментариев нет:

Отправить комментарий