2011-12-09 7 views
18

Todavía soy bastante nuevo en Cocoa y Objective-C (< 1 año). Mi aplicación ahora tiene más de 50 clases, pero algunos de ViewControllers se llenan de código, como 700 líneas o más.¿Es correcto tener ViewControllers con un montón de código?

Mi pregunta es: ¿está bien tener un ViewController "grande" o hay patrones para dividir el código en fracciones? Una gran parte del código está implementando métodos delegados, por eso no tengo una idea de cómo moverlo.

Lo sé, aunque puedo estructurarme con marcas de pragma.

Gracias por cualquier entrada.

EDIT (Dec 2013): hay un great article from Chris Eidhof de objc.io con respecto a este tema. También habló sobre ese tema en Macoun 2013/Frankfurt. Separar los protocolos UITableView es un gran patrón.

EDIT2 También hay 2 videos en NSScreencast que explican los conceptos de la refactorización de ViewController (episodio # 102 y # 103).

+1

1 Muy buena pregunta. Es bueno saber que hay personas que se preocupan. – tonklon

+0

Gracias por todas las respuestas, ¡muy apreciado! Sin embargo, es casi imposible elegir la respuesta "correcta". Para mí, si lo he identificado, no he sido lo suficientemente estricto para separar el código de modelo del VC. Pero también aprenderé el concepto de categorías. – brainray

Respuesta

6

Una de las causas más comunes de controladores de vista grande que he visto es la falta de separación b/n Modelo y controlador en la arquitectura MVC. En otras palabras, ¿está manejando sus datos en sus controladores de vista?

En caso afirmativo, elimine el componente de modelo de VC y póngalo en una clase separada. Esto también forzará su pensamiento hacia un mejor diseño.

Para referencia, a la vista del controlador:

  • de dirección de todos los cambios en el UIView y los elementos de interfaz de usuario que contiene.
  • Todas las operaciones de animación, transiciones y CALayer.

En Modelo:

  • Todo el procesamiento de los datos, incluida la clasificación, transformación, almacenamiento, etc.
2

Puede distribuir el código por categorías en función de la funcionalidad. Consulte http://developer.apple.com/library/mac/#documentation/General/Conceptual/DevPedia-CocoaCore/Category.html

+0

Si bien esto podría mejorar la legibilidad del código, no mejora la reutilización y la dosis no ayuda a separar las preocupaciones. Si puede dividir el CV en categorías naturalmente separadas, ¿por qué no dividirlo en diferentes clases? – tonklon

+0

El objetivo de dividir el código en categorías se debe a que los métodos se vuelven parte del tipo de clase. Dividirse en diferentes clases es un concepto completamente diferente. Si el código es increíblemente grande, es mejor dividirlo en categorías. –

+0

Sí, lo sé, y entiendo su punto. Y estoy de acuerdo en que es mejor dividir en categorías, luego simplemente dejarlo así. Pero la mejor manera es crear clases separadas. Cada clase obtiene las propiedades que necesita para hacer su trabajo. Dividir el código en múltiples categorías conduce a una gran clase, que tiene múltiples responsabilidades. Eso lleva a [MAGIC PUSHBUTTON] (http://en.wikipedia.org/wiki/Magic_pushbutton) o [GOD OBJECT] (http://en.wikipedia.org/wiki/God_object) – tonklon

4

en mi humilde opinión, 700 líneas no es (todavía) enorme para el código de iOS, he visto y manejado mucho peor. Por supuesto, si todos sus VC son tan grandes, tiene un problema.

Definitivamente debe usar y abusar #pragma mark, es muy útil bajo Xcode por lo menos.

Luego, si encuentra que tiene demasiado código en un archivo, puede extraer la funcionalidad a clases o categorías, ya que se ajusta mejor.

Crear clases puede ser muy gratificante a largo plazo para gestionar tareas recurrentes en proyectos (es decir, conectarse a un servicio web, analizar XML/JSON, interactuar con SQLlite, iniciar sesión, etc.). Si está realizando una programación recurrente de iOS, puede crear una biblioteca 'común' de código útil de esa manera.

La creación de categorías, especialmente en UIViewController puede ayudar a reducir el código que ocupa un lugar importante. Puede (y probablemente debería) también crear una base común UIViewController para su aplicación, que manejará cosas como rotación, tal vez logging, navegación, etc. ... en una parte centralizada del código.

+0

Es cierto, tengo una línea de 1300 VC, y no está nada mal, ya que la mayoría de las líneas son solo animaciones personalizadas, etc. Creo que depende de qué tipo de métodos y dependencias tenga la clase. –

3

Debería tratar de identificar lo que realmente está haciendo su ViewController.

Si puede separar algunas inquietudes, puede moverlas a clases propias. Averigüe qué propiedades y ivars utilizan los métodos viewControllers. Si puede encontrar un subconjunto de funciones que utilizan un subconjunto común de ivars/properties, es probable que estas juntas se conviertan en una clase propia. El controlador entonces sería dueño de una nueva clase y delegaría trabajo en esto.

Si su ViewController está gestionando algún tipo de estado, ej. Si encuentra la misma declaración de cambio o cadena de if en 2 o más métodos, el patrón STATE podría hacer que su VC sea mucho más legible. Pero, básicamente, puede usar cualquier patrón que ayude a reducir las responsabilidades de VC.

En mi humilde opinión ViewController es el lugar donde conectarías el modelo a las vistas. Propagar los cambios de modelo en las vistas y manejar la interacción del usuario con las vistas son las únicas cosas que deberían ocurrir allí.Todas las demás responsabilidades, como el cálculo, la transferencia de red, el análisis sintáctico, la validación ... deberían ocurrir en diferentes clases que utilice el CV.

Puede que le guste el libro Código limpio de Robert C. Martin. Explora en profundidad cómo se puede estructurar el código para aumentar su legibilidad y reutilización.

0

Prefiera el uso de la clase NSObject para administrar parte de las funciones del controlador de vista. El código de razones principales es más claro y más fácil de depurar

+2

¿Cuidar para elaborar? No tengo idea de lo que estás sugiriendo aquí. – jv42

Cuestiones relacionadas