Значення MVVM у галузі ділових застосувань (та безліч сучасних практик розвитку)


9

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

Однак моя кар’єра здебільшого обертається навколо внутрішньої лінійки бізнес-додатків - формалізації та оптимізації операцій бізнесу. У таких додатках зазвичай існує бізнес, що обертається навколо CRUD та складних операцій. У LOBs мої перегляди в кінцевому підсумку представляють собою дуже прості колекції функцій обгортки з одного рядка методів бізнес-класу, і в кінцевому підсумку лише ускладнюються найпростіші завдання, такі як показ вікна повідомлень або відкриття вікна. Хіба нікому іншому не здається дивним, коли люди вступають у довгі описи "введення залежності" та "постачальників повідомлень" для дзвінка Window.ShowDialog, який існує десятиліттями? Скільки інших питань виникає при переповненні стека, запитуючи поради щодо завдань, які були надзвичайно простими у форматі winform?

Не зрозумійте мене неправильно - я отримую MVVM і як це може бути безцінним для великих команд, що займаються горизонтальною розробкою скороченого та проданого програмного пакету. Тестування огляду моделей перегляду може заощадити мільйони, уникнувши поганої помилки RTM, а спеціальні розробники інтерфейсу можуть дати багатий досвід Але коли витрати на перерозподіл є мінімальними, і весь бізнес дбає платити за це просте робоче програмне забезпечення, чому я повинен витрачати одиницю часу на тестування простого "обгорткового" vm, коли моя бізнес-логіка вже перевірена одиницею? Скільки часу насправді бізнес дозволить мені витратити на милі анімації та кольорові схеми? Чи є щось, що може зробити молодший розробник (відстежувати помилку в функціональному режимі збереження, який раніше дивився на "Save_Click",

Правда, мені дуже подобається зв'язування даних WPF. Щоб скористатись цим, я встановив контекст даних у саме вікно, де він має доступ до бізнес-класу, а також до будь-яких інших властивостей, що спостерігаються. Так, таким чином я порушую майже кожне "правило" MVVM. Але принаймні у мене є простий код, керований подіями, який легко читати І я можу скористатися новими прив'язками даних і валідацією. Проблема полягає в дизайнерах - які я не так багато використовую, але сподіваюсь, що це краще інтегруватиметься у 2012 році - дизайнер демонструє сотні властивостей, які має вікно та його базові класи.

Для тих, хто може пов'язати, чи можете ви вказати мені на ресурси, книги чи навіть просто зміни в перспективі, які полегшили ковтання. Я дам MVVM ще один вистріл, але востаннє я відчував себе досить нерозумно, коли турбувався про ін'єкцію залежності, просто щоб показати вікно повідомлення від VM, я не мав наміру тестувати одиницю. Навіть якщо я зробив одиничний тест, чи справді ми отримуємо більш високу якість, торгуючи тестуванням часу запуску для помилок часу компіляції тих, які бояться «щільно зв'язаних» додатків?

Я усвідомлюю, що одна відповідь - просто залишатися у виграшних формах. Але як один з останніх прихильників WebForms (у мене дуже однакова критика тенденції розробки веб-сайтів), я відчував себе дещо схожим на динозавра, як це відбувається, коли я визнав, що більше не залишається WebForms у сертифікаційних треках Microsoft. Рух вперед - це єдиний варіант, навіть якщо мені це не подобається.


1
Хоча я не заохочую це, все ще можна написати програму WPF WinForms у стилі з подіями та кодом позаду. Для простих одноразових програм це не велика справа. Це зводиться до того, що ви цінуєте, і що забезпечує цінність для бізнесу. Я великий шанувальник TDD і MVVM, але якщо це дійсно не надає цінності, не робіть цього. Це не релігія. Просто пам’ятайте, що код часто живе набагато довше, ніж ми думаємо, що буде.
Метт H

"Хіба нікому іншому не здається дивним, коли люди вступають у довгі описи" введення залежності "та" постачальників повідомлень "для виклику Window.ShowDialog, який існує вже десятиліттями?" Мені це дратує, але така людина, яка потрапляє у все це (на шкоду, щоб насправді щось зробити), завжди була частиною поля, і, на жаль, напевно, завжди буде. Найкраща стратегія - максимально ігнорувати / відволікати їх.
користувач1172763

Відповіді:


10

Моя перспектива - це багаторічний досвід роботи з Winforms, "старомодним способом", з подіями та кодом. Тож я можу вам сказати з абсолютною впевненістю, що, як тільки ви вийдете за рамки найпростіших програм, ваш код швидко стає великим кулею грязі . Це було неминуче, тому що тоді писалися додатки.

Веб-форми є такими ж, за винятком того, що це спричиняє додаткове ускладнення, яке є державною абстракцією над системою без громадянства (павутина). Як сказав Роб Конери:

WebForms - брехня. Це абстракція, обернута обманом, покрита соусом з брехні, представленого на тарілці, наповненій диверсією та хитрістю руки. Ніщо, що ви робите з веб-формами, не має нічого спільного з Інтернетом - ви дозволяєте цьому зробити роботу за вас.

Це від хлопця, який написав цілком функціональний об'єктно-реляційний картограф, використовуючи dynamicключове слово в C # і лише чотириста рядків коду. Коли він авторитетно говорить про щось, я слухаю.

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

У мене є статичний метод, який я можу передати форму та колекцію пар Key / Value, і він (використовуючи Reflection) автоматично узгодить ключі з полями форми та заповнить форму зі значеннями колекції. Я також можу зробити зворотне, отримуючи колекцію ключів / значень пар із полів форми. Вся ця річ - це близько двадцяти рядків коду, але вона окупає себе кожен раз, коли я її використовую, тому що мені не потрібно писати сорок заяв про власні призначення для сорока елементів керування на формі.

Я можу взяти цей ключ / значення списку та серіалізувати його до XML, що дозволяє мені зберігати його у файлі. У мене є інші форми, якими я можу вручити звичайний DTO , і відобразити його поля у формі. Ніщо з цього не було б практичним у стилі Winforms "великий кульковий грязь". Це майже тривіально, коли використовується адекватна розв'язка.

Чи звучить хтось із цього? Це повинно; це по суті бідна форма прив'язки даних.

Правда, мені дуже подобається зв'язування даних WPF. Щоб скористатись цим, я встановив контекст даних у саме вікно, де він має доступ до бізнес-класу, а також до будь-яких інших властивостей, що спостерігаються.

Добре вам. Це не повинно бути сумісним MVVM. Але пам’ятайте, такі моделі як MVVM були створені, щоб допомогти розробникам будувати великі системи. Якщо вам просто потрібно відобразити діалогове вікно, можливо, вам не знадобиться вся ця сантехніка.

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

Розглянемо бібліотеку jQuery Джона Ресіга: це сама суть узгодженого дизайну, і вона приховує безліч дивних деталей про DOM та варіації способів обробки браузерів. Чи простіше просто написати кілька рядків Javascript? Іноді. Але користь написання коду jQuery в узгодженому, єдиному API полегшує наступній людині, яка приходить разом, зрозуміти, що ви зробили, та підтримуйте цей код, якщо це потрібно.

Мій реальний досвід роботи з моделями "великих додатків" - це використання ASP.NET MVC. ASP.NET - це ASP.NET MVC, а Winforms - WPF. Коли я працював в ASP.NET, я завжди намагався згорнути це за своїм бажанням. ASP.NET MVC нахиляється до вас. Це радість використовувати; вона створює чітку та організовану структуру системи та дає повний контроль над вашим додатком та розміткою. Ви можете використовувати Javascript, jQuery і CSS без особливих зусиль, а ASP.NET MVC залишається поза вашим шляхом.

Моє єдине перешкода - звикнути до цього і пізнати його на власних умовах.

Подальше читання, яке
ви повинні вивчити MVC від Rob Conery


Дякую за справді продуману відповідь великої кулі грязі - я точно визнав це в часи класичного коду асп і спагетті. 3 багаторівнева конструкція з vb6 / mts виправила багато цього, і тоді випуск .net звів це все разом. Але тепер, якщо відчуваєте, що прибуток від додаткових моделей швидко знижується - як витратити 1 млн доларів на те, щоб зайняти .1 секунду від вашого квартальної милі. "Я агресивно підштовхував кожний шматочок коду, який я міг винести на окрему збірку" - ви не вважаєте, що це дає неймовірно розбитий досвід розробки - постійно перескакуючи з файлу в файл, щоб прочитати два рядки?
b_levitt

3
don't you find that this gives an incredibly fractured development experience - constantly jumping from file to file to read two lines?- Ні, це навпаки. Введення в іншу подібну збірку звільняє ваш розум зосередитись на кожному класі та методі на власних умовах, як на власній маленькій чорній скриньці. Це дуже важко зробити з великою кулькою грязі. MVC працює за тим же принципом: тонкі контролери, жирова модель, без коду в зоні, якщо це абсолютно не потрібно.
Роберт Харві

3
Yagni застосовується лише тоді, коли ви самі пишете код. Якщо ви пишете узагальнену бібліотеку, яка повинна задовольнити широку аудиторію з різноманітними потребами, вам це знадобиться.
Роберт Харві

1
До речі, я нічого не маю проти життєвого циклу ASP.NET; Я бачив, як люди використовують це для відмінного ефекту. Я просто вважаю це контрінтуїтивним, ось і все. ASP.NET MVC не змушує вас робити будь-які розробки на стороні клієнта, якщо ви цього не хочете; ви можете використовувати "тупі" погляди, і це прекрасно працює. Варто зауважити: багато цього матеріалу може бути створено кодом (як і форма Windows), тому це не так, як ви самі пишете весь код. Я розумію, що це менш вірно з WPF, де вам доведеться мати справу з XAML, і я думаю, що тут є можливість для вдосконалення.
Роберт Харві

2
dozens of lines of plumbing to replace Window.Show- Це трохи спрощення. Якщо вікно потребує в даних, там завжди буде якийсь - то вид сантехніки , щоб отримати , що дані в елементи управління вікна, і навпаки. Ви можете або писати цей повторюваний код знову і знову для кожної створеної вами форми, або використовувати якусь форму узагальненого рішення, як прив'язка даних.
Роберт Харві
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.