SOLID and Symfony. deSymfonyDay 2014

6,631 views

Published on

SOLID and Symfony. My talk in the deSymfony 2014 conference in Barcelona

Published in: Technology
0 Comments
4 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
6,631
On SlideShare
0
From Embeds
0
Number of Embeds
5,460
Actions
Shares
0
Downloads
21
Comments
0
Likes
4
Embeds 0
No embeds

No notes for slide

SOLID and Symfony. deSymfonyDay 2014

  1. 1. ¿QUE SOMOS?
  2. 2. ¿QUIÉN SOY YO?
  3. 3. ¿QUIÉN SOY YO? Gonzalo Ayuso @gonzalo123 http://gonzalo123.com https://github.com/gonzalo123
  4. 4. ¿QUIÉN SOY YO? Gonzalo Ayuso @gonzalo123 http://gonzalo123.com https://github.com/gonzalo123
  5. 5. katayunos.com ¿QUIÉN SOY YO? Gonzalo Ayuso @gonzalo123 http://gonzalo123.com https://github.com/gonzalo123
  6. 6. ¿QUE SOMOS?
  7. 7. ¿QUE SOMOS?Pogramadores
  8. 8. ¿QUE SOMOS?Pogramadores ¿A QUÉ DEDICAMOS NUESTRO TIEMPO?
  9. 9. ¿QUE SOMOS?Pogramadores ¿A QUÉ DEDICAMOS NUESTRO TIEMPO?A programar
  10. 10. ¿QUE SOMOS?Pogramadores ¿A QUÉ DEDICAMOS NUESTRO TIEMPO?A programar
  11. 11. ¿QUE SOMOS?Pogramadores ¿A QUÉ DEDICAMOS NUESTRO TIEMPO?A programarA leer
  12. 12. ¿QUE SOMOS?Pogramadores ¿A QUÉ DEDICAMOS NUESTRO TIEMPO?A programarA leer
  13. 13. $this->createUser(true);
  14. 14. $this->createUser(true); ¿?¿? ¿?
  15. 15. S.O.L.I.D.
  16. 16. S.O.L.I.D. ROBERT. C. MARTIN (THE CLEAN CODE) Single responsibility, Open-closed, Liskov substitution, Interface segregation, Dependency inversion
  17. 17. SRP - SINGLE RESPONSIBILITY PRINCIPLE PRINCIPIO DE RESPONSABILIDAD ÚNICA
  18. 18. SRP - SINGLE RESPONSIBILITY PRINCIPLE PRINCIPIO DE RESPONSABILIDAD ÚNICA CADA COMPONENTE => UNA RESPONSABILIDAD
  19. 19. SRP - SINGLE RESPONSIBILITY PRINCIPLE PRINCIPIO DE RESPONSABILIDAD ÚNICA CADA COMPONENTE => UNA RESPONSABILIDAD UNA RESPONSABILIDAD = UNA RAZÓN DE CAMBIO
  20. 20. SRP - SINGLE RESPONSIBILITY PRINCIPLE PRINCIPIO DE RESPONSABILIDAD ÚNICA CADA COMPONENTE => UNA RESPONSABILIDAD UNA RESPONSABILIDAD = UNA RAZÓN DE CAMBIO CADA COMPONENTE => UNA ÚNICA RAZÓN PARA CAMBIAR
  21. 21. OCP - OPEN/CLOSED PRINCIPLE PRINCIPIO DE ABIERTO/CERRADO
  22. 22. OCP - OPEN/CLOSED PRINCIPLE PRINCIPIO DE ABIERTO/CERRADO LAS ENTIDADES DE SOFTWARE DEBEN SER ABIERTAS PARA EXTENDER, PERO CERRADAS PARA MODIFICACIÓN
  23. 23. OCP - OPEN/CLOSED PRINCIPLE PRINCIPIO DE ABIERTO/CERRADO LAS ENTIDADES DE SOFTWARE DEBEN SER ABIERTAS PARA EXTENDER, PERO CERRADAS PARA MODIFICACIÓN HTTPKernel http://stackphp.com
  24. 24. OCP - OPEN/CLOSED PRINCIPLE PRINCIPIO DE ABIERTO/CERRADO LAS ENTIDADES DE SOFTWARE DEBEN SER ABIERTAS PARA EXTENDER, PERO CERRADAS PARA MODIFICACIÓN <?php use SymfonyComponentEventDispatcherEventDispatcher; $dispatcher = new EventDispatcher(); $listener = new AcmeListener(); $dispatcher->addListener('action', array($listener, 'onFooAction')); Event Dispatcher (Patrón Mediator)
  25. 25. LSP -LISKOV SUBSTITUTION PRINCIPLE PRINCIPIO DE SUBSTITUCIÓN DE LISKOV
  26. 26. LSP -LISKOV SUBSTITUTION PRINCIPLE PRINCIPIO DE SUBSTITUCIÓN DE LISKOV DEBE SER POSIBLE UTILIZAR CUALQUIER OBJETO INSTANCIA DE UNA SUBCLASE EN LUGAR DE CUALQUIER OBJETO INSTANCIA DE SU SUPERCLASE SIN QUE LA SEMÁNTICA DEL PROGRAMA ESCRITO EN LOS TÉRMINOS DE LA SUPERCLASE SE VEA AFECTADO.
  27. 27. LSP -LISKOV SUBSTITUTION PRINCIPLE PRINCIPIO DE SUBSTITUCIÓN DE LISKOV DEBE SER POSIBLE UTILIZAR CUALQUIER OBJETO INSTANCIA DE UNA SUBCLASE EN LUGAR DE CUALQUIER OBJETO INSTANCIA DE SU SUPERCLASE SIN QUE LA SEMÁNTICA DEL PROGRAMA ESCRITO EN LOS TÉRMINOS DE LA SUPERCLASE SE VEA AFECTADO.SI S ES UN SUBTIPO DE T, ENTONCES LOS OBJETOS DE TIPO T PUEDEN SER REEMPLAZADOS POR LOS OBJETOS DE TIPO S.
  28. 28. LSP -LISKOV SUBSTITUTION PRINCIPLE PRINCIPIO DE SUBSTITUCIÓN DE LISKOV CADA CLASE QUE HEREDA DE OTRA PUEDE USARSE COMO SU PADRE SIN NECESIDAD DE CONOCER LAS DIFERENCIAS ENTRE ELLAS.
  29. 29. LSP -LISKOV SUBSTITUTION PRINCIPLE PRINCIPIO DE SUBSTITUCIÓN DE LISKOV class Application extends Container implements HttpKernelInterface, TerminableInterface {} CADA CLASE QUE HEREDA DE OTRA PUEDE USARSE COMO SU PADRE SIN NECESIDAD DE CONOCER LAS DIFERENCIAS ENTRE ELLAS. SilexApplication
  30. 30. LSP -LISKOV SUBSTITUTION PRINCIPLE PRINCIPIO DE SUBSTITUCIÓN DE LISKOV class Application extends Container implements HttpKernelInterface, TerminableInterface { } SilexApplication use SilexApplication; $app = new Application();
  31. 31. LSP -LISKOV SUBSTITUTION PRINCIPLE PRINCIPIO DE SUBSTITUCIÓN DE LISKOV class Application extends Container implements HttpKernelInterface, TerminableInterface { } SilexApplication use SilexApplication; $app = new Application(); SilexApplication PimpleContainer
  32. 32. ISP - INTERFACE SEGREGATION PRINCIPLE PRINCIPIO DE SEGREGACIÓN DE INTERFACES
  33. 33. ISP - INTERFACE SEGREGATION PRINCIPLE PRINCIPIO DE SEGREGACIÓN DE INTERFACES MUCHAS INTERFACES ESPECÍFICAS SON MEJORES QUE UNA INTERFAZ DE PROPÓSITO GENERAL.
  34. 34. ISP - INTERFACE SEGREGATION PRINCIPLE PRINCIPIO DE SEGREGACIÓN DE INTERFACES interface StreamIface { public function open(); public function read(); public function write(); }
  35. 35. ISP - INTERFACE SEGREGATION PRINCIPLE PRINCIPIO DE SEGREGACIÓN DE INTERFACES interface StreamIface { public function open(); public function read(); public function write(); } class File implements StreamIface
  36. 36. ISP - INTERFACE SEGREGATION PRINCIPLE PRINCIPIO DE SEGREGACIÓN DE INTERFACES interface StreamIface { public function open(); public function read(); public function write(); } class File implements StreamIface class ReadOnlyFile implements StreamIface ?
  37. 37. ISP - INTERFACE SEGREGATION PRINCIPLE PRINCIPIO DE SEGREGACIÓN DE INTERFACES interface ReadableStreamIface { public function open(); public function read(); } interface WritableStreamIface { public function write(); } class ReadOnlyFile implements ReadableStreamIface class File implements ReadableStreamIface, WritableStreamIface
  38. 38. ISP - INTERFACE SEGREGATION PRINCIPLE PRINCIPIO DE SEGREGACIÓN DE INTERFACES class Application extends Container implements HttpKernelInterface, TerminableInterface {...} SilexApplication use SilexApplication; $app = new Application(); TerminableInterface HttpKernelInterface
  39. 39. DIP - DEPENDENCY INVERSION PRINCIPLE PRINCIPIO DE INVERSIÓN DE DEPENDENCIAS LAS ABSTRACCIONES NO DEBERÍAN DEPENDER DE DETALLES SINO QUE LOS DETALLES DEBERÍAN DEPENDER DE LAS ABSTRACCIONES.
  40. 40. LAS ABSTRACCIONES NO DEBERÍAN DEPENDER DE DETALLES SINO QUE LOS DETALLES DEBERÍAN DEPENDER DE LAS ABSTRACCIONES. LOS MÓDULOS DE ALTO NIVEL NO DEBERÍAN DEPENDER DE MÓDULOS DE BAJO NIVEL, AMBOS DEBERÍAN DEPENDER DE ABSTRACCIONES. DIP - DEPENDENCY INVERSION PRINCIPLE PRINCIPIO DE INVERSIÓN DE DEPENDENCIAS
  41. 41. class ChickenPizza extends BasePizza { private $ingredients; public function __construct() { $this->ingredients[] = new Chicken(); $this->ingredients[] = new Cheese(); $this->ingredients[] = new Fruit(); } } $chickenPizza = new ChickenPizza(); $chickenPizza->make(); DIP - DEPENDENCY INVERSION PRINCIPLE PRINCIPIO DE INVERSIÓN DE DEPENDENCIAS
  42. 42. $chickenPizza = new Pizza(); $chickenPizza->appendIngredient(new Chicken()); $chickenPizza->appendIngredient(new Cheese()); $chickenPizza->appendIngredient(new Fruit()); $chickenPizza->make(); DIP - DEPENDENCY INVERSION PRINCIPLE PRINCIPIO DE INVERSIÓN DE DEPENDENCIAS
  43. 43. class Pizza implements IngredientStackIface { private $ingredients; public function appendIngredient(Ingredient $ingredient) { $this->ingredients[] = $ingredient; } public function make() { } } DIP - DEPENDENCY INVERSION PRINCIPLE PRINCIPIO DE INVERSIÓN DE DEPENDENCIAS
  44. 44. use SymfonyComponentConfigFileLocator; $chickenPizza = new Pizza(); $locator = new FileLocator(__DIR__); $loader = new YamlFileLoader($chickenPizza, $locator); $loader->load('config.yml'); $chickenPizza->make(); Config component: http://blog.servergrove.com/2014/02/21/symfony2-components-overview-config/ DIP - DEPENDENCY INVERSION PRINCIPLE PRINCIPIO DE INVERSIÓN DE DEPENDENCIAS
  45. 45. SI PERO, ¿MERECE LA PENA TODO ESTO?
  46. 46. SI PERO, ¿MERECE LA PENA TODO ESTO? TODO ESTO SE HACE POR ...
  47. 47. SI PERO, ¿MERECE LA PENA TODO ESTO? TODO ESTO SE HACE POR ... €
  48. 48. SI PERO, ¿MERECE LA PENA TODO ESTO? EFICIENCIA VS MANTENIMIENTO TODO ESTO SE HACE POR ... €
  49. 49. SI PERO, ¿MERECE LA PENA TODO ESTO? EFICIENCIA VS MANTENIMIENTO TODO ESTO SE HACE POR ... € SYMFONY -> SOLID PERO Y NUESTRA APP?
  50. 50. PROGRAMAR ES FÁCIL. PROGRAMAR BIEN ES MUY COMPLICADO.
  51. 51. GRACIAS / ESKERRIK ASKO & BE SOLID MY FRIEND! ¿PREGUNTAS? ¿APLAUSOS? :) Gonzalo Ayuso @gonzalo123 http://gonzalo123.com https://github.com/gonzalo123

×