30-50% off hundreds of digital assets! WordPress themes, video, music and more 30-50% Off Go to Sale
Advertisement
  1. Code
  2. iOS SDK
Code

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

by
Difficulty:IntermediateLength:MediumLanguages:
This post is part of a series called Better iOS App Architecture With MVVM.
Put Your View Controllers on a Diet With MVVM

Spanish (Español) translation by Carlos A. King (you can also view the original English article)

MVC significa Modelo-Vista-Controlador, y es un patrón arquitectónico para el desarrollo de software. Es el patrón de diseño para el desarrollo del Cocoa y ha sido por muchos, muchos años. La mayoría de nosotros no nos imaginamos creando aplicaciones sin él. Ambos UIKit (iOS) y AppKit (macOS) hacen uso frecuente de MVC. Casi parece como si no tenemos otra opción para crear aplicaciones para iOS, tvOS, macOS y watchOS.

Incluso si usted no está familiarizado con el patrón Modelo-Vista-Controlador, si tienes la ambición de desarrollar aplicaciones para una de las plataformas de Apple, usted necesita aprender cómo vistas  (iOS) y ventanas (macOS) se relacionan con los controladores y cual papel el modelo juega en una aplicación de Cocoa. Afortunadamente, MVC es fácil de aprender.

En esta corta serie, le voy a explicar lo que es MVC, como se ve en una aplicación de Cocoa y por qué no puede ser la mejor solución para los desarrolladores de Cocoa.

1. Un Ejemplo

Permítame mostrarle lo que parece el patrón MVC en una aplicación Cocoa. El ejemplo que voy a  demostrar se centra en iOS, pero todo lo que discutimos también se aplica a watchOS, tvOS y macOS. Abra Xcode y crear un nuevo proyecto de iOS basado en la plantilla de Simple View Application.

Setting Up the Project

Nombre el proyecto MVC y establezca el Lenguage a Swift y Devices a iPhone. Estoy usando Xcode 8 para este tutorial. Las opciones de configuración del proyecto pueden ser un poco diferentes si estás usando Xcode 9.

Configuring the Project

Como su nombre lo indica, el patrón Model-View-Controller define tres componentes, el modelo, la vista y el controlador. Permítame mostrarle donde usted puede encontrar estos componentes en un proyecto de iOS.

Controladores

Los controladores de una aplicación de iOS son controladores de vista, las instancias de la clase UIViewController o una subclase de la misma. La clase UIViewController se define en el marco del UIKit. Porque elegimos la plantilla Single View Application cuando creamos el proyecto, Xcode creo un controlador por nosotros, la clase ViewController, definida en ViewController.Swift. Es heredada de la clase UIViewController.

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

Vistas

Podemos encontrar el componente de vista en el guión gráfico principal del proyecto. Abra Main.storyboard en el Navegador de Proyecto a la izquierda e inspeccione la Escena de Controlador de Vista. La escena contiene un controlador de vista, una instancia de la clase ViewController, y administra una instancia de UIView.

Exploring the Main Storyboard of the Project

Seleccione View en el guión gráfico de la izquierda y abra el Identity Inspector a la derecha. El campo de Clase de la vista es establecida a un UIView. En una aplicación de iOS, vistas suelen ser instancias de UIView clase de UIKit o una subclase de la misma.

View Is Instance of UIView Class

Modelos

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

Vamos a añadir la última pieza del rompecabezas de MVC mediante la creación de un modelo. Cree un nuevo archivo de Swift y asígnele el nombre Persona.swift.

Create a New Swift File

Seleccione Persona.swift en el Navegador de Proyecto de la izquierda y definir una estructura llamada a Persona. Definimos tres propiedades:

  • nombre de tipo String
  • apellido de tipo String
  • edad de tipo Int

Ahora tienes un modelo que puede utilizar en su proyecto. Vamos a mantenerlo simple y definamos una propiedad, persona, del tipo de Persona? en la clase ViewController. Crear una instancia de la Persona en el método de viewDidLoad() del controlador de vista y asígnelo a la propiedad de la persona.

Lo que vemos en este ejemplo es muy común en aplicaciones de Cocoa con el patrón Modelo-Vista-Controlador. El controlador de vista posee y administra el modelo, y usa el modelo para llenar su vista. En una aplicación más compleja, puedes cargan los datos del modelo desde una base de dato o traerlo desde un back-end remoto.

Vamos a definir una salida para una instancia UILabel en el controlador de vista, en el guión principal, agregue un label a la Escena de Controlador de Vista.

Adding a Label to the View Controller Scene

En método de viewDidLoad() del controlador de vista, seguramente desenvolvemos el valor almacenado en la propiedad de la persona y utilizamos sus datos para establecer la propiedad text de la instancia UILabel.

El resultado no es muy sorprendente si estás familiarizado con el desarrollo del Cocoa. Con esto es lo que terminamos.

MVC in Action

2. ¿Qué es el Modelo-Vista-Controlador?

El patrón Modelo-Vista-Controlador es fácil de entender y aprender. A pesar de su sencillez, puede encontrar una amplia gama de sabores del patrón MVC. MVC sólo ofrece un modelo básico que puede ser modificado a la plataforma en que se utiliza.

El patrón Modelo-Vista-Controlador que está familiarizado en iOS, tvOS, macOS, y watchOS difiere en formas sutiles de la definición original. Aunque las diferencias en comparación con la definición original son sutiles, tienen un impacto significativo en el código que escriba, así como en el mantenimiento del proyecto.

Smalltalk

El patrón Modelo-Vista-Controlador es un viejo patrón de diseño. Hizo su primera aparición en la década de 1970 en Smalltalk. El patrón fue concebido por Trygve Reenskaug. Con los años, el patrón Modelo-Vista-Controlador hizo su camino en muchos lenguajes y frameworks, incluyendo Java, Rails y Django.

Mencioné anteriormente que el patrón MVC rompe aplicaciones en tres componentes distintos: modelo, vista 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 es responsable de manejar la interacción con el usuario y la manipulación de datos del modelo como resultado. La vista visualiza estos cambios para el usuario. Como se ilustra en el siguiente diagrama, el modelo desempeña un papel fundamental en el patrón MVC ya que fue diseñado por Reenskaug.

MVC as Defined by Trygve Reenskaug

MVC y Cocoa

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

MVC Cocoa Implementation

Como he mencionado anteriormente, la vista y el controlador comparten una estrecha relación. En una aplicación de iOS, un controlador tiene una fuerte referencia a la vista que maneja. La vista es un objeto tonto que sabe cómo mostrar los datos y responder a interacción del usuario. El resultado es un componente altamente reutilizable.

El controlador juega un papel vital en aplicaciones de Cocoa con el patrón Modelo-Vista-Controlador. Tomas algunas de las tareas del modelo en la implementación original de MVC de Reenskaug. La vista y el modelo no se comunican directamente. En cambio, el modelo generalmente es propiedad del controlador, que es utilizado para configurar y rellenar la vista que maneja.

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

3. Lo Bueno: Separación de Preocupaciones y Reutilización

Antes de que tomemos un vistazo a los problemas que presenta el MVC, me gustaría mostrarle por qué el patrón Modelo-Vista-Controlador se ha convertido en un patrón generalizado y popular 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 preocupaciones. La capa de vista, por ejemplo, es responsable de presentar datos al usuario. Las capas del modelo y del controlador no se refieren a la presentación de los datos. Pero si usted ha estado usando MVC en un proyecto de Cocoa, entonces usted sabe que esto no es siempre cierto. Hablare más sobre esto en un momento.

Un beneficio directo de esta separación de las preocupaciones es la 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 bloques de construcción de una aplicación MVC son a menudo fáciles de reutilizar. También permite que estos componentes sean combinados libremente, aumentando su reutilización. Aunque esto no es cierto para cada componente. En un proyecto de Cocoa, por ejemplo, los controladores son a menudo específicos a la aplicación y no buenos candidatos para su reutilización.

Las vistas y los modelos de un proyecto, sin embargo, son altamente reutilizables si es diseñado correctamente. Mesa y colección de vistas, por ejemplo, son subclases de UIView que son usado en millones de aplicaciones. Porque una vista de tabla delega la interacción del usuario a otro objeto y le pide a la fuente de datos por los datos que necesita para mostrar, puede centrarse exclusivamente en la interacción de usuario y presentación de datos.

4. Lo Malo: Controladores de vista masivo

La mayoría de los desarrolladores rápidamente entiende lo que el patrón Modelo-Vista-Controlador pone sobre la mesa y cómo debe aplicarse. Desafortunadamente, el patrón Modelo-Vista-Controlador también tiene un lado feo. Ya escribí sobre reutilización y separación de preocupaciones. Estoy seguro de que no tengo que convencerte de estos beneficios. Una vista de tabla es altamente reutilizable y muy eficaz. Los desarrolladores pueden utilizar componentes estándar del UIKit en sus aplicaciones sin la necesidad de subclases o personalización.

Golpeando los Límites de MVC

Pero eso es sólo parte de la historia. Sabes cuando esta empezando a golpear los límites de MVC cuando una cantidad de los controladores de vista se han colado en su proyecto. Es tiempo de cambio cuando esta arando a través de cientos o miles de líneas de código para encontrar un método que estás buscando.

Dumping en el Controlador

La mayoría de los desarrolladores sabe lo que sucede en las vista y el modelo una aplicación de Cocoa por el patrón Modelo-Vista-Controlador. ¿Pero cual componente es responsable de dar formato a los datos que se muestran al usuario? Recuerda que se supone que vistas son tontos y reutilizables. La vista no necesita formatear los datos. ¿Correcto? Sólo debe saber cómo presentar datos y responder a interacción del usuario. ¿Debería preocuparse el modelo con formato de datos?

Y ¿qué de redes? Ciertamente no es la tarea de la vista. ¿Debe delegarse al modelo? Eso no suena bien. Por qué no poner ese pedazo de código en el controlador. No se siente bien, pero va a hacer por ahora.

Después de muchas líneas de código, usted termina con un controlador que está listo para estallar y una pesadilla para probar. ¿Probar? Te escucho. No me gustaría probar un controlador de vista que sufre de síndrome de controlador de vista masivo tampoco.

5. Una Mejor Solución

Empezaste 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 está mirando adelante para agregar nuevas características al proyecto que está trabajando porque abrir eso controladores de vista lo hacen enfermo en el estómago. ¿Esto suena familiar?

Es importante tener en cuenta que este es un escenario común. Muchos desarrolladores golpean los límites del patrón Modelo-Vista-Controlador y se dan cuenta de que necesitan algo mejor. Lo más probable es que usted ya ha estado mirando varias alternativas, como MVP (Modelo-Vista-Presentador) o MVVM (Modelo-Vista VistaModelo).

En la próxima entrega de esta serie, me voy a enfocar en el patrón Modelo-Vista VistaModelo. Se sentirá extrañamente familiar si ya has trabajado con el patrón Modelo-Vista-Controlador. Pero el patrón Modelo-Vista VistaModelo trae algunas mejoras a la mesa que funcionan muy bien para el desarrollo del Cocoa.

Y mientras esperas, revise algunos de nuestros artículos en el  desarrollo de aplicaciones de Cocoa!

Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.