¿Model-View-ViewModel es el mejor patrón para usar en WPF? ¿Hay algún inconveniente?¿Cuáles son los problemas del patrón MVVM?
Respuesta
Aquí hay una buena y breve publicación de blog en el advantages and disadvantages of MVVM, directamente del propio John Gossman.
Sus principales desventajas son:
"Para sencilla interfaz de usuario, MV-VM puede ser excesiva En los casos más grandes, puede ser difícil de diseñar el modelo de vista en la delantera con el fin de obtener la cantidad adecuada de generalidad de datos.. -encuadernación para todas sus maravillas es declarativo y más difícil de depurar que cosas imperativas donde simplemente estableces puntos de interrupción "
Sí, es una exageración para pequeñas aplicaciones de estilo hola mundo.
que realmente no existe –
Es un gran patrón y francamente uno de los pocos patrones de UI eliminados para WPF. Lo que quiero decir con eso es que muchas personas lo entienden y lo han adoptado. Por lo tanto, es relativamente fácil obtener ayuda e información sobre él.
El mayor inconveniente en mi opinión es que aumenta el número de clases y componentes en su aplicación, porque SRP supera en este patrón. Dicho esto, creo que vale la pena.
Para construir nuestra aplicación, comenzamos con MVVM, pero después de tener muchos problemas nos damos por vencidos en MVVM por motivos que identificarán dónde no usar MVVM.
Herencia Problema
Programamos en .NET, y usamos C# y mejor Claro que queremos herencia. C# no es compatible con la herencia de clases múltiples, por lo que no podemos tener clases abstractas con lógica que se reutilizarán parcialmente en la IU y en la lógica.
La mayoría de las veces estamos confundidos, cómo diseñar modelos de vista para que podamos heredar y controlar la lógica.
Si heredamos la Vista, no podemos heredar ViewModel al mismo tiempo, y si heredamos ViewModel, entonces no podemos heredar la Vista al mismo tiempo. En cambio, tenemos que usar genéricos muy complicados y con la ayuda de herramientas como Prism y Unity que podemos lograr, pero no vale la pena el tiempo.
modelo de vista de modelo de vista Encuadernación
bien la mayor parte de la lógica de negocio el tiempo isnt tan simple como A = B + C, interfaz de usuario y la respuesta de la interfaz de usuario juega un papel muy importante. Sin embargo, podemos vincular las propiedades visuales de la interfaz de usuario a las propiedades de datos del modelo de visualización, pero surge la pregunta de cómo vincular realmente un modelo de vista a otro modelo de vista y si pasan por dos enlaces de controles compartidos, entonces no tenemos idea de qué se ejecutará primero.
modelo de vista no es simple sustitución de CodeBehind
Se supone que ViewModel es simple sustitución de archivos CodeBehind. Pero al crear nuestra aplicación, la restricción de herencia nos enseñó que, como WPF/Silverlight admite UI Style, que puede separar por completo la IU con lógica, estamos por encima de separar la lógica empresarial en ViewModel.
Código repetida en el modelo de vista
Finalmente nos dimos cuenta de que sólo estamos escribiendo mismo patrón de código en todas las vistas y cada modelo de vista, el cambio que se convierte en un dolor enorme, y el mantenimiento es un dolor demasiado. MVVM es más adecuado para el desarrollo impulsado por pruebas, pero cuando se trata de escribir componentes extensibles, no son el mejor candidato.
WPF/Silverlight ya le permite separar el código y la interfaz de usuario muy bien, que de hecho ya ha diseñado jerarquía de clases muy simple que realiza la lógica de negocio y nos da todo lo que necesitamos. Ahora creamos todas las propiedades de comando basadas en ICommand como propiedades de dependencia de nuestras clases, que vinculamos dentro de UserControl y Templated Control.
ICommand en CodeBehind o Plantilla y Estilos en ResourceDictionary nos da casi todos los beneficios de lo que podemos obtener sobre MVVM.
Ha pasado un tiempo desde que hice la pregunta original. En ese tiempo he estado usando mucho MVVM en mi proyecto en el trabajo. Entonces, con la herencia, ¿quieres una clase que herede View y ViewModel al mismo tiempo? ¿Es esta clase una Vista o un Modelo de Vista? El código repetido en ViewModels se puede resolver mediante el uso de servicios y cualquier tipo de IOC. El enlace de ViewModel y "ViewModel no es solo CodeBehind" Estoy de acuerdo con. –
Service & IOC son muy complejos para aplicaciones de tamaño mediano. La peor parte es que son demasiado difíciles de depurar y administrar en un equipo pequeño. Aunque tiene ventajas, pero para la sangre joven es demasiado complejo. –
Diferentes patrones tienen diferentes resistencias. La gente tiende a confundir el patrón con la implementación. Cómo se organiza o se accede a la lógica de negocios influye en qué patrón es más natural para una aplicación de entrega. Por lo tanto, aunque esta pregunta es acerca de WPF, puede resultar útil leer tres patrones utilizados para implementar la misma pantalla tres veces en cualquier marco.
A continuación se muestra un enlace a un artículo java que compara MVVM ("modelo de presentación") con MVP ("vista pasiva") y una implementación híbrida MVVMP/MVC ("controlador supervisor"). Creo que esto es relevante para esta pregunta ya que tiene una sección que tiene una comparación de los patrones.
Implementing event-driven GUI patterns using the ZK Java AJAX framework
Se señala la debilidad que Juan hace Gossman sino también va en comparar ambas fortalezas y debilidades con dos patrones alternativos.
- 1. ¿Cuáles son los problemas del mundo real con Ruby?
- 2. ¿Cuáles son las diferencias y similitudes entre MVC y MVVM?
- 3. ¿Cuáles son las ventajas y desventajas del Patrón de propiedades?
- 4. ¿Cuáles son las diferencias entre MVC, MVP y MVVM?
- 5. Animación con patrón MVVM
- 6. patrón MVVM con PySide
- 7. ¿Cuáles son los peligros de la prueba después del desarrollo?
- 8. MVVM patrón de violación: MediaElement.Play()
- 9. ¿Cuáles son los problemas comunes que experimentan los pequeños equipos de desarrollo de Android?
- 10. ¿Cuáles son los nuevos marcos?
- 11. ¿Dudas en el patrón MVVM?
- 12. WPF - MVVM - ¿Cuáles son los pros y los contras de las diversas técnicas de creación de vistas?
- 13. ¿Cuáles son los buenos problemas para resolver con los procesos almacenados CLR?
- 14. ¿Cuáles son los usos prácticos de Factory Method Pattern?
- 15. ¿Cuáles son los usos del código de auto modificación?
- 16. ¿Cuáles son los usos prácticos del módulo (%) en la programación?
- 17. ¿Cuáles son los valores válidos de devolución del módulo Perl?
- 18. ¿Cuáles son los elementos más sorprendentes del estándar C++?
- 19. Programación del compilador: ¿Cuáles son los ingredientes más fundamentales?
- 20. ¿Cuáles son los usos inusuales y creativos del lienzo html5
- 21. ¿Cuáles son los usos del predicado de falla en Prolog?
- 22. ¿Cuáles son los retrovisores oficiales del repositorio central de Maven?
- 23. ¿Cuáles son los principales beneficios del scrum como metodología?
- 24. ¿Cuáles son los rangos del acelerador en el iPhone?
- 25. Cuáles son algunas aplicaciones prácticas de XOR en los algoritmos
- 26. ¿Cómo sería MVVM para los juegos?
- 27. ¿Cuáles son los complementos jQuery "imprescindibles"?
- 28. ¿Cuáles son los principales problemas al diseñar un intérprete para un lenguaje funcional?
- 29. Correo de PHP(): ¿Cuáles son los posibles problemas a tener en cuenta?
- 30. ¿Cuáles son los usos de buffer circular?
¡Fue constructivo! – Vahid