2010-03-15 22 views
7

Sto lavorando a un'applicazione WPF e lo sto strutturando utilizzando il pattern MVVM. Inizialmente ho avuto l'idea che i ViewModels dovrebbero essere riutilizzabili, ma ora non ne sono più sicuro.Come riutilizzabili dovrebbero essere le classi ViewModel?

  • Devo essere in grado di riutilizzare il mio ViewModels se ho bisogno di funzionalità simili per un'applicazione WinForms?
  • Silverlight non supporta tutte le cose che WPF fa - dovrei essere in grado di riutilizzare per le applicazioni Silverlight?
  • E se volessi creare una GUI Linux per la mia applicazione. Quindi ho bisogno del ViewModel per costruire in Mono - è questo qualcosa per cui dovrei lottare?
  • E così via ..

Così; si dovrebbe scrivere classi ViewModel con una Vista specifica in mente, o pensare alla riusabilità?

+0

Questa è una vecchia domanda, ma [la risposta da MSDN] (https://msdn.microsoft.com/en-us/library/hh563947 (v = vs.110) .aspx) è molto chiara (e contraria a tutte le risposte pubblicate di seguito): ViewModel è concepito in modo specifico per essere condiviso da molte visualizzazioni su vari SO. Fare altrimenti porterebbe inevitabilmente al codice ridondante. – kmote

risposta

12

Per rispondere alla tua domanda, pensare solo principio di responsabilità: "Una classe dovrebbe avere uno, e solo uno , motivo di cambiare"

Direi, entro limiti ragionevoli, che in genere non si desidera riutilizzare un ViewModel per più viste. Il motivo principale per cui discuto di questo, è perché ciò darebbe al ViewModel più di un motivo per cambiare. In altre parole, dovrebbe cambiare se cambia l'una o l'altra vista e, secondo me, sono due i motivi per cambiare. Dove si ferma? In questo caso lo terrei semplice e leghiamo un ViewModel alla vista.

Un'altra cosa a cui pensare con MVVM con WPF è Data Templating. È molto più facile da realizzare se ogni ViewModel si rivolge a una sola vista.

+0

Sono assolutamente d'accordo. E questo è un argomento eccellente! – stiank81

3

In generale, applica il principio YAGNI - probabilmente non ne avrai bisogno. A meno che tu possa vedere queste cose come potenzialmente accadendo, terrei con l'approccio più semplice per far funzionare il tuo software per i requisiti che hai attualmente.

+0

Buon punto! :-) – stiank81

2

Nella mia mente, l'obiettivo principale di MVVM è eliminare il codice che non può essere facilmente testato dai test di unità. Dal momento che un modello di vista può essere testato unitamente ma una vista non può, ciò si ottiene rendendo la vista più stupida possibile. Idealmente, come si può fare con XAML, la vista è completamente dichiarativa e solo data-binds su un modello di vista. Da qui il mantra "senza codice dietro".

La riutilizzabilità del modello di visualizzazione su diverse tecnologie di interfaccia utente non è realmente un obiettivo di MVVM. Se lo provi, probabilmente sarai tentato di spostare nuovamente il codice specifico per la tecnologia dell'interfaccia utente per mantenere il modello di visualizzazione riutilizzabile. Ciò andrebbe contro l'obiettivo principale della testabilità.

Se si trova davvero la necessità di supportare diverse tecnologie di interfaccia utente, è comunque possibile calcolare la logica comune dei modelli di visualizzazione in un livello di "presentazione" condiviso. Non lo farei finché non sarò certo necessario.

0

Questa è una vecchia domanda, quindi esito ad aggiungere un'altra risposta. Ma tutte le risposte pubblicate finora hanno mancato il punto.The answer from MSDN è molto chiaro: Il ViewModel è molto specificamente destinate ad essere condivisa da molti viste vari sistemi operativi, come dimostrato in questa figura:

enter image description here

Facendo altrimenti comporterebbe inevitabilmente codice ridondante.

Problemi correlati