Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

cream code with objective-c

4,702 views

Published on

controladores de 1000 líneas, métodos con más de una responsabilidad, tocas una clase y se joden todas las demás, spaghetti code… basta!

si no soportas al menos dos de los elementos del listado anterior, bienvenido a cream code with objective-c

esta charla nos permitirá explorar un conjunto de técnicas y patrones que podemos aplicar en nuestro día a día para conseguir código más limpio, legible y sobre todo mantenible en el tiempo

http://www.idealista.com/labs/blog/idealista/descubre-que-es-el-creamcode-en-codemotion/

Published in: Software
  • Be the first to comment

cream code with objective-c

  1. 1. Cream Code with Objective-C Javier Aznar de los Ríos @JaviAznar1 Enrique Fau de Casa Juana @kikefau
  2. 2. ¿Qué es el Cream Code?
  3. 3. /¿qué es cream code? Algunas claves ● Entendible ● Extensible ● Mantenible ● Actitud ● Refactorizar como parte del desarrollo ● Programas pequeños
  4. 4. ¿Qué NO es el Cream Code?
  5. 5. /¿qué no es cream code? Spaghetti Code ● Estructura compleja ● Difícil de entender ● Difícil de testear
  6. 6. /¿qué no es cream code? Código duplicado ● Propenso a errores ● Difícil de mantener ● Oculta el propósito del código
  7. 7. /¿qué no es cream code? Código complejo ● Difícil de entender ● Difícil de mantener ● Propenso a errores
  8. 8. /¿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
  9. 9. /¿qué no es cream code? Sin tests ● Código no probado ● Errores difíciles de localizar ● Producto final “no deseado”
  10. 10. Resumiendo...
  11. 11. /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.
  12. 12. /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
  13. 13. ¿Cómo conseguir el cream code? Enrique Fau de Casa Juana @kikefau
  14. 14. View Controllers
  15. 15. 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
  16. 16. /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
  17. 17. /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
  18. 18. Necesitamos crema de la buena
  19. 19. /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
  20. 20. ● 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
  21. 21. /MVC KVO interaction View Controller user Model View conoce tiene
  22. 22. /MVVM View View Controller View Model NSDateFormatter NSStringWithFormat ... Model tiene tiene actualiza actualiza
  23. 23. /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
  24. 24. /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
  25. 25. /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
  26. 26. /Controller Containment
  27. 27. View Controller Containment ● Disponible a partir de iOS 5 ● [VC1.view addSubView:VC2.view] ??? ● viewWillAppear, rotaciones… ● Nuevos métodos ● addChildViewController ● didMoveToParentViewController ● removeFromParentViewController
  28. 28. /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)
  29. 29. /Controller Containment View Controller Container View Controller View Controller ViVeiwew C Conotnrotrlolellrer Child Delegate (Child) crea implementa define
  30. 30. Inyección de dependencias
  31. 31. 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
  32. 32. /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
  33. 33. @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
  34. 34. /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
  35. 35. /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
  36. 36. /Inyección en métodos @implementation Example - (NSString *)getFormattedDate:(NSDate *)date withDateFormatter:(NSDateFormatter *)dateFormatter { return [dateFormatter stringFromDate:date]; } @end
  37. 37. /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
  38. 38. Testing
  39. 39. /Testing ● Test unitarios (XCTest, OCmockito) ● Test de integración (KIF) ● Test de aceptación (UIautomation) ● Jenkins (Integración continua!!!) ● Test manuales (QA)
  40. 40. Patrones
  41. 41. /Patrones ● Model View Controller ● Model View View Model ● Singleton (AppDelegate) ● Delegado (@Protocol) ● Observer (NSNotificationCenter, KVO...) ● Command (NSInvocation) ● Factory, state, decorator...
  42. 42. Libros y enlaces
  43. 43. /Libros… peligrosos?
  44. 44. /Libros
  45. 45. /Enlaces de interés ● www.objc.io ● www.nshipster.com ● www.raywenderlich.com ● www.keyvanakbary.com ● www.agbo.biz ● www.ironhack.com
  46. 46. 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
  47. 47. Gracias!!! jobs: www.idealista.com/creamcode Javier Aznar de los Ríos @JaviAznar1 Enrique Fau de Casa Juana @kikefau
  48. 48. ¿Preguntas? jobs: www.idealista.com/creamcode Javier Aznar de los Ríos @JaviAznar1 Enrique Fau de Casa Juana @kikefau

×