Robert Martin dice: "Non ci dovrebbe mai essere più di un motivo per cambiare classe".
Consideriamo la classe ViewModel associata a una vista. È possibile (o anche probabile) che ViewModel sia costituito da proprietà che non sono realmente correlate tra loro. Per le piccole viste ViewModel può essere abbastanza coerente, ma mentre l'applicazione diventa più complessa, ViewModel espone i dati che saranno soggetti a modifiche per motivi diversi e non correlati.
Dovremmo preoccuparci del principio SRP nel caso della classe ViewModel o no?Come creare ViewModel in MVVM per non violare il Principio di Responsabilità Singola?
risposta
ViewModel ha la responsabilità unica di fornire alla vista le informazioni di cui ha bisogno. Se la vista ha bisogno di proprietà diverse e non correlate non è importante in quanto il ViewModel ha solo una ragione per cambiare e quella è la vista che mostra proprietà diverse. Quindi non dovresti preoccuparti troppo.
Detto questo, se il ViewModel diventa enorme, forse si potrebbe pensare di dividere la vista in diverse sottoview per migliorare la riusabilità e mantenere gestibili View e ViewModels.
Sì, ma ciò non significa che un design scadente non potrebbe costringerti a farlo.
Sono d'accordo con gcores.
Una volta che ViewModel diventa più di due schermate di testo, è giunto il momento di considerare la suddivisione di ViewModel in diversi modelli figlio.
Un'altra regola empirica è che non ho mai più di due livelli di annidamento nel file XAML - se una parte della vista diventa troppo complessa, è il momento per il refactoring della vista - estrai XAML interno in UserControl separato e crea ViewModel corrispondente, che sarà il contesto dati predefinito sulla vista figlio.
Sono d'accordo sul fatto che la suddivisione degli schermi in più viste con più ViewModel sia necessaria per ridurre la complessità e la complessità. Ecco un altro schema che ho impiegato per aiutare a rispettare SRP utilizzando MVVM:
Ecco uno scenario. My ViewModel deve ottenere dati e rispondere ai comandi di filtro dall'interfaccia utente. Creo il ViewModel per essere composito nella struttura. In altre parole, le classi figlio che hanno accesso ai membri privati di ViewModel eseguono operazioni lineari come la gestione del filtro. Potrei anche avere un'altra classe figlia che esegue la logica necessaria per la selezione di elementi in base a criteri. Hai un'idea. Una volta che ViewModel sta eseguendo alcune funzioni che si estendono su diversi metodi, potrebbe essere un buon candidato delegare a una classe figlia. Le classi figlie rimangono parte del ViewModel principale, quindi è solo un modo per ridurre le dimensioni del ViewModel e rende più semplice il collaudo di queste operazioni lineari.
- 1. Un "modello di dominio ricco" può violare il Principio di Responsabilità Singola?
- 2. Does attuazione interfaccia multipla violare singolo Responsabilità Principio
- 3. Quando si viola il SRP (Principio della singola responsabilità)?
- 4. Qual è un esempio del principio di responsabilità singola?
- 5. Cosa significa il principio di responsabilità unica per la convalida
- 6. Come applicare il principio di responsabilità singola a una classe di servizio
- 7. Il modo migliore per creare un ViewModel in MVVM
- 8. Come il principio di singola responsabilità si riferisce al modello di dominio anemico/ricco?
- 9. Il modello di test di auto-derivazione viola il Principio di Responsabilità Singola?
- 10. In SOLIDO, qual è la distinzione tra SRP e ISP? (Principio della singola responsabilità e principio di segregazione dell'interfaccia)
- 11. Si tratta di un esempio del principio di responsabilità unica?
- 12. Test di unità MVVM WPF per ViewModel?
- 13. MVP/MVVM - Filtro delle liste, chi ha la responsabilità?
- 14. MVVM Pattern, ViewModel DataContext domanda
- 15. Come si determina quanto debba essere grossolana o a grana fine una "responsabilità" quando si utilizza il principio di responsabilità singola?
- 16. Come modificare la scheda da TabControl in WPF senza violare il pattern MVVM
- 17. Come seguire il principio di Responsabilità Unica nel mio esecutore HttpClient?
- 18. In MVVM il ViewModel o il modello implementano INotifyPropertyChanged?
- 19. Risorse per l'implementazione di pattern MVVM (ViewModel) in Flex?
- 20. Il MVVM ViewModel dovrebbe eseguire la conversione/convalida del tipo?
- 21. MVVM: ViewModel e Business Logic collegamento
- 22. Dove creare il ViewModel parametrizzato?
- 23. MVVM: CollectionView in ViewModel o CollectionViewSource in xaml?
- 24. Prism2/MVVM Chiudi vista da ViewModel
- 25. UI di aggiornamento dalla classe ViewModel (pattern MVVM) in WPF
- 26. Perché non è bello esporre il modello tramite ViewModel in Silverlight MVVM?
- 27. Seguendo il principio ASCIUGATURA in ASP.NET
- 28. L'uso tradizionale del controller in MVC porta a una violazione del Principio di Responsabilità Unica?
- 29. MVVM Come impostare datacontext quando viewmodel utilizza async
- 30. Come inizializzare Vista nidificata (e ViewModel) senza utilizzare il risolutore di dipendenze in WPF/MVVM