Your SlideShare is downloading. ×
SOLID and Symfony. deSymfonyDay 2014
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

SOLID and Symfony. deSymfonyDay 2014

5,229

Published on

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

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

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

No Downloads
Views
Total Views
5,229
On Slideshare
0
From Embeds
0
Number of Embeds
19
Actions
Shares
0
Downloads
16
Comments
0
Likes
3
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. ¿QUE SOMOS?
  • 2. ¿QUIÉN SOY YO?
  • 3. ¿QUIÉN SOY YO? Gonzalo Ayuso @gonzalo123 http://gonzalo123.com https://github.com/gonzalo123
  • 4. ¿QUIÉN SOY YO? Gonzalo Ayuso @gonzalo123 http://gonzalo123.com https://github.com/gonzalo123
  • 5. katayunos.com ¿QUIÉN SOY YO? Gonzalo Ayuso @gonzalo123 http://gonzalo123.com https://github.com/gonzalo123
  • 6. ¿QUE SOMOS?
  • 7. ¿QUE SOMOS?Pogramadores
  • 8. ¿QUE SOMOS?Pogramadores ¿A QUÉ DEDICAMOS NUESTRO TIEMPO?
  • 9. ¿QUE SOMOS?Pogramadores ¿A QUÉ DEDICAMOS NUESTRO TIEMPO?A programar
  • 10. ¿QUE SOMOS?Pogramadores ¿A QUÉ DEDICAMOS NUESTRO TIEMPO?A programar
  • 11. ¿QUE SOMOS?Pogramadores ¿A QUÉ DEDICAMOS NUESTRO TIEMPO?A programarA leer
  • 12. ¿QUE SOMOS?Pogramadores ¿A QUÉ DEDICAMOS NUESTRO TIEMPO?A programarA leer
  • 13. $this->createUser(true);
  • 14. $this->createUser(true); ¿?¿? ¿?
  • 15. S.O.L.I.D.
  • 16. S.O.L.I.D. ROBERT. C. MARTIN (THE CLEAN CODE) Single responsibility, Open-closed, Liskov substitution, Interface segregation, Dependency inversion
  • 17. SRP - SINGLE RESPONSIBILITY PRINCIPLE PRINCIPIO DE RESPONSABILIDAD ÚNICA
  • 18. SRP - SINGLE RESPONSIBILITY PRINCIPLE PRINCIPIO DE RESPONSABILIDAD ÚNICA CADA COMPONENTE => UNA RESPONSABILIDAD
  • 19. SRP - SINGLE RESPONSIBILITY PRINCIPLE PRINCIPIO DE RESPONSABILIDAD ÚNICA CADA COMPONENTE => UNA RESPONSABILIDAD UNA RESPONSABILIDAD = UNA RAZÓN DE CAMBIO
  • 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. OCP - OPEN/CLOSED PRINCIPLE PRINCIPIO DE ABIERTO/CERRADO
  • 22. OCP - OPEN/CLOSED PRINCIPLE PRINCIPIO DE ABIERTO/CERRADO LAS ENTIDADES DE SOFTWARE DEBEN SER ABIERTAS PARA EXTENDER, PERO CERRADAS PARA MODIFICACIÓN
  • 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. 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. LSP -LISKOV SUBSTITUTION PRINCIPLE PRINCIPIO DE SUBSTITUCIÓN DE LISKOV
  • 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. 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. 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. 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. LSP -LISKOV SUBSTITUTION PRINCIPLE PRINCIPIO DE SUBSTITUCIÓN DE LISKOV class Application extends Container implements HttpKernelInterface, TerminableInterface { } SilexApplication use SilexApplication; $app = new Application();
  • 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. ISP - INTERFACE SEGREGATION PRINCIPLE PRINCIPIO DE SEGREGACIÓN DE INTERFACES
  • 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. ISP - INTERFACE SEGREGATION PRINCIPLE PRINCIPIO DE SEGREGACIÓN DE INTERFACES interface StreamIface { public function open(); public function read(); public function write(); }
  • 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. 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. 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. 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. 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. 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. 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. $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. 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. 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. SI PERO, ¿MERECE LA PENA TODO ESTO?
  • 46. SI PERO, ¿MERECE LA PENA TODO ESTO? TODO ESTO SE HACE POR ...
  • 47. SI PERO, ¿MERECE LA PENA TODO ESTO? TODO ESTO SE HACE POR ... €
  • 48. SI PERO, ¿MERECE LA PENA TODO ESTO? EFICIENCIA VS MANTENIMIENTO TODO ESTO SE HACE POR ... €
  • 49. SI PERO, ¿MERECE LA PENA TODO ESTO? EFICIENCIA VS MANTENIMIENTO TODO ESTO SE HACE POR ... € SYMFONY -> SOLID PERO Y NUESTRA APP?
  • 50. PROGRAMAR ES FÁCIL. PROGRAMAR BIEN ES MUY COMPLICADO.
  • 51. GRACIAS / ESKERRIK ASKO & BE SOLID MY FRIEND! ¿PREGUNTAS? ¿APLAUSOS? :) Gonzalo Ayuso @gonzalo123 http://gonzalo123.com https://github.com/gonzalo123

×