¿Por qué MVC podría no ser el mejor patrón para las aplicaciones Cocoa?

MVC representa Controlador de vista de modelo, y es un patrón arquitectónico generalizado para el desarrollo de software. Es el patrón de diseño de facto para el desarrollo del cacao, y lo ha sido durante muchos, muchos años. La mayoría de nosotros no podemos imaginar construir aplicaciones sin él. Tanto UIKit (iOS) como AppKit(macOS) hace uso frecuente de MVC. Casi parece como si no tuviéramos otra opción para crear aplicaciones para iOS, tvOS, macOS y watchOS.

Incluso si no está familiarizado con el patrón Modelo-Vista-Controlador, si tiene la ambición de desarrollar aplicaciones para una de las plataformas de Apple, necesita aprender cómo se relacionan las vistas (iOS) y las ventanas (macOS) con los controladores y qué papel desempeñan. Modelo juega en una aplicación típica de cacao. Afortunadamente, MVC es fácil de aprender.

En esta breve serie, explico qué es MVC, cómo se ve en una aplicación típica de Cocoa y por qué puede no ser la mejor solución para los desarrolladores de Cocoa..

1. un ejemplo

Permítame mostrarle cómo se ve el patrón MVC en una aplicación típica de Cocoa. El ejemplo que te mostraré se centra en iOS, pero todo lo que discutimos también se aplica a tvOS, macOS y watchOS. Abre Xcode y crea un nuevo iOS proyecto basado en el Solicitud de vista única modelo.

Nombra el proyecto MVC, y establecer Idioma a Rápido y Dispositivos a iPhone. Estoy usando Xcode 8 para este tutorial. Las opciones de configuración del proyecto pueden verse un poco diferentes si está utilizando Xcode 9.

Como su nombre lo indica, el patrón Modelo-Vista-Controlador define tres componentes, el modelo, la ver, y el controlador. Permítame mostrarle dónde puede encontrar estos componentes en un proyecto típico de iOS.

Controladores

Los controladores de una aplicación iOS son controladores de vista, instancias de UIViewController clase o una subclase de los mismos. los UIViewController clase se define en el UIKit marco de referencia. Porque elegimos el Solicitud de vista única Cuando configuramos el proyecto, Xcode creó un controlador para comenzar, el ViewController clase, definida en ViewController.Swift. Hereda de la UIViewController clase.

Como su nombre lo indica, un UIViewController La instancia es responsable de controlar una vista, una instancia de Vista clase. Cada controlador de vista en un proyecto de iOS mantiene una fuerte referencia a una vista, otro componente del patrón Modelo-Vista-Controlador. los Vista clase también se define en el UIKit marco de referencia.

Puntos de vista

Podemos encontrar el componente de vista en el storyboard principal del proyecto. Abierto Main.storyboard en el Navegador de proyectos a la izquierda e inspeccionar el Ver escena del controlador. La escena contiene un controlador de vista, una instancia de ViewController clase, y maneja un Vista ejemplo.

Seleccionar Ver en el guión gráfico de la izquierda y abre el Inspector de identidad a la derecha. los Clase campo de la vista se establece en Vista. En una aplicación iOS, las vistas son típicamente instancias de UIKit Vista clase o una subclase de los mismos.

Modelos

Hasta ahora hemos explorado la capa de controlador y la capa de vista. ¿Pero dónde podemos encontrar la capa modelo del proyecto? El modelo es casi siempre específico para el proyecto en el que está trabajando, y depende de usted definir, implementar y utilizar el modelo del proyecto. yo escribo modelo, pero usualmente tienes múltiples modelos, dependiendo de la complejidad de tu proyecto.

Agreguemos la pieza final del rompecabezas MVC creando un modelo. Crea un nuevo archivo Swift y llámalo Cambio de persona.

Seleccionar Cambio de persona en el Navegador de proyectos a la izquierda y definir una estructura llamada Persona. Definimos tres propiedades: 

  • nombre de pila de tipo Cuerda
  • apellido de tipo Cuerda
  • años de tipo En t
struct Person let firstName: String let lastName: String let age: Int

Ahora tienes un modelo que puedes usar en tu proyecto. Mantengámoslo simple y definamos una propiedad., persona, de tipo Persona? en el ViewController clase. Creamos un Persona instancia en el controlador de vista viewDidLoad () Método y asignarlo a la persona propiedad.

importar clase UIKit ViewController: UIViewController // MARK: - Propiedades var person: Person? // MARCA: - Ver función de anulación del ciclo de vida viewDidLoad () super.viewDidLoad () // Crear persona person = Persona (nombre de pila: "John", apellido: "Doe", edad: 40)

Lo que vemos en este ejemplo es muy común en las aplicaciones Cocoa impulsadas por el patrón Modelo-Vista-Controlador. El controlador de vista posee y administra el modelo, y utiliza el modelo para completar su vista. En una aplicación más compleja, carga los datos del modelo desde un almacén persistente o los recupera desde un servidor remoto..

Vamos a definir una salida para una UILabel instancia en el controlador de vista y, en el guión gráfico principal, agregue una etiqueta a la Ver escena del controlador.

importar clase UIKit ViewController: UIViewController // MARK: - Propiedades @IBOutlet var label: UILabel!…

En el controlador de vista viewDidLoad () Método, desenvolvemos de forma segura el valor almacenado en el persona propiedad y utilizar sus datos para establecer la texto propiedad de la UILabel ejemplo.

anular func viewDidLoad () super.viewDidLoad () // Crear persona person = Person (primer nombre: "John", lastName: "Doe", edad: 40) // Rellenar etiqueta si dejar person = label label.text = " \ (person.lastName), \ (person.firstName) (\ (person.age)) "

El resultado no es muy sorprendente si está familiarizado con el desarrollo de Cocoa. Esto es lo que terminamos con.

2. ¿Qué es Model-View-Controller??

El patrón Modelo-Vista-Controlador es fácil de entender y recoger. A pesar de su simplicidad, puede encontrar una amplia gama de sabores del patrón MVC. MVC solo ofrece un plano básico que se puede modificar a la plataforma en la que se usa. 

El patrón Modelo-Vista-Controlador con el que está familiarizado en iOS, tvOS, macOS y watchOS se diferencia de manera sutil de la definición original. Si bien las diferencias en comparación con la definición original son sutiles, tienen un impacto significativo en el código que usted escribe, así como en la capacidad de mantenimiento del proyecto..

Charla

El patrón Modelo-Vista-Controlador es un patrón de diseño antiguo. Hizo su primera aparición en la década de 1970 en Smalltalk. El patrón fue concebido por Trygve Reenskaug. A lo largo de los años, el patrón Model-View-Controller se abrió camino en muchos lenguajes y marcos, incluidos Java, Rails y Django..

Anteriormente mencioné que el patrón MVC divide las aplicaciones en tres componentes distintos: modelo, ver, y controlador. La implementación original del patrón define que la vista es responsable de mostrar los datos del modelo al usuario. El usuario interactúa con la aplicación a través de la capa de vista. El controlador se encarga de manejar la interacción del usuario y de manipular los datos del modelo como resultado. La vista visualiza estos cambios al usuario. Como se ilustra en el diagrama a continuación, el modelo juega un papel clave en el patrón MVC, ya que fue diseñado por Reenskaug.

MVC y Cacao

La implementación que utilizamos en el desarrollo de Cocoa difiere del diseño original de Reenskaug. Eche un vistazo al siguiente diagrama para comprender mejor lo que implican estas diferencias..

Como mencioné anteriormente, la vista y el controlador comparten una relación cercana. En una aplicación típica de iOS, un controlador tiene una fuerte referencia a la vista que administra. La vista es un objeto tonto que sabe cómo mostrar datos y responder a la interacción del usuario. El resultado es un componente altamente reutilizable..

El controlador desempeña un papel vital en las aplicaciones Cocoa impulsadas por el patrón Modelo-Vista-Controlador. Asume algunas de las tareas del modelo en la implementación MVC original de Reenskaug. La vista y el modelo no se comunican directamente entre sí. En cambio, el modelo generalmente es propiedad del controlador, que utiliza para configurar y completar la vista que administra..

Espero que puedan ver las sutiles diferencias entre la implementación original de Reenskaug en Smalltalk y la implementación Cocoa a la que nos hemos acostumbrado. Las diferencias son menores, pero, como discutiré en un momento, el impacto que tienen es importante.

3. El Bien: Separación de Preocupaciones y Reutilización

Antes de que echemos un vistazo a los problemas que presenta MVC, me gustaría mostrarle por qué el patrón Model-View-Controller se ha convertido en un patrón tan popular y generalizado en el desarrollo de software. El patrón Modelo-Vista-Controlador que utilizamos en el desarrollo de Cocoa tiene una serie de beneficios claros que heredó de la implementación original de Reenskaug.

La ventaja más obvia del patrón Modelo-Vista-Controlador es una separación de intereses. La capa de vista, por ejemplo, es responsable de presentar los datos al usuario. Las capas de modelo y controlador no están relacionadas con la presentación de datos. Pero si has estado usando MVC en un proyecto Cocoa, entonces sabes que esto no siempre es cierto. Hablaré más sobre eso en un momento.

Un beneficio directo de esta separación de preocupaciones es reutilización. Cada uno de los componentes del patrón Modelo-Vista-Controlador se centra en una tarea específica, lo que significa que los componentes básicos de una aplicación MVC a menudo son fáciles de reutilizar. También permite que estos componentes se acoplen de manera flexible, lo que aumenta su reutilización. Sin embargo, esto no es cierto para todos los componentes. En un proyecto Cocoa, por ejemplo, los controladores suelen ser específicos de la aplicación y no son buenos candidatos para su reutilización.

Sin embargo, las vistas y los modelos de un proyecto son altamente reutilizables si se diseñan correctamente. Las vistas de tabla y colección, por ejemplo, son Vista Subclases que se utilizan en millones de aplicaciones. Debido a que una vista de tabla delega la interacción del usuario a otro objeto y solicita a una fuente de datos la información que necesita mostrar, puede centrarse exclusivamente en la presentación de datos y la interacción del usuario..

4. Lo malo: Controladores de vista masiva

La mayoría de los desarrolladores comprenden rápidamente lo que el patrón Modelo-Vista-Controlador trae a la mesa y cómo debe implementarse. Desafortunadamente, el patrón Modelo-Vista-Controlador también tiene un lado feo. Ya escribí sobre la reutilización y la separación de las preocupaciones. Estoy seguro de que no necesito convencerte de estos beneficios. Una vista de tabla es altamente reutilizable e increíblemente eficaz. Los desarrolladores pueden usar componentes UIKit estándar en sus aplicaciones sin necesidad de subclasificación o personalización.

Golpeando los límites de MVC

Pero eso es solo una parte de la historia. Sabes cuándo estás empezando a llegar a los límites de MVC cuando los controles de vista masiva se han colado en tu proyecto. Es hora de cambiar cuando recorre cientos o miles de líneas de código para encontrar el método que está buscando. 

Volcarlo en el controlador

La mayoría de los desarrolladores saben lo que sucede en las capas de vista y modelo de una aplicación Cocoa típica impulsada por el patrón Modelo-Vista-Controlador. ¿Pero qué componente es responsable de formatear los datos que se muestran al usuario? Recuerda que se supone que las vistas son tontas y reutilizables. La vista no debería necesitar formatear los datos. ¿Derecha? Solo debe saber cómo presentar los datos y responder a la interacción del usuario. ¿Debería preocuparse el modelo por el formato de datos??

¿Y qué pasa con las redes? Esa ciertamente no es la tarea de la vista. ¿Debería delegarse en el modelo? Eso no suena bien. ¿Por qué no deslizamos ese pedazo de código en el controlador? No se siente bien, pero lo hará por ahora..

Después de muchas líneas de código, terminas con un controlador que está listo para reventar y una pesadilla para probar. ¿Pruebas? Te escucho. No me gustaría probar un controlador de vista que sufre de síndrome del controlador de vista masiva ya sea.

5. Una mejor solución

Comenzó con buenas intenciones, pero terminó con un proyecto que tiene una colección de controladores con sobrepeso que son difíciles de administrar y mantener. No tiene ganas de agregar nuevas funciones al proyecto en el que está trabajando porque abrir esos controladores de vista lo enferma de estómago. ¿Le suena familiar??

Es importante darse cuenta de que este es un escenario común. Muchos desarrolladores llegan a los límites del patrón Modelo-Vista-Controlador y se dan cuenta de que necesitan algo mejor. Lo más probable es que ya haya estado buscando varias alternativas, como MVP (Modelo-Vista-Presentador) o MVVM (Model-View-ViewModel).

En la próxima entrega de esta serie, haré zoom en el Model-View-ViewModel modelo. Se sentirá extrañamente familiar si ya ha trabajado con el patrón Model-View-Controller. Pero el patrón Model-View-ViewModel trae algunas mejoras a la tabla que funcionan muy bien para el desarrollo de Cocoa..

Y mientras espera, echa un vistazo a algunas de nuestras otras publicaciones sobre el desarrollo de la aplicación Cocoa!