Tiendo a no estar de acuerdo con este pa Ttern.
En primer lugar, trato de tratar los datos centrales como un detalle de implementación, y como cualquier detalle de implementación, debe ocultarse detrás de una buena fachada. La fachada son las interfaces que expongo para mis objetos modelo. Por ejemplo, si tengo dos objetos modelo; Cource
y Student
, cualquier fuente puede tener un número de estudiantes. No quiero permitir que el controlador asuma el deber de configurar predicados y ordenar descriptores, y pasar por todos los niveles de datos básicos solo para obtener una lista de estudiantes para una clase en particular. Hay una forma perfectamente válida para exponer esto en el modelo:
@interface Cource (StudentAccess)
-(NSArray*)studentsStortedByName;
@end
luego implementar las cosas feas de una vez por todas en la clase del modelo. Ocultando todos los detalles complejos de Core Data, y sin necesidad de pasar por contextos de objetos gestionados. ¿Pero cómo encontraría las fuentes, tiene que comenzar en algún lugar, cierto? Sí, lo hace, pero no necesita exponerlo al controlador. Agregar métodos como estos también es perfectamente razonable:
@interface Cource (CourceAccess)
+(Cource*)caurceByID:(NSString*)courceID;
+(NSArray*)allCources;
+(NSArray*)courcesHeldByTeacher:(Teacher*)teacher;
@end
Esto también ayuda a minimizar las dependencias entre los controladores. Y reduciendo las dependencias entre el modelo y el controlador. Suponiendo que tengo una CourceViewController
y una StudenViewController
es que no ocultar los detalles de Datos Básicos detrás de una fachada y quería pasar todo el contexto de objeto gestionado así, entonces me gustaría terminar con un inicializador designado como esto:
-(id)initWithManagedObjectContext:(NSManagedObjectContext*)moc
student:(Student*)student;
Mientras que con una buena buena fachada termino con esto:
-(id)initWithStudent:(Student*)student;
Reducir al mínimo las dependencias detrás de fachadas, a favor de la inyección de dependencia también hace que sea mucho más fácil para cambiar las implementaciones internas. Pasar el contexto del objeto gestionado alienta a cada controlador a implementar su propia lógica para cosas básicas. Tome por ejemplo el método studentsSortedByName
. Al principio podría ser un clasificador por apellido/nombre, si luego se cambiara por apellido/nombre, tendrías que dirigirte a todos y cada uno de los controladores que hayan ordenado a los estudiantes y realicen el cambio.Donde un buen método de fachada requiere que cambie en un método, y todos los controladores automáticamente obtienen la actualización de forma gratuita.
No veo dónde estás en desacuerdo con Apple; solo estás dando un paso más y ocultando el contexto. No recomendaría que su controlador de vista obtenga la lista de estudiantes o cursos del delegado de la aplicación u otro singleton, ¿verdad? – Caleb
@Caleb - No, no del delegado de la aplicación, pero no me daría vergüenza sacar una lista de cursos de un método de clase de la clase 'Curso'. Tratando la clase como un singleton de tipo. – PeyloW
No estoy de acuerdo en que los géneros y los predicados pertenecen a la capa del modelo. Las ordenaciones y los predicados solo son requeridos por la interfaz, por lo que pertenecen al controlador. Colocar ordenaciones y predicados en el modelo vincula el modelo a una interfaz particular y contamina la integridad lógica de la simulación del modelo de los objetos, eventos o condiciones del mundo real que trata la aplicación. – TechZen