Valore di MVVM in un'applicazione Line of Business (e un Rant of Current Development Practices)

9

Dopo 2 anni, sto ancora lottando con MVVM come metodo pratico per produrre software funzionante. In alcuni casi è fantastico. Ho fatto un'applicazione multithread che controllava una piccola catena di montaggio che sarebbe stata una notte senza concetti MVVM. Un'astrazione dalla catena di montaggio fisica era quasi un gioco da ragazzi.

Tuttavia, la mia carriera ruota principalmente attorno alla linea di applicazioni aziendali interne - formalizzando e ottimizzando le operazioni di un'azienda. In tali app, c'è in generale un business teir che ruota attorno a CRUD e operazioni composte. In LOB, i miei modelli di vista finiscono per essere una raccolta molto semplice di funzioni di wrapper di una riga dei metodi della classe business e alla fine finiscono per complicare le attività più semplici come mostrare una finestra di messaggio o aprire una finestra. Qualcun altro non lo trova strano quando le persone si iscrivono a lunghe descrizioni di "dipendenza da iniezione" e "fornitori di messaggi" per una chiamata a Window.ShowDialog che esiste da decenni? Quante altre domande ci sono sull'overflow dello stack chiedendo consigli per attività estremamente semplici in winforms?

Non fraintendetemi: ricevo MVVM e come potrebbe essere inestimabile per i grandi team fare lo sviluppo orizzontale di un pacchetto software confezionato e commercializzato. L'unità di test dei modelli di visualizzazione potrebbe risparmiare milioni evitando un bug di RTM errato e gli sviluppatori di UI dedicati potrebbero offrire un'esperienza ricca. Ma quando il costo della ridistribuzione è minimo e tutte le aziende si preoccupano di pagare è un semplice software funzionante, perché dovrei passare il tempo a testare un'unità un semplice vm "wrapper" quando la mia logica aziendale è già testata? Quanto tempo mi permetterò davvero di spendere su animazioni e combinazioni di colori carini? C'è ancora qualcosa da fare per uno sviluppatore junior (rintracciare un bug in una funzionalità di salvataggio usata per guardare "Save_Click", ma ora devi capire i pattern e il progetto nel suo insieme soprattutto se ti affidi ai template per sposare la VM con la vista).

Certo, mi piace molto il database di WPF. Per approfittarne, imposto il contesto dei dati alla finestra stessa, dove ha accesso alla classe business e alle altre proprietà osservabili. Sì, interrompo quasi ogni "regola" MVVM facendo così. Ma almeno ho un semplice codice basato su eventi che è facile da leggere E posso trarre vantaggio dal nuovo database e dalla convalida. Il problema è nei designer - che non uso molto ma spero che ora sia integrato meglio nel 2012 - il designer mostra le centinaia di proprietà che hanno una finestra e le sue classi base.

Per quelli che possono riguardare puoi indicarmi risorse, libri o anche solo cambiamenti di prospettiva che rendano questo più facile da digerire. Darò un'altra volta a MVVM, ma l'ultima volta mi sono sentito piuttosto stupido a preoccuparmi dell'iniezione di dipendenza solo per mostrare una finestra di messaggio da una VM che non avevo intenzione di testare le unità. Anche se facessi un test unitario, otteniamo davvero più qualità scambiando test di run time per errori di compilazione di quelle temute applicazioni "strettamente accoppiate"?

Mi rendo conto che una risposta è rimanere semplicemente in winforms. Ma come uno degli ultimi sostenitori di WebForms (ho molta della stessa critica alla tendenza dello sviluppo del web), mi sono sentito un po 'come un dinosauro, perché quando ho scoperto non ci sono più WebForm nelle tracce delle certificazioni Microsoft. Andare avanti è l'unica opzione, anche se non mi piace.

    
posta b_levitt 31.05.2013 - 02:24
fonte

1 risposta

9

La mia prospettiva deriva da anni di esperienza nel lavorare con Winforms, il "vecchio stile", con eventi e code-behind. Quindi posso dirti con assoluta certezza che, una volta superato il più semplice delle applicazioni, il tuo codice diventa rapidamente una grande palla di fango . Era inevitabile, perché è così che sono state scritte le applicazioni allora.

Webforms è lo stesso, tranne che getta nell'ulteriore complicazione di essere un'astrazione di stato su un sistema senza stato (il web). Come ha detto Rob Conery:

WebForms is a lie. It’s abstraction wrapped in deception covered in lie sauce presented on a plate full of diversion and sleight of hand. Nothing you do with Webforms has anything to do with the web – you let it do the work for you.

Questo, dal ragazzo che ha scritto un mapper relazionale oggettuale completamente funzionale usando la parola chiave dynamic in C # e solo quattrocento linee di codice. Quando parla autorevolmente di qualcosa, ascolto.

L'applicazione a cui sto lavorando è un'applicazione Winforms, con diverse schede nel modulo principale. Posso caricare dinamicamente i moduli in ognuna delle schede. Sebbene non abbia seguito MVVM o MVP (è possibile, con librerie come questo ), ho fatto push aggressivo su ogni bit di codice I potrebbe uscire in un assembly separato, lasciando solo quel codice che è assolutamente necessario per eseguire il modulo. Esistono ancora diverse centinaia di righe di codice, senza contare la classe parziale contenente le definizioni di controllo, le proprietà e le assegnazioni del gestore di eventi del modulo, ma non dovrei mai più toccarla, a meno che non debba aggiungere qualcosa di nuovo al modulo.

Ho un metodo statico che posso distribuire un form e una collezione di coppie chiave / valore, e (usando Reflection) abbinerà automaticamente le chiavi ai campi nel modulo e popolerà il modulo con i valori della collezione . Posso anche fare il contrario, ottenere una collezione di coppie chiave / valore dai campi del modulo. Tutta questa faccenda è di circa venti righe di codice, ma si ripaga da sola ogni volta che la uso, perché non devo scrivere quaranta istruzioni di assegnazione personalizzate per quaranta controlli su un modulo.

Posso prendere quell'elenco Chiave / Valore e serializzarlo su XML, permettendomi di conservarlo su un file. Ho altre forme che posso dare un DTO convenzionale e mappare i suoi campi al modulo. Niente di tutto ciò sarebbe pratico nello stile "big ball of mud" di Winforms. È quasi banale quando viene utilizzato un adeguato disaccoppiamento.

Qualcuno di questo suona familiare? Dovrebbe; è essenzialmente una forma di associazione dei dati di un povero uomo.

Admittedly, I really like the databinding of WPF. To take advantage of it, I set the data context to the window itself, where it has access to the business class as well as any other observable properties.

Buono per te. Non deve essere conforme a MVVM. Ma ricorda, modelli come MVVM sono stati creati per aiutare gli sviluppatori a creare grandi sistemi. Se hai solo bisogno di visualizzare una finestra di dialogo, potresti non aver bisogno di tutto questo impianto idraulico.

Parte della complessità di sistemi come WPF è inerente a tutte le librerie di programmatori che cercano di risolvere un problema specifico in modo generalizzato. Per fare ciò, devi tenere conto di ogni modo pratico di un programmatore potrebbe usare la tua libreria. Ciò aggiunge complessità, ma per coloro che progettano bene le loro librerie, porta anche in tavola una filosofia di fare le cose in modo uniforme e coerente.

Considera la libreria jQuery di John Resig: è l'essenza stessa di un progetto coerente e nasconde molti dettagli strani sul DOM e variazioni nel modo in cui i browser gestiscono il problema. È più semplice scrivere poche righe di Javascript? Qualche volta. Ma il vantaggio di scrivere codice jQuery in un'API coerente e uniforme rende più facile per la prossima persona che arriva capire quello che hai fatto e mantenere quel codice se necessario.

La mia esperienza reale con i modelli "big application" sta nell'utilizzo di ASP.NET MVC. ASP.NET è in ASP.NET MVC come Winforms è in WPF. Quando lavoravo in ASP.NET, ho sempre faticato a piegarlo alla mia volontà. ASP.NET MVC si piega a te. È una gioia da usare; produce una struttura di sistema che è chiara e organizzata e ti dà il pieno controllo sull'applicazione e sul markup. Puoi usare Javascript, jQuery e CSS liberamente e ASP.NET MVC ti toglie di mezzo.

Il mio unico ostacolo ci si stava abituando, e ho imparato a conoscerlo alle sue condizioni.

Ulteriori letture
Dovresti imparare MVC di Rob Conery

    
risposta data 31.05.2013 - 06:50
fonte

Leggi altre domande sui tag