cream code with objective-c

Cream Code with 
Objective-C 
Javier Aznar de los Ríos 
@JaviAznar1 
Enrique Fau de Casa Juana 
@kikefau
cream code with objective-c
¿Qué es el Cream Code?
/¿qué es cream code? 
Algunas claves 
● Entendible 
● Extensible 
● Mantenible 
● Actitud 
● Refactorizar como parte del desarrollo 
● Programas pequeños
¿Qué NO es el Cream Code?
/¿qué no es cream code? 
Spaghetti Code 
● Estructura compleja 
● Difícil de entender 
● Difícil de testear
cream code with objective-c
/¿qué no es cream code? 
Código duplicado 
● Propenso a errores 
● Difícil de mantener 
● Oculta el propósito 
del código
cream code with objective-c
/¿qué no es cream code? 
Código complejo 
● Difícil de entender 
● Difícil de mantener 
● Propenso a errores
cream code with objective-c
/¿qué no es cream code? 
Métodos con responsabilidad 
múltiple 
● Difícil de mantener 
● Difícil de entender 
● Código muy acoplado 
● Difícil de testear
cream code with objective-c
/¿qué no es cream code? 
Sin tests 
● Código no probado 
● Errores difíciles de 
localizar 
● Producto final “no 
deseado”
Resumiendo...
/si es cream code 
Código de calidad 
● Modularizado, Extensible 
● DRY (Don’t repeat yourself) 
● KISS (Keep It Simple, Stupid) 
● Con tests 
● S.O.L.I.D.
/si es cream code 
S.O.L.I.D. (buenas prácticas) 
● Responsabilidad única 
● Abierto a extensiones, cerrado a modificaciones 
● Clases derivadas no modifican comportamiento 
de su clase base 
● Varias interfaces pequeñas es mejor que sólo 
una grande 
● Uso de abstracciones 
Robert C. Martin
cream code with objective-c
¿Cómo conseguir el cream 
code? 
Enrique Fau de Casa Juana 
@kikefau
View Controllers
View Potingue Controller vergon/zVoiseow… cajón C ontroller 
desastre 
● Difícil de entender 
● Difícil encontrar código 
● Difícil de modificar / extender 
● Difícil de mantener 
● Imposible de testear 
● Conflictos
/View Controller/Responsabilidades 
Necesita saber lo que está pasando 
View Controller 
Eventos servidor 
Interacción de usuario 
Feedback de usuario 
Modifica el modelo 
Cambios del modelo Peticiones al servidor 
Sabe qué hacer en cada momento
/Crema de la buena 
Necesitamos crema de la buena 
● Adelgazar nuestros View Controllers 
● Inyección de dependencias 
● Testing (Unit testing, UI...) 
● Patrones de diseño 
● Libros y enlaces de interés
Necesitamos crema de la buena
/View Controllers a dieta 
Necesitamos crema de la buena 
● View & View Controller 
● MVC 
● Model View View Model 
● Lógica de dominio 
● Data Sources 
● Lógica de Servicios 
● View Controller Containment
● El controlador maneja una 
vista 
● Sabe qué mostrar, no 
cómo mostrarlo 
● La vista implementa los 
detalles de presentación 
(jerarquía, animaciones...) 
View Controller 
View 
eventos de 
usuario 
feedback 
/View & View Controller
/MVC 
KVO interaction 
View Controller 
user 
Model View conoce tiene
/MVVM 
View View Controller 
View Model 
NSDateFormatter 
NSStringWithFormat 
... 
Model 
tiene 
tiene actualiza 
actualiza
/Lógica del dominio 
@implementation PropertyViewController 
- (void)loadPropertyPictures 
{ 
self.pictures = [self.property getPictures]; 
} 
@end 
@implementation Property (Extension) 
- (NSArray *)getPictures 
{ 
NSString *strPredicate = @"type == %@"; 
NSPredicate *pred = [NSPredicate predicateWithFormat:formatString, @" 
picture"]; 
return [[self.multimedias filteredSetUsingPredicate:pred] allObjects]; 
} 
@end 
View Controller 
getPictures 
Property 
Property + 
Extension
/Data source 
@implementation DataSource 
- (NSInteger)tableView:(UITableView *)tableView 
numberOfRowsInSection:(NSInteger)section 
{ 
return [self.items count]; 
} 
- (UITableViewCell *)tableView:(UITableView *)tableView 
cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
id cell = [tableView dequeueReusableCellWithIdentifier… 
forIndexPath:indexPath]; 
self.configureCellBlock(cell, [self itemAtIndexPath:indexPath]); 
return cell; 
} 
- (NSObject *)itemAtIndexPath:(NSIndexPath *)indexPath 
{ 
return self.items[indexPath.row]; 
} 
Table View 
Controller 
Table View 
Data Source
/Web Service 
● El VC no debe contener 
lógica de Web Services 
● El controlador no sabe de 
dónde salen los objetos 
● La obtención de objetos 
debe ser asíncrona 
● Se comunicará a través de 
delegados, notificaciones o 
bloques 
View Controller 
getObjects 
Service
/Controller Containment
View Controller Containment 
● Disponible a partir de iOS 5 
● [VC1.view addSubView:VC2.view] ??? 
● viewWillAppear, rotaciones… 
● Nuevos métodos 
● addChildViewController 
● didMoveToParentViewController 
● removeFromParentViewController
/Controller Containment 
● El padre define las vistas 
contenedoras 
● Los hijos son notificados 
cuando son añadidos 
● El padre realiza las 
transiciones 
● Los hijos deben tener 
sentido por sí mismos 
View Controller 
Container 
View Controller 
(Child) 
View Controller 
(Child)
/Controller Containment 
View Controller 
Container 
View Controller 
View Controller 
ViVeiwew C Conotnrotrlolellrer 
Child Delegate (Child) 
crea 
implementa 
define
Inyección de dependencias
Inyección de dependencias 
● Dependencia: A depende de B, 
cuando A necesita de B para hacer su 
trabajo 
● Inyección: El objeto que usa A le 
dice a A quien es B
/Inyección de dependencias 
Necesitamos crema de la buena 
● Inyección por constructor 
● Inyección de propiedades 
● Inyección en métodos 
● Extraer método y sobreescribir la 
llamada
@implementation Example 
- (NSString *)getFormattedDate:(NSDate *)date 
{ 
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
[dateFormatter setLocale:[NSLocale localeWithLocaleIdentifier:@"es"]]; 
dateFormatter.dateFormat = @"dd MMM"; 
return [dateFormatter stringFromDate:date]; 
} 
@end 
/Ejemplo
/Inyección por constructor 
@interface Example () 
@property(nonatomic, strong) NSDateFormatter *dateFormatter; 
@end 
@implementation Example 
- (instancetype)initWithDateFormatter:(NSDateFormatter *)dateFormatter 
{ 
self = [super init]; 
if (self) { 
_dateFormatter = dateFormatter; 
} 
return self; 
} 
- (NSString *)getFormattedDate:(NSDate *)date 
{ 
return [self.dateFormatter stringFromDate:date]; 
} 
@end
/Inyección de propiedades 
@interface Example () 
@property(nonatomic, strong) NSDateFormatter *dateFormatter; 
@end 
@implementation Example 
- (NSDateFormatter *)dateFormatter 
{ 
if (!_dateFormatter) { 
_dateFormatter = [[NSDateFormatter alloc] init]; 
[_dateFormatter setLocale:[NSLocale localeWithLocaleIdentifier:@"es"]]; 
_dateFormatter.dateFormat = @"dd MMM"; 
} 
return _dateFormatter; 
} 
- (NSString *)getFormattedDate:(NSDate *)date 
{ 
return [self.dateFormatter stringFromDate:date]; 
} 
@end
/Inyección en métodos 
@implementation Example 
- (NSString *)getFormattedDate:(NSDate *)date 
withDateFormatter:(NSDateFormatter *)dateFormatter 
{ 
return [dateFormatter stringFromDate:date]; 
} 
@end
/Extraer y sobreescribir 
@interface Example () 
@property(nonatomic, strong) NSDateFormatter *dateFormatter; 
@end 
@implementation Example 
- (NSString *)getFormattedDate:(NSDate *)date 
{ 
return [[self dateFormatter] stringFromDate:date]; 
} 
- (NSDateFormatter *)dateFormatter 
{ 
NSDateFormatter *df = [[NSDateFormatter alloc] init]; 
[df setLocale:[NSLocale localeWithLocaleIdentifier:@" 
es"]]; 
df.dateFormat = @"dd MMM"; 
return df; 
} 
@end 
@interface TestingExample : Example 
@end 
@implementation TestingExample 
- (NSString *)getFormattedDate:(NSDate *)date 
{ 
return [[self dateFormatter] stringFromDate:date]; 
} 
- (NSDateFormatter *)dateFormatter 
{ 
// Devuelve lo que quieras!!! 
} 
@end
Testing
/Testing 
● Test unitarios (XCTest, OCmockito) 
● Test de integración (KIF) 
● Test de aceptación (UIautomation) 
● Jenkins (Integración continua!!!) 
● Test manuales (QA)
cream code with objective-c
Patrones
/Patrones 
● Model View Controller 
● Model View View Model 
● Singleton (AppDelegate) 
● Delegado (@Protocol) 
● Observer (NSNotificationCenter, KVO...) 
● Command (NSInvocation) 
● Factory, state, decorator...
Libros y enlaces
/Libros… peligrosos?
/Libros
/Enlaces de interés 
● www.objc.io 
● www.nshipster.com 
● www.raywenderlich.com 
● www.keyvanakbary.com 
● www.agbo.biz 
● www.ironhack.com
El resultado 
● Más legible 
● Fácil de modificar 
● Fácil de testear 
● Roles dentro del equipo 
● Menos conflictos 
● Y en general… más apetecible
Gracias!!! 
jobs: www.idealista.com/creamcode 
Javier Aznar de los Ríos 
@JaviAznar1 
Enrique Fau de Casa Juana 
@kikefau
¿Preguntas? 
jobs: www.idealista.com/creamcode 
Javier Aznar de los Ríos 
@JaviAznar1 
Enrique Fau de Casa Juana 
@kikefau
1 of 55

Recommended

Angularjs Lógica de negocio by
Angularjs Lógica de negocioAngularjs Lógica de negocio
Angularjs Lógica de negocioPedro Hurtado Candel
694 views17 slides
Cómo domar SonataAdminBundle by
Cómo domar SonataAdminBundleCómo domar SonataAdminBundle
Cómo domar SonataAdminBundleVictoria Quirante Ruiz
2.8K views246 slides
Desarrollo código mantenible en WordPress utilizando Symfony by
Desarrollo código mantenible en WordPress utilizando SymfonyDesarrollo código mantenible en WordPress utilizando Symfony
Desarrollo código mantenible en WordPress utilizando SymfonyAsier Marqués
3.5K views41 slides
Curso TDD Ruby on Rails #06: Mocks y stubs by
Curso TDD Ruby on Rails #06: Mocks y stubsCurso TDD Ruby on Rails #06: Mocks y stubs
Curso TDD Ruby on Rails #06: Mocks y stubsAlberto Perdomo
915 views10 slides
Advanced angular 1 by
Advanced angular 1Advanced angular 1
Advanced angular 1Sergio Castillo Yrizales
1.7K views41 slides
Practica 8 by
Practica 8Practica 8
Practica 8Jose Cordova
267 views3 slides

More Related Content

What's hot

Parte II. Notas Rapidas (sticky notes) App W8: MVVM y SQLite. by
Parte II. Notas Rapidas (sticky notes) App W8: MVVM y SQLite.Parte II. Notas Rapidas (sticky notes) App W8: MVVM y SQLite.
Parte II. Notas Rapidas (sticky notes) App W8: MVVM y SQLite.Juan Manuel
1.2K views8 slides
Curso AngularJS - 3. módulos y controladores by
Curso AngularJS - 3. módulos y controladoresCurso AngularJS - 3. módulos y controladores
Curso AngularJS - 3. módulos y controladoresÁlvaro Alonso González
2K views22 slides
Introducción al desarrollo Web: Frontend con Angular 6 by
Introducción al desarrollo Web: Frontend con Angular 6Introducción al desarrollo Web: Frontend con Angular 6
Introducción al desarrollo Web: Frontend con Angular 6Gabriela Bosetti
870 views53 slides
Directivas en AngularJS by
Directivas en AngularJSDirectivas en AngularJS
Directivas en AngularJSGonzalo Ruiz de Villa
4.5K views22 slides
Clean Code (EN ESPANOL) by
Clean Code (EN ESPANOL)Clean Code (EN ESPANOL)
Clean Code (EN ESPANOL)Rodrigo Branas
9.3K views119 slides
JSR354: Moneda y Dinero - Taller by
JSR354: Moneda y Dinero - TallerJSR354: Moneda y Dinero - Taller
JSR354: Moneda y Dinero - TallerAlexis Lopez
568 views10 slides

What's hot(20)

Parte II. Notas Rapidas (sticky notes) App W8: MVVM y SQLite. by Juan Manuel
Parte II. Notas Rapidas (sticky notes) App W8: MVVM y SQLite.Parte II. Notas Rapidas (sticky notes) App W8: MVVM y SQLite.
Parte II. Notas Rapidas (sticky notes) App W8: MVVM y SQLite.
Juan Manuel1.2K views
Introducción al desarrollo Web: Frontend con Angular 6 by Gabriela Bosetti
Introducción al desarrollo Web: Frontend con Angular 6Introducción al desarrollo Web: Frontend con Angular 6
Introducción al desarrollo Web: Frontend con Angular 6
Gabriela Bosetti870 views
JSR354: Moneda y Dinero - Taller by Alexis Lopez
JSR354: Moneda y Dinero - TallerJSR354: Moneda y Dinero - Taller
JSR354: Moneda y Dinero - Taller
Alexis Lopez568 views
Ajax by ousli07
AjaxAjax
Ajax
ousli072.6K views
Integrando React.js en aplicaciones Symfony (deSymfony 2016) by Ignacio Martín
Integrando React.js en aplicaciones Symfony (deSymfony 2016)Integrando React.js en aplicaciones Symfony (deSymfony 2016)
Integrando React.js en aplicaciones Symfony (deSymfony 2016)
Ignacio Martín5.1K views
Introducción a JQuery by Continuum
Introducción a JQueryIntroducción a JQuery
Introducción a JQuery
Continuum5.6K views
Customizer: configurando un sitio en tiempo real by wpargentina
Customizer: configurando un sitio en tiempo realCustomizer: configurando un sitio en tiempo real
Customizer: configurando un sitio en tiempo real
wpargentina488 views
Api De Google Calendar by jvelizster
Api De Google CalendarApi De Google Calendar
Api De Google Calendar
jvelizster6K views

Viewers also liked

10 tricks to get more app downloads by
10 tricks to get more app downloads10 tricks to get more app downloads
10 tricks to get more app downloadsJavier Berlana
6.5K views62 slides
10 tips for a reusable architecture by
10 tips for a reusable architecture10 tips for a reusable architecture
10 tips for a reusable architectureJorge Ortiz
7.4K views55 slides
Mobile Analytics Betabeers VLC by
Mobile Analytics Betabeers VLCMobile Analytics Betabeers VLC
Mobile Analytics Betabeers VLCJavier Berlana
5K views47 slides
Groovy on Android by
Groovy on AndroidGroovy on Android
Groovy on AndroidMario García
6.1K views53 slides
Opinionated android by
Opinionated androidOpinionated android
Opinionated androidJavier Gamarra
6.5K views44 slides
Effective Android UI - spanish by
Effective Android UI - spanishEffective Android UI - spanish
Effective Android UI - spanishPedro Vicente Gómez Sánchez
11.9K views46 slides

Viewers also liked(6)

Similar to cream code with objective-c

Intro a cakephp by
Intro a cakephpIntro a cakephp
Intro a cakephpbetabeers
344 views49 slides
Intro a cakephp by
Intro a cakephpIntro a cakephp
Intro a cakephpAndy Dawson
1.7K views49 slides
Funciones store proc_triggers by
Funciones store proc_triggersFunciones store proc_triggers
Funciones store proc_triggersLuis Jherry
1.8K views32 slides
Programacion de base de datos - unidad 3 Programacion de base de datos by
Programacion de base de datos - unidad 3 Programacion de base de datosProgramacion de base de datos - unidad 3 Programacion de base de datos
Programacion de base de datos - unidad 3 Programacion de base de datosJosé Antonio Sandoval Acosta
932 views27 slides
Funciones store proc_triggers by
Funciones store proc_triggersFunciones store proc_triggers
Funciones store proc_triggersLuis Jherry
1.1K views32 slides
Taller introduccion symfony2 by
Taller introduccion symfony2Taller introduccion symfony2
Taller introduccion symfony2Mario IC
1K views45 slides

Similar to cream code with objective-c(20)

Intro a cakephp by betabeers
Intro a cakephpIntro a cakephp
Intro a cakephp
betabeers344 views
Intro a cakephp by Andy Dawson
Intro a cakephpIntro a cakephp
Intro a cakephp
Andy Dawson1.7K views
Funciones store proc_triggers by Luis Jherry
Funciones store proc_triggersFunciones store proc_triggers
Funciones store proc_triggers
Luis Jherry1.8K views
Funciones store proc_triggers by Luis Jherry
Funciones store proc_triggersFunciones store proc_triggers
Funciones store proc_triggers
Luis Jherry1.1K views
Taller introduccion symfony2 by Mario IC
Taller introduccion symfony2Taller introduccion symfony2
Taller introduccion symfony2
Mario IC1K views
Angular 2 Campus Madrid Septiembre 2016 by Micael Gallego
Angular 2 Campus Madrid Septiembre 2016Angular 2 Campus Madrid Septiembre 2016
Angular 2 Campus Madrid Septiembre 2016
Micael Gallego5.7K views
Teoria procedimientos almacenados by hirmaroxana13
Teoria procedimientos almacenadosTeoria procedimientos almacenados
Teoria procedimientos almacenados
hirmaroxana132.2K views
Android Bootcamp - GTUG Uruguay by gtuguruguay
Android Bootcamp - GTUG UruguayAndroid Bootcamp - GTUG Uruguay
Android Bootcamp - GTUG Uruguay
gtuguruguay849 views
¿Grails + DDD + Eventsourcing + CQRS? by Jorge Franco Leza
¿Grails + DDD + Eventsourcing + CQRS?¿Grails + DDD + Eventsourcing + CQRS?
¿Grails + DDD + Eventsourcing + CQRS?
Jorge Franco Leza1.3K views
Curso iOS by Platzi
Curso iOSCurso iOS
Curso iOS
Platzi763 views
Desarrollando aplicaciones web usando Catalyst y jQuery by Javier P.
Desarrollando aplicaciones web usando Catalyst y jQueryDesarrollando aplicaciones web usando Catalyst y jQuery
Desarrollando aplicaciones web usando Catalyst y jQuery
Javier P.1.2K views
MyBatis como alternativa a Hibernate by Rubén Aguilera
MyBatis como alternativa a HibernateMyBatis como alternativa a Hibernate
MyBatis como alternativa a Hibernate
Rubén Aguilera8.4K views

Recently uploaded

Peña_Anaya_TAREA Reportes Maestro - Detalle con el uso de AJAX.pptx by
Peña_Anaya_TAREA Reportes Maestro - Detalle con el uso de AJAX.pptxPeña_Anaya_TAREA Reportes Maestro - Detalle con el uso de AJAX.pptx
Peña_Anaya_TAREA Reportes Maestro - Detalle con el uso de AJAX.pptxMOISESPENAANAYA
5 views8 slides
Kubernetes: Más Allá de la Orquestación de Contenedores by
Kubernetes: Más Allá de la Orquestación de ContenedoresKubernetes: Más Allá de la Orquestación de Contenedores
Kubernetes: Más Allá de la Orquestación de ContenedoresOpenDireito
8 views12 slides
Aws Community Day Guatemala Criptografia con AWS KMS by
Aws Community Day Guatemala Criptografia con AWS KMSAws Community Day Guatemala Criptografia con AWS KMS
Aws Community Day Guatemala Criptografia con AWS KMSMario IC
25 views42 slides
MasterMind.pdf by
MasterMind.pdfMasterMind.pdf
MasterMind.pdfrtovarfernandez
17 views5 slides
Operations & Data Graph by
Operations & Data GraphOperations & Data Graph
Operations & Data GraphNeo4j
36 views25 slides
DEFINICIONES DE BLOGGUER, MOVIE MAKER Y FILMORA. .pptx by
DEFINICIONES DE BLOGGUER, MOVIE MAKER Y FILMORA. .pptxDEFINICIONES DE BLOGGUER, MOVIE MAKER Y FILMORA. .pptx
DEFINICIONES DE BLOGGUER, MOVIE MAKER Y FILMORA. .pptxKarenlisethGuioAlbin
8 views8 slides

Recently uploaded(6)

Peña_Anaya_TAREA Reportes Maestro - Detalle con el uso de AJAX.pptx by MOISESPENAANAYA
Peña_Anaya_TAREA Reportes Maestro - Detalle con el uso de AJAX.pptxPeña_Anaya_TAREA Reportes Maestro - Detalle con el uso de AJAX.pptx
Peña_Anaya_TAREA Reportes Maestro - Detalle con el uso de AJAX.pptx
MOISESPENAANAYA5 views
Kubernetes: Más Allá de la Orquestación de Contenedores by OpenDireito
Kubernetes: Más Allá de la Orquestación de ContenedoresKubernetes: Más Allá de la Orquestación de Contenedores
Kubernetes: Más Allá de la Orquestación de Contenedores
OpenDireito8 views
Aws Community Day Guatemala Criptografia con AWS KMS by Mario IC
Aws Community Day Guatemala Criptografia con AWS KMSAws Community Day Guatemala Criptografia con AWS KMS
Aws Community Day Guatemala Criptografia con AWS KMS
Mario IC25 views
Operations & Data Graph by Neo4j
Operations & Data GraphOperations & Data Graph
Operations & Data Graph
Neo4j36 views

cream code with objective-c

  • 1. Cream Code with Objective-C Javier Aznar de los Ríos @JaviAznar1 Enrique Fau de Casa Juana @kikefau
  • 3. ¿Qué es el Cream Code?
  • 4. /¿qué es cream code? Algunas claves ● Entendible ● Extensible ● Mantenible ● Actitud ● Refactorizar como parte del desarrollo ● Programas pequeños
  • 5. ¿Qué NO es el Cream Code?
  • 6. /¿qué no es cream code? Spaghetti Code ● Estructura compleja ● Difícil de entender ● Difícil de testear
  • 8. /¿qué no es cream code? Código duplicado ● Propenso a errores ● Difícil de mantener ● Oculta el propósito del código
  • 10. /¿qué no es cream code? Código complejo ● Difícil de entender ● Difícil de mantener ● Propenso a errores
  • 12. /¿qué no es cream code? Métodos con responsabilidad múltiple ● Difícil de mantener ● Difícil de entender ● Código muy acoplado ● Difícil de testear
  • 14. /¿qué no es cream code? Sin tests ● Código no probado ● Errores difíciles de localizar ● Producto final “no deseado”
  • 16. /si es cream code Código de calidad ● Modularizado, Extensible ● DRY (Don’t repeat yourself) ● KISS (Keep It Simple, Stupid) ● Con tests ● S.O.L.I.D.
  • 17. /si es cream code S.O.L.I.D. (buenas prácticas) ● Responsabilidad única ● Abierto a extensiones, cerrado a modificaciones ● Clases derivadas no modifican comportamiento de su clase base ● Varias interfaces pequeñas es mejor que sólo una grande ● Uso de abstracciones Robert C. Martin
  • 19. ¿Cómo conseguir el cream code? Enrique Fau de Casa Juana @kikefau
  • 21. View Potingue Controller vergon/zVoiseow… cajón C ontroller desastre ● Difícil de entender ● Difícil encontrar código ● Difícil de modificar / extender ● Difícil de mantener ● Imposible de testear ● Conflictos
  • 22. /View Controller/Responsabilidades Necesita saber lo que está pasando View Controller Eventos servidor Interacción de usuario Feedback de usuario Modifica el modelo Cambios del modelo Peticiones al servidor Sabe qué hacer en cada momento
  • 23. /Crema de la buena Necesitamos crema de la buena ● Adelgazar nuestros View Controllers ● Inyección de dependencias ● Testing (Unit testing, UI...) ● Patrones de diseño ● Libros y enlaces de interés
  • 25. /View Controllers a dieta Necesitamos crema de la buena ● View & View Controller ● MVC ● Model View View Model ● Lógica de dominio ● Data Sources ● Lógica de Servicios ● View Controller Containment
  • 26. ● El controlador maneja una vista ● Sabe qué mostrar, no cómo mostrarlo ● La vista implementa los detalles de presentación (jerarquía, animaciones...) View Controller View eventos de usuario feedback /View & View Controller
  • 27. /MVC KVO interaction View Controller user Model View conoce tiene
  • 28. /MVVM View View Controller View Model NSDateFormatter NSStringWithFormat ... Model tiene tiene actualiza actualiza
  • 29. /Lógica del dominio @implementation PropertyViewController - (void)loadPropertyPictures { self.pictures = [self.property getPictures]; } @end @implementation Property (Extension) - (NSArray *)getPictures { NSString *strPredicate = @"type == %@"; NSPredicate *pred = [NSPredicate predicateWithFormat:formatString, @" picture"]; return [[self.multimedias filteredSetUsingPredicate:pred] allObjects]; } @end View Controller getPictures Property Property + Extension
  • 30. /Data source @implementation DataSource - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return [self.items count]; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { id cell = [tableView dequeueReusableCellWithIdentifier… forIndexPath:indexPath]; self.configureCellBlock(cell, [self itemAtIndexPath:indexPath]); return cell; } - (NSObject *)itemAtIndexPath:(NSIndexPath *)indexPath { return self.items[indexPath.row]; } Table View Controller Table View Data Source
  • 31. /Web Service ● El VC no debe contener lógica de Web Services ● El controlador no sabe de dónde salen los objetos ● La obtención de objetos debe ser asíncrona ● Se comunicará a través de delegados, notificaciones o bloques View Controller getObjects Service
  • 33. View Controller Containment ● Disponible a partir de iOS 5 ● [VC1.view addSubView:VC2.view] ??? ● viewWillAppear, rotaciones… ● Nuevos métodos ● addChildViewController ● didMoveToParentViewController ● removeFromParentViewController
  • 34. /Controller Containment ● El padre define las vistas contenedoras ● Los hijos son notificados cuando son añadidos ● El padre realiza las transiciones ● Los hijos deben tener sentido por sí mismos View Controller Container View Controller (Child) View Controller (Child)
  • 35. /Controller Containment View Controller Container View Controller View Controller ViVeiwew C Conotnrotrlolellrer Child Delegate (Child) crea implementa define
  • 37. Inyección de dependencias ● Dependencia: A depende de B, cuando A necesita de B para hacer su trabajo ● Inyección: El objeto que usa A le dice a A quien es B
  • 38. /Inyección de dependencias Necesitamos crema de la buena ● Inyección por constructor ● Inyección de propiedades ● Inyección en métodos ● Extraer método y sobreescribir la llamada
  • 39. @implementation Example - (NSString *)getFormattedDate:(NSDate *)date { NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; [dateFormatter setLocale:[NSLocale localeWithLocaleIdentifier:@"es"]]; dateFormatter.dateFormat = @"dd MMM"; return [dateFormatter stringFromDate:date]; } @end /Ejemplo
  • 40. /Inyección por constructor @interface Example () @property(nonatomic, strong) NSDateFormatter *dateFormatter; @end @implementation Example - (instancetype)initWithDateFormatter:(NSDateFormatter *)dateFormatter { self = [super init]; if (self) { _dateFormatter = dateFormatter; } return self; } - (NSString *)getFormattedDate:(NSDate *)date { return [self.dateFormatter stringFromDate:date]; } @end
  • 41. /Inyección de propiedades @interface Example () @property(nonatomic, strong) NSDateFormatter *dateFormatter; @end @implementation Example - (NSDateFormatter *)dateFormatter { if (!_dateFormatter) { _dateFormatter = [[NSDateFormatter alloc] init]; [_dateFormatter setLocale:[NSLocale localeWithLocaleIdentifier:@"es"]]; _dateFormatter.dateFormat = @"dd MMM"; } return _dateFormatter; } - (NSString *)getFormattedDate:(NSDate *)date { return [self.dateFormatter stringFromDate:date]; } @end
  • 42. /Inyección en métodos @implementation Example - (NSString *)getFormattedDate:(NSDate *)date withDateFormatter:(NSDateFormatter *)dateFormatter { return [dateFormatter stringFromDate:date]; } @end
  • 43. /Extraer y sobreescribir @interface Example () @property(nonatomic, strong) NSDateFormatter *dateFormatter; @end @implementation Example - (NSString *)getFormattedDate:(NSDate *)date { return [[self dateFormatter] stringFromDate:date]; } - (NSDateFormatter *)dateFormatter { NSDateFormatter *df = [[NSDateFormatter alloc] init]; [df setLocale:[NSLocale localeWithLocaleIdentifier:@" es"]]; df.dateFormat = @"dd MMM"; return df; } @end @interface TestingExample : Example @end @implementation TestingExample - (NSString *)getFormattedDate:(NSDate *)date { return [[self dateFormatter] stringFromDate:date]; } - (NSDateFormatter *)dateFormatter { // Devuelve lo que quieras!!! } @end
  • 45. /Testing ● Test unitarios (XCTest, OCmockito) ● Test de integración (KIF) ● Test de aceptación (UIautomation) ● Jenkins (Integración continua!!!) ● Test manuales (QA)
  • 48. /Patrones ● Model View Controller ● Model View View Model ● Singleton (AppDelegate) ● Delegado (@Protocol) ● Observer (NSNotificationCenter, KVO...) ● Command (NSInvocation) ● Factory, state, decorator...
  • 52. /Enlaces de interés ● www.objc.io ● www.nshipster.com ● www.raywenderlich.com ● www.keyvanakbary.com ● www.agbo.biz ● www.ironhack.com
  • 53. El resultado ● Más legible ● Fácil de modificar ● Fácil de testear ● Roles dentro del equipo ● Menos conflictos ● Y en general… más apetecible
  • 54. Gracias!!! jobs: www.idealista.com/creamcode Javier Aznar de los Ríos @JaviAznar1 Enrique Fau de Casa Juana @kikefau
  • 55. ¿Preguntas? jobs: www.idealista.com/creamcode Javier Aznar de los Ríos @JaviAznar1 Enrique Fau de Casa Juana @kikefau