2012-03-20 21 views
5

Normalmente solo trabajo una aplicación de forma aleatoria, siempre que funcione, pero esto significa que no presto atención a ningún patrón de diseño. Mi aplicación actualmente hace un uso extenso de las variables globales (cargo una instancia de mi AppDelegate en cada controlador de vista para acceder a las propiedades que declare en mi AppDelegate.h). Aunque hace lo que yo quiero que haga, he leído que esta no es una buena práctica de diseño.Comprensión del patrón de diseño MVC en Cocoa Touch

Así que quiero comenzar a hacer que mi código sea "legítimo". Sin embargo, no puedo imaginar mi aplicación ahora sin variables globales. Son tan importantes para el bienestar de la aplicación, pero esto debe significar que estoy haciendo algo mal, ¿verdad? Simplemente no puedo imaginarme de qué otra manera haría algunas cosas. Tomemos, por ejemplo, esto:

enter image description here

Usted tiene dos controladores de vista aquí, un SideViewController y una MainViewController. Utilizando variables globales, como decir si toda la aplicación tenía una instancia compartida de SideViewController y MainViewController (appDelegate.sideViewController y appDelegate.mainViewController), puedo comunicarme fácilmente entre los dos controladores de vista, de modo que si presiono "News Feed" en mi SideViewController, puedo Dile a mi MainViewController que vuelva a cargar su vista.

No puedo imaginar, sin embargo, cómo se haría esto si estas no fueran variables globales? Si ocurre un evento en mi SideViewController, ¿cómo notificaré a mi MainViewController, de una manera que esté de acuerdo con los estándares de diseño?

+0

¿Está utilizando un Controlador de navegación? –

+0

Estoy usando un controlador de navegación para los principales contenidos de mi aplicación, sin embargo, la implementación actual de mi SideViewController no se agrega a la pila de navegación, sino a la ventana principal de la aplicación a través de '[appDelegate.window addSubView: sideViewController.view]' – Snowman

Respuesta

5

No puedo imaginar, sin embargo, cómo se haría si estas no fueran variables globales ? Si ocurre un evento en mi SideViewController, ¿cómo notificaría a mi MainViewController cómo de una manera que esté de acuerdo con con estándares de diseño?

De la misma manera que lo hace ahora, excepto que el SideViewController obtiene su referencia al MainViewController desde un lugar diferente.

¿Cómo se crean estos dos controladores de vista? Es probable que suceda de dos maneras:

  1. Uno de los objetos crea el otro. En este caso, tal vez el MainViewController crea el SideViewController.

  2. Algún otro objeto, como el delegado de aplicación u otro controlador de vista, los crea a ambos.

En el primer caso, el MainViewController hace referencia al SideViewController tan pronto como lo crea. Puede almacenar esa referencia en una de sus propias variables de instancia, de modo que siempre pueda enviar mensajes al SideViewController que creó. De forma similar, MainViewController puede darle al SideViewController una referencia a sí mismo (es decir, al MainViewController), y el SideViewController puede almacenar eso y usarlo en el futuro para hablar con su MainViewController.

El segundo caso es similar: si el delegado de la aplicación (u otro objeto) crea MainViewController y SideViewController, ese objeto conoce ambos objetos y puede configurar cada uno con una referencia al otro.

En ambos casos, los objetos en cuestión son capaces de comunicarse entre sí tan fácilmente como lo hicieron alguna vez y no hay necesidad de una variable global.

Lo que he explicado anteriormente es quizás la forma más sencilla de lograr lo que usted solicitó: la comunicación entre dos objetos. Hay una serie de patrones que pueden ser utilizados para refinar la relación entre los objetos para hacer que el código aún mejor:

  • delegación: Dale SideViewController una propiedad delegado, y definir algún protocolo que establezca lo SideViewController espera de su delegado Implemente ese protocolo en MainViewController. Haga de su instancia de MainViewController el delegado de SideViewController. SideViewController no necesita saber exactamente qué tipo es su delegado, solo le importa que su delegado implemente el protocolo requerido. Esto facilita el uso de SideViewController con algo distinto a MainViewController si se presenta esa oportunidad, o para usarlo en un proyecto diferente.

  • notificaciones: SideViewController puede que ni siquiera necesite un delegado, simplemente puede transmitir notificaciones sobre ciertos eventos a cualquier objeto que esté escuchando. Esto es particularmente efectivo si más de un objeto necesita saber algo que ocurre en SideViewController, o si los objetos que se preocupan por las acciones de SideViewController pueden cambiar.

  • MVC: En lugar de decirle a MainViewController que algo ha cambiado, SideViewController simplemente cambia los datos en el modelo. Cada vez que aparece la vista de MainViewController (o la vista de cualquier otro controlador de vista, para el caso), el controlador lee los datos del modelo y se vuelve a mostrar a sí mismo.

Si está interesado, puede que desee recoger una copia de Patrones de cacao Diseño de Erik Buck, lo que explica estos patrones y muchos otros en gran detalle. No sientas que tienes que aprenderlo todo de una vez, o que es demasiado problema. Aprenda un poco a la vez y vea cómo mejora (o no) sus proyectos.

+0

Para el caso 1, si mi 'MainViewController' crea el SideViewController, ¿cómo puede un' SecondaryViewController' acceder al 'SideViewController'? Con un 'appDelegate.sideViewController', esto se hace fácilmente, pero estoy leyendo que ese tipo de cosas no deberían estar en AppDelegate. – Snowman

+0

Las mismas preguntas: ¿quién crea 'SecondaryViewController'? Además, * ¿por qué * necesita 'SecondaryViewController' acceder al SideViewController? ¿Necesita acceder * al mismo * SideViewController, o sería mejor si tuviera su propia instancia de SideViewController? Comprender las relaciones entre tus objetos es el primer paso para organizar esas relaciones en algo que sea confiable y sostenible. – Caleb

Cuestiones relacionadas