Nach 2 Jahren habe ich immer noch Probleme mit MVVM als praktischer Methode zur Herstellung funktionierender Software. In einigen Fällen ist es großartig. Ich habe eine Multithread-Anwendung erstellt, die eine kleine Montagelinie steuert, die ohne MVVM-Konzepte ein Albtraum gewesen wäre. Eine Abstraktion vom physischen Fließband war fast ein Kinderspiel.
Meine Karriere dreht sich jedoch hauptsächlich um interne Geschäftsanwendungen - die Formalisierung und Optimierung des Geschäftsbetriebs. In solchen Apps gibt es im Allgemeinen einen Geschäftsbereich, der sich um CRUD- und Compound-Operationen dreht. In LOBs sind meine Ansichtsmodelle eine sehr einfache Sammlung von Einzeilen-Wrapper-Funktionen der Business-Class-Methoden und erschweren letztendlich nur die einfachsten Aufgaben wie das Anzeigen eines Meldungsfelds oder das Öffnen eines Fensters. Findet es sonst niemand seltsam, wenn Leute für einen Window.ShowDialog-Aufruf, der seit Jahrzehnten existiert, lange Beschreibungen von "Abhängigkeitsinjektion" und "Messaging-Anbietern" lesen? Wie viele andere Fragen gibt es zum Stapelüberlauf, um Ratschläge für Aufgaben zu erhalten, die in Winforms extrem einfach waren?
Verstehen Sie mich nicht falsch - ich verstehe MVVM und wie es für große Teams von unschätzbarem Wert sein kann, wenn sie ein eingeschweißtes und vermarktetes Softwarepaket horizontal entwickeln. Durch Unit-Tests der Ansichtsmodelle könnten Millionen eingespart werden, indem ein schlechter RTM-Fehler vermieden wird, und engagierte Benutzeroberflächenentwickler könnten eine umfassende Erfahrung bieten. Aber wenn die Kosten für die erneute Bereitstellung minimal sind und das Unternehmen nur für einfach funktionierende Software bezahlen muss, warum sollte ich dann Zeit damit verbringen, einen einfachen "Wrapper" vm zu testen, wenn meine Geschäftslogik bereits einheitlich getestet wurde? Wie viel Zeit wird mir das Geschäft wirklich erlauben, um niedliche Animationen und Farbschemata zu verwenden? Gibt es noch etwas zu tun für einen Junior-Entwickler (Aufspüren eines Fehlers in einer Speicherfunktion, die früher unter "Save_Click" angezeigt wurde?
Zugegeben, ich mag die Datenbindung von WPF sehr. Um dies zu nutzen, setze ich den Datenkontext auf das Fenster selbst, in dem es Zugriff auf die Business Class sowie auf alle anderen beobachtbaren Eigenschaften hat. Ja, ich verstoße damit gegen fast jede MVVM- "Regel". Aber zumindest habe ich einfachen ereignisgesteuerten Code, der leicht zu lesen ist UND ich kann die neue Datenbindung und Validierung nutzen. Das Problem liegt bei den Designern - die ich nicht allzu oft benutze, aber bis jetzt hoffe, dass sie 2012 besser integriert werden - zeigt der Designer die Hunderte von Eigenschaften, die ein Fenster und seine Basisklassen haben.
Für diejenigen, die sich darauf beziehen können, können Sie mich auf Ressourcen, Bücher oder auch nur auf Perspektivwechsel verweisen, die das Schlucken erleichtert haben. Ich werde MVVM noch einmal ausprobieren, aber das letzte Mal, als ich mich ziemlich dumm fühlte, weil ich mir Sorgen über die Abhängigkeitsinjektion gemacht habe, nur um ein Meldungsfeld von einer VM zu zeigen, hatte ich nicht die Absicht, Unit-Tests durchzuführen. Selbst wenn ich einen Unit-Test durchgeführt habe, erhalten wir dann wirklich mehr Qualität, indem wir Laufzeit-Tests gegen Kompilierungsfehler dieser gefürchteten "eng gekoppelten" Anwendungen eintauschen?
Mir ist klar, dass eine Antwort darin besteht, einfach in Winforms zu bleiben. Aber als einer der letzten Unterstützer von WebForms (ich habe fast die gleiche Kritik am Trend der Webentwicklung) fühlte ich mich ein wenig wie ein Dinosaurier, als ich entdeckte, dass in den Microsoft-Zertifizierungsspuren keine WebForms mehr vorhanden sind. Vorwärts zu kommen ist die einzige Option, auch wenn es mir nicht gefällt.
Antworten:
Meine Perspektive ist aus jahrelanger Erfahrung in der Arbeit mit Winforms, der "altmodischen Art", mit Ereignissen und Code-Behind. Daher kann ich Ihnen mit absoluter Sicherheit sagen, dass Ihr Code schnell zu einem großen Schlammballen wird, sobald Sie die einfachsten Anwendungen überwunden haben . Es war unvermeidlich, denn so wurden damals Bewerbungen geschrieben.
Webforms ist genauso, außer dass es die zusätzliche Komplikation einer zustandsbehafteten Abstraktion über ein zustandsloses System (das Web) mit sich bringt. Wie Rob Conery es ausdrückte:
Dies von dem Typ, der einen voll funktionsfähigen objektrelationalen Mapper mit dem
dynamic
Schlüsselwort in C # und nur vierhundert Codezeilen geschrieben hat. Wenn er maßgeblich über etwas spricht, höre ich zu.Die Anwendung, an der ich gerade arbeite, ist eine Winforms-Anwendung mit mehreren Registerkarten im Hauptformular. Ich kann Formulare dynamisch in jede der Registerkarten laden. Obwohl ich MVVM oder MVP nicht gefolgt bin (mit Bibliotheken wie dieser ), habe ich jeden Code, den ich konnte, aggressiv auf eine separate Assembly übertragen und nur den Code belassen, der zum Ausführen des Formulars unbedingt erforderlich ist. Es sind noch mehrere hundert Codezeilen enthalten, wobei die Teilklasse mit den Steuerelementdefinitionen, Eigenschaften und Ereignisbehandlungszuweisungen des Formulars nicht berücksichtigt wird. Ich sollte sie jedoch nie wieder berühren müssen, es sei denn, ich muss dem Formular etwas Neues hinzufügen.
Ich habe eine statische Methode, mit der ich ein Formular und eine Sammlung von Schlüssel / Wert-Paaren übergeben kann. Mit Reflection werden die Schlüssel automatisch mit den Feldern im Formular abgeglichen und das Formular mit den Werten der Sammlung gefüllt. Ich kann auch umgekehrt vorgehen und eine Sammlung von Schlüssel / Wert-Paaren aus den Feldern des Formulars abrufen. Das Ganze besteht aus ungefähr zwanzig Codezeilen, aber es zahlt sich jedes Mal aus, wenn ich es verwende, da ich nicht vierzig benutzerdefinierte Zuweisungsanweisungen für vierzig Steuerelemente in einem Formular schreiben muss.
Ich kann diese Schlüssel- / Werteliste in XML serialisieren, um sie in einer Datei zu speichern. Ich habe andere Formulare, mit denen ich ein herkömmliches DTO übergeben und seine Felder dem Formular zuordnen kann. Nichts davon wäre im "Big Ball of Mud" -Stil von Winforms praktisch. Es ist fast trivial, wenn eine angemessene Entkopplung verwendet wird.
Kommt Ihnen das bekannt vor? Es sollte; Es ist im Wesentlichen die Form der Datenbindung eines armen Mannes.
Schön für dich. Es muss nicht MVVM-kompatibel sein. Denken Sie jedoch daran, dass Muster wie MVVM erstellt wurden, um Entwicklern beim Aufbau großer Systeme zu helfen . Wenn Sie nur einen Dialog anzeigen müssen, benötigen Sie möglicherweise nicht die gesamte Installation.
Ein Teil der Komplexität von Systemen wie WPF ist allen Programmierbibliotheken eigen, die versuchen , ein bestimmtes Problem allgemein zu lösen. Dazu müssen Sie alle praktischen Möglichkeiten berücksichtigen, mit denen ein Programmierer Ihre Bibliothek verwenden kann. Das erhöht die Komplexität, aber für diejenigen, die ihre Bibliotheken gut gestalten, bringt es auch die Philosophie auf den Tisch, Dinge auf einheitliche und konsistente Weise zu tun.
Betrachten Sie die jQuery-Bibliothek von John Resig: Sie ist die Essenz eines kohärenten Designs und verbirgt viele seltsame Details über das DOM und Variationen in der Art und Weise, wie Browser damit umgehen. Ist es einfacher, nur ein paar Zeilen Javascript zu schreiben? Manchmal. Der Vorteil des Schreibens von jQuery-Code in einer kohärenten, einheitlichen API erleichtert es der nächsten Person, zu verstehen, was Sie getan haben, und diesen Code bei Bedarf zu pflegen.
Meine wirkliche Erfahrung mit "Big Application" -Modellen ist die Verwendung von ASP.NET MVC. ASP.NET ist für ASP.NET MVC wie Winforms für WPF. Wenn ich in ASP.NET arbeitete, hatte ich immer Mühe, es meinem Willen anzupassen. ASP.NET MVC beugt sich zu Ihnen. Es ist eine Freude zu benutzen; Es erzeugt eine Systemstruktur, die klar und organisiert ist und Ihnen die volle Kontrolle über Ihre Anwendung und Ihr Markup gibt. Sie können Javascript, jQuery und CSS großzügig verwenden, und ASP.NET MVC steht Ihnen nicht im Weg.
Meine einzige Hürde bestand darin, mich daran zu gewöhnen und es auf eigene Faust kennenzulernen.
Weiterführende
Literatur Sie sollten MVC von Rob Conery lernen
quelle
don't you find that this gives an incredibly fractured development experience - constantly jumping from file to file to read two lines?
- Nein, es ist das Gegenteil. Wenn Sie eine andere Versammlung wie diese einsetzen, können Sie sich auf jede Klasse und Methode zu ihren eigenen Bedingungen konzentrieren, als ihre eigene kleine Black Box. Das ist sehr schwer mit einem großen Schlammball zu machen. MVC arbeitet nach dem gleichen Prinzip: Thin Controller, Fat Model, kein Code in der Ansicht, sofern dies nicht unbedingt erforderlich ist.dozens of lines of plumbing to replace Window.Show
- Das ist ein bisschen zu einfach. Wenn die Fensterdaten benötigt, es geht zu immer einige Art von Sanitär , dass die Daten in das Fenster der Kontrollen zu erhalten, und vice versa. Sie können diesen sich wiederholenden Code entweder für jedes von Ihnen erstellte Formular immer wieder schreiben oder eine allgemeine Lösung wie die Datenbindung verwenden.