Valore di MVVM in una linea di applicazioni aziendali (e una serie di pratiche di sviluppo correnti)


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 nightmere 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 interna di applicazioni aziendali - formalizzando e ottimizzando le operazioni di un'azienda. In tali app, esiste generalmente un'impresa che ruota attorno al CRUD e alle operazioni complesse. Nei LOB, i miei modelli di vista finiscono per essere una raccolta molto semplice di funzioni di un line wrapper dei metodi della classe business e alla fine complicano solo le attività più semplici come mostrare una finestra di messaggio o aprire una finestra. Nessun altro trova strano quando le persone fanno lunghe descrizioni di "iniezione di dipendenza" e "provider di messaggistica" per una chiamata Window.ShowDialog che esiste da decenni? Quante altre domande ci sono sullo stack di overflow che richiedono consigli per attività estremamente semplici nelle winform?

Non fraintendetemi: ottengo MVVM e come potrebbe essere prezioso per i team di grandi dimensioni che svolgono lo sviluppo orizzontale di un pacchetto software ridotto e commercializzato. I test unitari dei modelli di visualizzazione potrebbero salvare milioni evitando un cattivo bug RTM e sviluppatori di UI dedicati potrebbero offrire una ricca esperienza. Ma quando il costo della ridistribuzione è minimo e tutto ciò che l'azienda si preoccupa di pagare è un semplice software funzionante, perché dovrei dedicare del tempo all'unità di test di un semplice "wrapper" quando la mia logica aziendale è già testata dall'unità? Quanto tempo mi permetterà davvero di dedicarmi a animazioni e combinazioni di colori carine? C'è ancora qualcosa da fare per uno sviluppatore junior (rintracciare un bug in una funzionalità di salvataggio utilizzata per guardare "Save_Click",

Certo, mi piace molto il databinding di WPF. Per trarne vantaggio, ho impostato il contesto dei dati sulla finestra stessa, dove ha accesso alla business class e a qualsiasi altra proprietà osservabile. Sì, infrangendo quasi tutte le "regole" di MVVM così facendo. Ma almeno ho un semplice codice guidato dagli eventi che è facile da leggere E posso sfruttare il nuovo database e la convalida. Il problema è nei progettisti - che non uso molto, ma spero che ora sia meglio integrato nel 2012 - il progettista mostra le centinaia di proprietà di una finestra e delle sue classi base.

Per quelli che possono relazionarmi, puoi indicarmi risorse, libri o anche solo cambiamenti di prospettiva che hanno reso più facile la deglutizione. Darò un'altra possibilità a MVVM, ma l'ultima volta mi sono sentito piuttosto stupido per 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 ho fatto il test unitario stiamo davvero ottenendo più qualità scambiando i test di runtime per errori di compilazione di quelle temute applicazioni "strettamente accoppiate"?

Mi rendo conto che una risposta è semplicemente rimanere in winform. Ma come uno degli ultimi sostenitori di WebForms (ho più o meno la stessa critica della tendenza dello sviluppo del web), mi sono sentito un po 'come un dinosauro come lo è quando ho scoperto che non sono rimasti più WebForms nelle tracce di certificazione Microsoft. Andare avanti è l'unica opzione, anche se non mi piace.


1
Anche se non lo incoraggio, è ancora possibile scrivere un'applicazione WPF in stile WinForms con eventi e codice dietro. Per le app una tantum semplici, non è un grosso problema. Dipende da cosa apprezzi e cosa apporta valore all'azienda. Sono un grande fan di TDD e MVVM, ma se davvero non fornisce valore, non farlo. Non è una religione. Ricorda solo che il codice spesso vive molto più a lungo di quanto pensiamo.
Matt H

"Nessun altro trova strano quando le persone fanno lunghe descrizioni di" iniezione di dipendenza "e" provider di messaggistica "per una chiamata Window.ShowDialog che esiste da decenni?" Lo trovo fastidioso, ma il tipo di persona che si preoccupa di tutto ciò (a scapito di fare qualsiasi cosa) ha sempre fatto parte del campo e, sfortunatamente, probabilmente lo farà sempre. La migliore strategia è ignorarli / distrarli il più possibile.
user1172763,

Risposte:


10

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

I moduli Web sono gli stessi, tranne per il fatto che si aggiunge la complicazione aggiuntiva di essere un'astrazione con stato su un sistema senza stato (il web). Come diceva Rob Conery:

WebForms è una bugia. È un'astrazione avvolta in un inganno coperto di salsa bugia presentata su un piatto pieno di diversione e gioco di prestigio. Nulla di ciò che fai con i Webform ha nulla a che fare con il web: lasci che faccia il lavoro per te.

Questo, dal ragazzo che ha scritto un mappatore relazionale di oggetti completamente funzionale usando la dynamicparola chiave in C # e solo quattrocento righe di codice. Quando parla autorevolmente di qualcosa, ascolto.

L'applicazione a cui sto attualmente lavorando è un'applicazione Winforms, con diverse schede nel modulo principale. Posso caricare dinamicamente i moduli in ciascuna delle schede. Anche se non ho seguito MVVM o MVP (è possibile, con librerie come questa ), ho spinto in modo aggressivo ogni bit di codice che potevo in un assembly separato, lasciando solo quel codice che è assolutamente necessario per eseguire il modulo. Ci sono ancora diverse centinaia di righe di codice lì dentro, senza contare la classe parziale che contiene le definizioni di controllo del modulo, le proprietà e le assegnazioni del gestore eventi, ma non dovrei mai toccarlo di nuovo, a meno che non sia necessario aggiungere qualcosa di nuovo al modulo.

Ho un metodo statico che posso consegnare un modulo e una raccolta di coppie chiave / valore e (usando Reflection) abbinerà automaticamente le chiavi ai campi nel modulo e popolerà il modulo con i valori della raccolta. Posso anche fare il contrario, ottenendo una raccolta di coppie chiave / valore dai campi del modulo. L'intera cosa è composta da una ventina di 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 insistere su un file. Ho altre forme che posso consegnare 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 disaccoppiamento adeguato.

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

Certo, mi piace molto il databinding di WPF. Per trarne vantaggio, ho impostato il contesto dei dati sulla finestra stessa, dove ha accesso alla business class e a qualsiasi altra proprietà osservabile.

Buon per te. Non deve essere conforme a MVVM. Ma ricorda, modelli come MVVM sono stati creati per aiutare gli sviluppatori a costruire 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 del programmatore che cercano di risolvere un problema specifico in modo generalizzato. Per fare ciò, devi tenere conto di tutti i modi pratici in cui un programmatore potrebbe usare la tua libreria. Ciò aggiunge complessità, ma per coloro che progettano bene le loro biblioteche, porta anche in tavola una filosofia di fare le cose in modo uniforme e coerente.

Considera la libreria jQuery di John Resig: è l'essenza di un design coerente e nasconde molti strani dettagli sul DOM e le variazioni nel modo in cui i browser lo gestiscono. È più semplice scrivere solo poche righe di Javascript? Qualche volta. Ma il vantaggio di scrivere il codice jQuery in un'API coerente e uniforme rende più facile per la persona successiva che viene a capire cosa hai fatto e mantenerlo se necessario.

La mia vera esperienza con i modelli di "grandi applicazioni" è nell'uso di ASP.NET MVC. ASP.NET è ASP.NET MVC come Winforms è WPF. Quando lavoravo in ASP.NET, facevo sempre fatica a piegarlo alla mia volontà. ASP.NET MVC si piega a te. È una gioia da usare; produce una struttura di sistema chiara e organizzata e ti dà il pieno controllo sulla tua applicazione e markup. È possibile utilizzare Javascript, jQuery e CSS liberamente e ASP.NET MVC rimane fuori dai piedi.

Il mio unico ostacolo era abituarmi e conoscerlo alle sue condizioni.

Ulteriori letture
dovresti imparare MVC da Rob Conery


Grazie per la risposta davvero pensierosa, grande palla di fango - mi sono sicuramente sentita così ai tempi del classico codice asp e spaghetti. Il design a 3 livelli con vb6 / mts ha risolto gran parte di ciò, quindi il rilascio di .net ha messo tutto insieme. Ma ora se senti che i ritorni su ulteriori schemi si stanno rapidamente esaurendo, come spendere $ 1 milione per impiegare 0,1 secondi dal tuo quarto di miglio. "Ho spinto in modo aggressivo ogni bit di codice che ho potuto passare a un assembly separato" - non trovi che questo dia un'esperienza di sviluppo incredibilmente fratturata - saltando costantemente da un file all'altro per leggere due righe?
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?- No, è il contrario. Mettere in un altro assemblaggio come questo libera la mente di concentrarsi su ogni classe e metodo alle proprie condizioni, come la sua piccola scatola nera. È molto difficile da fare con una grande palla di fango. MVC funziona secondo lo stesso principio: controller sottili, modello fat, nessun codice nella vista se non assolutamente necessario.
Robert Harvey,

3
Yagni si applica solo quando scrivi il codice da solo. Se stai scrivendo una biblioteca generalizzata che deve soddisfare un vasto pubblico con esigenze diverse, ne avrai bisogno.
Robert Harvey,

1
A proposito, non ho nulla contro il ciclo di vita di ASP.NET; Ho visto le persone usarlo con risultati eccellenti. Lo trovo contro-intuitivo, tutto qui. ASP.NET MVC non ti obbliga a fare alcun sviluppo lato client, se non lo desideri; puoi usare viste "stupide" e funziona perfettamente. Vale la pena notare: molte di queste cose possono essere generate dal codice (proprio come un modulo di Windows), quindi non è come se stessi scrivendo tutto il codice da solo. Capisco che questo è meno vero con WPF, dove devi fare i conti con XAML, e penso che ci sia spazio per miglioramenti lì.
Robert Harvey,

2
dozens of lines of plumbing to replace Window.Show- È un po 'una semplificazione eccessiva. Se la finestra ha bisogno di dati, ci sarà sempre una sorta di impianto idraulico per ottenere quei dati nei controlli della finestra e viceversa. Puoi scrivere quel codice ripetitivo più e più volte per ogni modulo che crei, oppure utilizzare una qualche forma di soluzione generalizzata come l'associazione di dati.
Robert Harvey,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.