(MVC) MVC (2017 год)

Про модний термін MVVM.



Декілька разів у минулому році я стикався з пропозиціями роботи, де використовувалася якайсь надзвичайно модна технологія MVVM. Я розумію головне, що нічого нового (особливо Мікрософт) вигадати не може, бо він має величезну текучість кадрів, проацюють там молоді індуси і вони намагаються щось постійно вигадувати, щоб бути "на слуху". Це більш за все нагадує телефонні компанії, яки вигадують все нові й нові тарифи, які нібито вам допоможуть платити за телефон меньше. Чи банки, які постійно вигадують нібито нові ї нові свої "кредитни продукти", які нібито вам будуть більш корисні, ніж їхні попередні "продукти".

Оскільки у англійскому алфавіті лише 26 букв, то трехсимвольних технологій можна вигадати лише 26х25х24 штук, тобто 15 тісяч 600 штук. Це явно не відповідає планам мікрософта і вони вже довно почали вигадувати чотиресимвольні назви. Це дасть можливість молодим індусам (яких вже більше мільярда) більше можливостей для самореалізації - можна буде вигадати аж 358 тісяч 800 технологій. Але й це мало для мільярда індусів, вони інколи використовують вже пьяти і шости-сімвольні назви своїх "нових" чудо-технологій. Наприклад ODATA - що є найзвичайніший SOAP/WSDL сервіс з кріхітною надбудовою, що дозволяє звертатися до цього сервісу через зовнішний URL. Щоб збудувати подібний сервіс для своєї власної програми - мені вистачить години, але щоб прочитати книжку про Odata - не вистачить і місяця. Зато яка можливість самореалізації для молодих індусов, які працюють у мікрософті. І сколько можно підняти інформаційного шуму про "нові революційні продукти" від Мікрософту.

Але у різноманітних технічних інтервью про Odata, MVVM та подібні абревіатури питають нібито це справжні якись "нові" технології і тому я подивився детально, що ж означає термін MVVM. Для початку, я знайшов ось такі визначення MVVM:

Далі я зроблю спробу пояснити термін MVVM настільки просто, настільки це можливо.

1. MVVM на рівні SQL.

Поперше, всі попередні роки існувало визначення Model, звичайно це визначення на рівні SQL означало якусь окрему табличку. Звичайно з окремими таблами у нормазізованій формі працювати незручно, тому з SQL-серверу завджи піднімали дані через View. Так робили ще забагато років до утворення мікрософту, але це й був той самий середній рівень між даними та програмою, яка їх використувує. Тобто у сучасній термінології - наявність рівня View у SQL-сервері - це і є MVVM-технологія.

Звичайно, у будь-який реальній програмі існує велика кількість таких абстракцій як View на рівні SQL. Ось наприклад подивимось на мій найбільш комерційно вдалий проєкт VOTPUSK - там вьюх скільки завгодно. Це і є MVVM.



2. BLL - Business Layer Logic.

Звичайно, що це дуже простий MVVM, який не має якогось розумного функціоналу. Більш-меньш розумними були BLL - Business Layer Logic. Звичайно це якийсь власний код, який має спеціфічні методи.

BLL існували завжди, какож навіть коли ще не існувало Мікрософту. Але коли він з'явився, він теж почав використовувати ці терміни. Ось опис якоїсь моєї власної BLL, зроблений мною ще у 2006-му році, по мотивам якоїсь моєї старинної проги 2003-року, тобто прошло вже 14 років від того моменту, як навіть на моєму сайті з'явився опис звичайної технології MVVM - Бизнес-объекты на базе типизированных спецколлекций. У цьому випадку GridView, який показував дані на формі, мав біндінг не до якись фрагментарних даних моделі, а до проміжного рівня, який ще мав деякі додаткові можливості-сервіси. Тобто це чистий MVVM.



3. Linq-to-SQL - універсальна BLL в патерні MVVM.

У 2007-му році, тобто 10 років тому, з'явилася досить універсальна BLL під назвою Linq-to-SQL. Ця бібліотека дає можливість дуже зручно користуватися даними (model), які піднімаються з рівня SQL. Це не единий такий засіб улаштовання проміжного розумного рівня між програмою та моделью даних. Якщо подивитися на мою Класіфікація засобів роботи з даними (нажаль так і не завершену до кінця) - то і "Доступ до даних за допомогою TableAdapter and SqlDataAdapter" і "Доступ до даних за допомогою TypedDataSet" мають всі ознаки повноцінного MVVM-патерну, тобто спеціфічного розумного рівня між простими даними та програмою, яка біндіться до цих даних.



4. MVVM у ASP.NET з використанням EF.

Я і досі вважаю Linq-to-SQL найбільш зручним засобом "вживання" даних, але у стеці технологій ASP.NET Variants of ASP NET Technology stack, але останній час набула поширення інша технологія - Entity Framework, яка взагалі була розроблена зі спеціфічною задумкою, у будь який момент без будь яких втрат змінити двигун даних, який зберігає дані на hard-діскі. Навіть не обов'язково на двигун, пов'язаний з SQL. Але мікрософт почав грати у якись свої ігри, зоб зменьшити коштовність свойого SQL-серверу і підняти коштовніть своєї студії - і дурні піддались на цю рекламу і почали використовувати цю спеціфічну бібліотеку у будь-яких випадках, навіть коли проект буде завжди працювати на SQL-сервері і ніяких інших можливостей, виходячих за рамки Linq-to-SQL у проекті не потрібно. Ну наприклад у Entity Framework існує якісь єкзотичні можливості, яки дозволили молодим індусам знайти собі цікаву роботу, але ці модливості ніяк не корисні нікому іншому. Наприклад, якщо дані моделі мають назву Key та Data, то за допомогою мапера (який і є основною перевагою EntityFramework над Linq-to-SQL), дані в SQL можна зберігти з назвою Bred1 та Bred2, або навіть у одну колонку Bred.

Звичайно, що і сам по собі EF реалізує патерн MVVM, до того ж ще більше, ніж Linq-to-SQL, бо додає ще більш розумний та складний проміжний рівень між фрагментарними даними моделі та тим, що потрібно програмі для біндінга та відображення.



Якщо ми використовуємо EF, то для ASP.NET MVC є дуже цікавий додаток у патерні MVVM. Між справжною моделью даних (особливо це корисно якщо вона зробна як CODE First, бо в іншому випадку сам SQL-server зробить необхідні обмеження) - додається проміжний рівень. І цім проміжний рівнем можна дуже непогано керувати за допомогою атрібутів. Їх вичитує вбудоване середовище ASP.NET і обробляють клєнтськи скрипти у браузері. Тобто якщо написати, наприклад, що довжина текстової стрічки 100 символів, то про таке обмеження "автоматично" буде знати і браузер (з одного боку), і у справжню модель (з іншого боку) не попадуть стрічки більшої довжини.



5. MVVM у WPF.

Останній шаблон використання патерну MVVM, про який всі пишуть в інтернеті - це використання MVVM у WPF. Я не зовсім розумію цей підхід. Поперше MVVM існував задовго до утвороення самого мікрософту. Нікто і ніколи напрямки не працював з даними моделей. Наприклад View у SQL-сервере існували це років за 20 до створення Мікрософту.


Подруге WPF з'явився у 2009-му році і перші роки визивав лише посмішки, особливо при роботі у браузері у вигляді Silverlight. Бо на тот момент вже на 99% кампутерів у світі працював Flash Player і іже років п'ять працювало поширення Flesh у вигляді Adobe Flex. Який взагалі працює по своеї ідеології набагато швидче, бо браузер бінарний код, який заздалегідь встановлений на кампутері, а не інрплетірує стрічка за стрічкой текстовий код JavaScript.

У цьому середовище працювали мільони програмистів, студія для програмування та отдладки там на базі Excipse і працює набагато краще Visual Studio. І взагалі один із найбільших роззділів мого сайту )у якому я і досі програмую) саме програмування в Adobe Flex. А тут - здрасте - ось і мікрософт підрягнувся через 10 років і зробив якийсь свій власний клон WPF, який до того ж є конкурент їх власної теїнології Windows Forms.


Тому, коли я чую про якусь "новізну" мікрософтовських технологій, особливо у контексті WPF та MVVM - мене аж оторопь бере. Взагалі з голими моделями нікто і ніде не працював, технолія MVVM існувала завжди, а коли мікрософт зробив клон Flex - і заявив про революційність свого клона Flex (особливо коли всі побачили всю ую революційність - робота у тісячі разів повільгіше) - то залишилось лише плюватися в черговий раз на мікрософтовских дурнів, яких шатає зі стороні в сторону, незрозуміло чого вони взагали шукають крім грошей та продажу своїх книжок. Але нас, програмистів, вони рахують повними дурнями - ми повинні вивчати якись дурниці, якись висери їх тупих індусів, та намагатися увесь цей бред використовувати. Замість існуючих, гарно працючих технологий, до того ж все інсалированних на 99% процентив кампутерів у світі. І замість своїх власних (чудово працюючих) технологій Windows Forms.


Щодо приклада, який викладений Мікрософтом у Инет як підручник по MVVM - MVVM - Quick Guide. Я відтворив його сорсе-код і був здивований, що він навіть не компілюєтья. Потім я з'ясував, що це саме питання мають більш мільона програмистів.



Відповідь мене теж зацікавила - "цей код дуже старий, подивиться на новий".



Я подивився на новий код, опублікований у MSDN як шаблон - але кода там так і не побачив. Ось лінк на "нову версію" MVVM-шаблона кода від Microsoft. Мені здається, що цей лінк швидко загине в Инеті, тому я зробив його локальну копію. Ну це мабуть все, що потрібно зрозуміти про те, що мікрософтовскі індуси зрозуміли про MVVM.

В чому тут головна родзінка використання MVVM у WPF я так і не зрозумів, бо не код не працює і показати цю родзінку сами мікрософтовськи індуси не змогли.

А взагалі у автора MVVM-шаблону коду у WPF дуже велика проблема з будуванням EventHandler, він якось намагається будувати на Action'ах та Expression'ах. Це на 100% розбігається зі стандартним підходом, як ці хандлери взагалі будуються згідно документації - EventHandler(Of TEventArgs) Delegate.

6. Шаблон коду MVVM у WPF.

Якщо когось цікавить цей проєкт, перетрансльований на бейсік (це не автоматична процедура, тут потрібно думати), та з викушеною дурницею про коммунікацію між View та ViewModel, яку навіть автору цього коду не вдалося пояснити, як воно повинно працювати, то цей приклад ви можете взяти собі звідци, з мойого сайту.

Мій проект побудований у локальному GIT'і і має шість поінтів (master, ViewModelLocator, Variant-binding-2, Variant-binding-1, DataTemplates-Resourses, Communication), тобто ви маєте можливість перехода від поінта до поінта в один клік.







Comments ( )
<00>  <01>  <02>  <03>  <04>  <05>  <06>  <07>  <08>  <09>  <10>  <11>  <12>  <13>  <14>  <15>  <16>  <17
Link to this page: http://www.vb-net.com/MVVM/index.htm
<SITEMAP>  <MVC>  <ASP>  <NET>  <DATA>  <KIOSK>  <FLEX>  <SQL>  <NOTES>  <LINUX>  <MONO>  <FREEWARE>  <DOCS>  <ENG>  <MAIL ME>  <ABOUT ME>  < THANKS ME>