Wartość MVVM w szeregu aplikacji biznesowych (i szereg aktualnych praktyk programistycznych)

9

Po 2 latach wciąż walczę z MVVM jako praktyczną metodą tworzenia działającego oprogramowania. W niektórych przypadkach jest świetnie. Zrobiłem wielowątkową aplikację, która kontrolowała małą linię montażową, która byłaby koszmarem bez koncepcji MVVM. Oderwanie od fizycznej linii montażowej było prawie bez zastanowienia.

Jednak moja kariera koncentruje się głównie na wewnętrznej linii aplikacji biznesowych - formalizując i optymalizując działalność firmy. W takich aplikacjach istnieje ogólnie teir biznesu, który obraca się wokół CRUD i operacji złożonych. W LOB moje modele widoków kończą się bardzo prostymi zbiorami funkcji owijania jednej linii metod klasy biznesowej, a na koniec komplikują najprostsze zadania, takie jak wyświetlanie okna komunikatu lub otwieranie okna. Czy nikomu innemu nie jest to dziwne, gdy ludzie przechodzą w długie opisy „wstrzykiwania zależności” i „dostawców wiadomości” dla wywołania Window.ShowDialog, które istnieje już od dziesięcioleci? Ile jeszcze pytań dotyczy przepełnienia stosu, prosząc o radę w przypadku zadań, które były niezwykle proste w winformach?

Nie zrozumcie mnie źle - dostaję MVVM i to, jak może być nieocenione dla dużych zespołów zajmujących się horyzontalnym opracowywaniem pakowanego i sprzedawanego oprogramowania. Jednostki testujące modele widoku mogłyby zaoszczędzić miliony, unikając poważnego błędu RTM, a dedykowani programiści interfejsu użytkownika mogliby zapewnić bogate doświadczenie. Ale kiedy koszt ponownej instalacji jest minimalny, a wszystko, za co firma musi zapłacić, to proste działające oprogramowanie, dlaczego miałbym spędzać czas na testowaniu prostej maszyny wirtualnej, gdy moja logika biznesowa jest już testowana jednostkowo? Ile czasu naprawdę pozwoli mi spędzić biznes na uroczych animacjach i schematach kolorów? Czy jest coś do zrobienia dla młodszego programisty (wyśledzenie błędu w funkcji składowania używanej do przeglądania „Save_Click”,

Trzeba przyznać, że bardzo podoba mi się wiązanie danych WPF. Aby z tego skorzystać, ustawiam kontekst danych na samo okno, w którym ma on dostęp do klasy biznesowej, a także wszelkich innych obserwowalnych właściwości. Tak, łamię prawie każdą „zasadę” MVVM, robiąc to. Ale przynajmniej mam prosty kod sterowany zdarzeniami, który jest łatwy do odczytania ORAZ mogę skorzystać z nowego wiązania danych i sprawdzania poprawności. Problem tkwi w projektantach - których nie używam aż tak wiele, ale mam nadzieję, że do tej pory będą lepiej zintegrowane w 2012 roku - projektant pokazuje setki właściwości okna i jego podstawowych klas.

Dla tych, którzy mogą się odnosić, możesz wskazać mi zasoby, książki, a nawet tylko zmiany perspektywy, które ułatwiłyby to przełknięcie. Dam MVVM kolejny zastrzyk, ale ostatnim razem czułem się dość głupio, że martwiłem się o wstrzyknięcie zależności tylko po to, aby wyświetlić okno komunikatu z maszyny wirtualnej, nie miałem zamiaru testować jednostki. Nawet jeśli przeprowadziłem test jednostkowy, czy naprawdę uzyskujemy lepszą jakość, handlując testami wykonawczymi w poszukiwaniu błędów czasu kompilacji tych przerażających „ściśle powiązanych” aplikacji?

Zdaję sobie sprawę, że jedną odpowiedzią jest pozostanie w winformach. Ale jako jeden z ostatnich zwolenników WebForms (mam taką samą krytykę trendu tworzenia stron internetowych), poczułem się trochę jak dinozaur, kiedy to odkryłem, że nie ma już WebFormów na ścieżkach certyfikacyjnych Microsoft. Poruszanie się do przodu jest jedyną opcją, nawet jeśli mi się nie podoba.

b_levitt
źródło
1
Chociaż nie zachęcam, nadal można napisać aplikację WPF w stylu WinForms ze zdarzeniami i kodem z tyłu. W przypadku prostych jednorazowych aplikacji nie jest to wielka sprawa. Wszystko sprowadza się do tego, co cenisz i co stanowi wartość dla firmy. Jestem wielkim fanem TDD i MVVM, ale jeśli to naprawdę nie zapewnia wartości, nie rób tego. To nie jest religia. Pamiętaj tylko, że kod często żyje znacznie dłużej, niż nam się wydaje.
Matt H
„Czy nikomu innemu nie jest to dziwne, gdy ludzie omawiają długie„ zastrzyki zależności ”i„ dostawców wiadomości ”dla Windows. Rozmowa ShowDialog, która istnieje już od dziesięcioleci?” Uważam to za irytujące, ale osoba, która się tym zajmuje (na szkodę faktycznego zrobienia czegokolwiek) zawsze była częścią tej dziedziny i, niestety, prawdopodobnie zawsze będzie. Najlepszą strategią jest ich ignorowanie / rozpraszanie w jak największym stopniu.
user1172763

Odpowiedzi:

10

Z mojego punktu widzenia mam wieloletnie doświadczenie w pracy z Winforms, „staromodnym sposobem”, z wydarzeniami i kodem. Mogę więc powiedzieć z absolutną pewnością, że kiedy wyjdziesz poza najprostsze aplikacje, twój kod szybko stanie się wielką kulą błota . Było to nieuniknione, ponieważ wtedy tak pisano aplikacje.

Formularze internetowe są takie same, z tą różnicą, że stanowią dodatkową komplikację polegającą na stanowej abstrakcji nad systemem bezstanowym (siecią). Jak ujął to Rob Conery:

WebForms to kłamstwo. To abstrakcja owinięta oszustwem w sosie do kłamstwa, przedstawiona na talerzu pełnym urozmaicenia i sztuczki ręki. Nic, co robisz z formularzami internetowymi, nie ma nic wspólnego z siecią - pozwalasz, aby działała za Ciebie.

To, od faceta, który napisał w pełni funkcjonalny obiektowo-mapujący obiekt przy użyciu dynamicsłowa kluczowego w języku C # i tylko czterystu wierszy kodu. Kiedy mówi o czymś autorytatywnie, słucham.

Aplikacja, nad którą obecnie pracuję, to aplikacja Winforms z kilkoma zakładkami w głównej formie. Mogę dynamicznie ładować formularze do każdej karty. Chociaż nie śledziłem MVVM ani MVP (możesz to zrobić przy bibliotekach takich jak ta ), agresywnie wypychałem każdy fragment kodu, jaki mogłem, do osobnego zestawu, pozostawiając tylko ten kod, który jest absolutnie wymagany do uruchomienia formularza. Wciąż jest tam kilkaset wierszy kodu, nie licząc częściowej klasy zawierającej definicje kontrolne formularza, właściwości i przypisania procedur obsługi zdarzeń, ale nie powinienem nigdy więcej go dotykać, chyba że muszę dodać coś nowego do formularza.

Mam metodę statyczną, w której mogę przekazać formularz i kolekcje par Klucz / Wartość, i to (przy użyciu Odbicia) automatycznie dopasuje klucze do pól w formularzu i wypełni formularz z wartościami kolekcji. Mogę również zrobić odwrotnie, uzyskując kolekcję par klucz / wartość z pól formularza. Cała ta rzecz ma około dwudziestu wierszy kodu, ale zwraca się za każdym razem, gdy go używam, ponieważ nie muszę pisać czterdziestu niestandardowych instrukcji przypisania dla czterdziestu formantów w formularzu.

Mogę wziąć tę listę kluczy / wartości i przekształcić do postaci szeregowej w formacie XML, co pozwala mi zachować ją w pliku. Mam inne formularze, które mogę przekazać konwencjonalnemu DTO i mapować jego pola na formularz. Nic z tego nie byłoby praktyczne w stylu Winforms typu „duża kula błota”. Jest to prawie banalne, gdy stosuje się odpowiednie oddzielenie.

Czy coś z tego brzmi znajomo? Powinno; jest to zasadniczo forma powiązania danych przez biedaka.

Trzeba przyznać, że bardzo podoba mi się wiązanie danych WPF. Aby z tego skorzystać, ustawiam kontekst danych na samo okno, w którym ma on dostęp do klasy biznesowej, a także wszelkich innych obserwowalnych właściwości.

Dobrze dla ciebie. Nie musi być zgodny z MVVM. Pamiętaj jednak, że wzorce takie jak MVVM zostały stworzone, aby pomóc programistom w tworzeniu dużych systemów. Jeśli chcesz tylko wyświetlić okno dialogowe, możesz nie potrzebować całej tej hydrauliki.

Część złożoności systemów takich jak WPF jest nieodłączna we wszystkich bibliotekach programistów, które starają się rozwiązać konkretny problem w uogólniony sposób. Aby to zrobić, musisz wziąć pod uwagę każdy praktyczny sposób, w jaki programista może korzystać z twojej biblioteki. To dodaje złożoności, ale dla tych, którzy dobrze projektują swoje biblioteki, przedstawia także filozofię robienia rzeczy w jednolity i konsekwentny sposób.

Zastanów się nad biblioteką jQuery Johna Resiga: jest to esencja spójnego projektu i kryje w sobie wiele dziwnych szczegółów na temat DOM oraz różnych sposobów, w jakie obsługują go przeglądarki. Czy łatwiej jest napisać kilka wierszy Javascript? Czasami. Ale korzyść z pisania kodu jQuery w spójnym, jednolitym interfejsie API ułatwia kolejnej osobie, która przyjdzie, zrozumieć, co zrobiłeś i zachować ten kod, jeśli to konieczne.

Moje prawdziwe doświadczenie z modelami „dużych aplikacji” polega na korzystaniu z ASP.NET MVC. ASP.NET jest do ASP.NET MVC, podobnie jak Winforms do WPF. Kiedy pracowałem w ASP.NET, zawsze starałem się nagiąć go do mojej woli. ASP.NET MVC zgina się do ciebie. Korzystanie z radości; tworzy przejrzystą i uporządkowaną strukturę systemu oraz daje pełną kontrolę nad aplikacją i znacznikami. Możesz swobodnie korzystać z Javascript, jQuery i CSS, a ASP.NET MVC nie przeszkadza.

Moją jedyną przeszkodą było przyzwyczaić się i poznać to na własnych warunkach.

Dalsza lektura
Powinieneś nauczyć się MVC Roba Conery'ego

Robert Harvey
źródło
Dziękuję za naprawdę przemyślaną odpowiedź wielką kulę błota - zdecydowanie czułem się tak w czasach klasycznego bolenia i kodu spaghetti. 3-warstwowy projekt z vb6 / mts naprawił wiele z tego, a następnie wydanie .net połączyło to wszystko. Ale teraz, jeśli czujesz, że zwrot z dodatkowych wzorów szybko się zmniejsza - jak na przykład wydanie 1 miliona dolarów, aby zaoszczędzić 1 sek. „Agresywnie wypychałem każdy fragment kodu, który mogłem wydostać do osobnego zestawu” - czy nie uważasz, że daje to niesamowicie zepsute doświadczenie programistyczne - ciągłe przeskakiwanie z pliku do pliku, aby odczytać dwie linie?
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?- Nie, jest odwrotnie. Umieszczenie innego zestawu takiego jak ten uwalnia umysł do skupienia się na każdej klasie i metodzie na własnych warunkach, jak na własnej małej czarnej skrzynce. To bardzo trudne z dużą kulą błota. MVC działa na tej samej zasadzie: cienkie kontrolery, model tłuszczu, brak kodu w widoku, chyba że jest to absolutnie konieczne.
Robert Harvey
3
Yagni ma zastosowanie tylko wtedy, gdy sam piszesz kod. Jeśli piszesz uogólnioną bibliotekę, która musi zaspokoić szerokie grono odbiorców o różnych potrzebach, będziesz jej potrzebować.
Robert Harvey
1
Nawiasem mówiąc, nie mam nic przeciwko cyklowi życia ASP.NET; Widziałem, jak ludzie używają go do doskonałego efektu. Uważam, że to sprzeczne z intuicją, to wszystko. ASP.NET MVC nie zmusza Cię do tworzenia oprogramowania po stronie klienta, jeśli nie chcesz; możesz użyć „głupich” widoków i działa idealnie dobrze. Warto zauważyć: wiele z tych rzeczy może być generowanych przez kod (podobnie jak formularz Windows), więc to nie tak, że sam piszesz cały kod. Rozumiem, że jest to mniej prawdziwe w przypadku WPF, gdzie masz do czynienia z XAML, i myślę, że jest tam miejsce na ulepszenia.
Robert Harvey
2
dozens of lines of plumbing to replace Window.Show- To trochę za duże uproszczenie. Jeśli okno potrzebuje danych, zawsze będzie jakiś rodzaj hydrauliki, aby wprowadzić te dane do elementów sterujących okna i odwrotnie. Możesz albo powtarzać ten kod w kółko dla każdej tworzonej formy, albo zastosować jakąś formę uogólnionego rozwiązania, takiego jak wiązanie danych.
Robert Harvey