name: title class: left, top background-image: url(images/rawpixel/brick-pattern.jpg) background-size: cover # .whiteinline[.fancy[[TE3] Principios SOLID]] ### .whiteinline[· Guía rápida] <br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/> .whiteinline[.right[Carlos Granell· Universitat Jaume I]] .whiteinline[.right[EI1039 - Diseño de Software · Sep 2023]] ??? Black wooden brick textured background Image credits: [Rawpixel.com](https://www.rawpixel.com/image/578505/) --- class: inverse, center, middle # ¿Qué son los patrones de diseño? ## .acidinline[Soluciones habituales y bien testeadas a] ## .fatinline[problemas recurrentes (dependencias, fragilidad, etc.)] ## .coldinline[en un contexo (diseño de software orientado a objetos)] --- class: inverse, center, middle # Principios básicos de diseño de software .large[(presentes en casi todos los patrones de diseño)] --- name: principle-encapsulate background-image: url(images/rawpixel/balance.jpg) background-size: cover ###
Encapsula lo que varía y sepáralo de lo que no cambia .right[.large[
Minimiza/aisla el efecto provocado por los cambios]] ??? Stones Wooden Table Group of Objects Concept Image credits: [Rawpixel.com](https://www.rawpixel.com/image/69379/) --- name: principle-interface background-image: url(images/rawpixel/balance.jpg) background-size: cover ###
Programa a una interfaz, no a una implementación .right[.large[
Diseño flexible depende de abstracciones,]] .right[.large[no de clases concretas]] ??? Stones Wooden Table Group of Objects Concept Image credits: [Rawpixel.com](https://www.rawpixel.com/image/69379/) --- name: principle-composition background-image: url(images/rawpixel/balance.jpg) background-size: cover ###
Favorece la composición sobre la herencia .right[.large[
HAS-A puede ser mejor que IS-A]] ??? La herencia es probablemente la forma más obvia de reutilizar código entre clases. Tienes dos clases con el mismo código. Creas una clase base común para estas dos clases y colocas dentro el código similar. Fet! Puedes hacer más débil una dependencia haciendo que tu código dependa de interfaces o clases abstractas en lugar de clases concretas En vez de heredar un comportamiento, un objeto obtiene un comportamiento cuando _se compone_ con un objeto de ese comportamiento. Stones Wooden Table Group of Objects Concept Image credits: [Rawpixel.com](https://www.rawpixel.com/image/69379/) --- class: bottom, center background-image: url(images/rawpixel/airquality.jpg) background-size: cover # .whiteinline[¿Cómo reconocéis el aire de baja calidad?] ??? ¿Cómo reconocemos que el aire de de baja calidad? ¿Que síntomas observamos? Pollution collage element, torn paper design Image credits: [Rawpixel.com](https://www.rawpixel.com/image/6792062/) --- class: bottom, center background-image: url(images/rawpixel/sw-code.jpg) background-size: cover # .whiteinline[¿Cómo reconocéis código "malo"?] ??? ¿Qué pasa cuando se modifica código malo? Síntomas del código malo: dependencia, fragilidad, rigidez, falta de reutilización o inmobilidad, viscosidad Software developer programming code on black background Image credits: [Rawpixel.com](https://www.rawpixel.com/image/593170) --- class: inverse, center, middle # Principios # .cold[SOLID] .large[**5** principios del diseño orientado a objetos para que el software sea más comprensible, flexible y fácil de mantener .small[<a name=cite-martin2002></a>[[Mar02](http://blog.cleancoder.com/uncle-bob/2020/10/18/Solid-Relevance.html)]]] -- .large[y reducir la **complejidad** de sistemas/aplicaciones a medida que crecen] -- .large[y **prevenir** los síntomas del código malo] ??? Receta contra los síntomas del código malo. Principios SOLID introducidos por Robert Martin (*Uncle Bob*) en 2000: [Design Principles and Design Patterns](http://staff.cs.utu.fi/~jounsmed/doos_06/material/DesignPrinciplesAndPatterns.pdf) [SOLID: The First 5 Principles of Object Oriented Design | DigitalOcean](https://www.digitalocean.com/community/conceptual-articles/s-o-l-i-d-the-first-five-principles-of-object-oriented-design) --- name: srp class: left ### .cold[S]ingle Responsability Principle - Principo de responsabilidad única .large[
Una clase debería tener un único propósito] .large[
Una clase solo debe tener una (única y buena) razón para cambiar] -- .large[
Si una clase hace demasiadas tareas, hay que cambiarla cada vez que una de esas tareas cambia] .large[
[Principo de diseño encapsulación](#principle-encapsulate)] - .large[Junta las tareas que cambian *por las mismas razones* en una clase] - .large[Separa las tareas que cambian *por diferentes razones* en clases distintas] .large[
Reduce complejidad, fácil entender qué hace una clase] ??? Reduce complejidad: Si una clase hace demasiadas cosas, hay que cambiarla cada vez que una de esas cosas cambia Easier to understand: Classes, software components and microservices that have only one responsibility are much easier to explain, understand and implement than the ones that provide a solution for everything. This reduces the number of bugs, improves your development speed, and makes your life as a software developer a lot easier [https://stackify.com/solid-design-principles/](https://stackify.com/solid-design-principles/) --- name: ocp class: left ### .cold[O]pen/Closed Principle - Principio de abierto/cerrado .large[
Las clases deben estar abiertas a la extensión pero cerradas a la modificación] -- .large[
**Cerrada a la modificación**: Si una clase está desarrollada, probada y revisada, *no* la reescribas para añadir nuevas funcionalidades] .large[
**Abierta a la extensión**: Si necesitas nuevo comportamiento, *crea subclases*] .large[
[Principo de diseño interfaz](#principle-interface)] - .large[Extender una clase permite añadir nuevo comportamiento sin descomponer clientes existentes de la clase original] ??? Abierta y cerrada no son mutuamente excluyentes. Una clase puede estar al mismo tiempo abierta (para la extensión) y cerrada (para la modificación). El código simple es tanto abierto y cerrado. Of course, the one exception to the rule is when fixing bugs in existing code. [https://stackify.com/solid-design-open-closed-principle/](https://stackify.com/solid-design-open-closed-principle/) --- name: lsp class: left ### .cold[L]iskov Substitution Principle - Principio de sustitución de Liskov .large[
Si la clase A es un subtipo de la clase B, deberíamos poder reemplazar B por A sin descomponer el comportamiento de nuestro programa] -- .large[
Principio de diseño del sentido común] - .large[Escribe abstracciones claras y bien definidas] - .large[Subclases deben ser compatibles con (el comportamiento) de la clase padre] - .large[Al sobrescribir un método, extiende el comportamiento base en lugar de sustituirlo por algo totalmente distinto] ??? Escribe abstracciones nítidas, claras y bien definidas. [https://stackify.com/solid-design-liskov-substitution-principle/](https://stackify.com/solid-design-liskov-substitution-principle/) --- name: isp class: left ### .cold[I]nterface Segregation Principle - Principio de segregación de la interfaz .large[
Mantén las interfaces pequeñas para no forzar a las clases a qeu implementen métodos que no necesitan] -- .large[
No forzar a clientes (implementaciones) que dependan de métodos que no utilizan] .large[
Si una interfaz es demasiado grande, sepárala en varias interfaces más pequeñas, pero qeu sean *funcionalmente* más concisas] ??? [https://stackify.com/interface-segregation-principle/](https://stackify.com/interface-segregation-principle/) --- name: dip class: left ### .cold[D]ependency Inversion Principle - Principio de inversión de dependencia .large[
Clases de alto nivel (componentes, servicios) no deben depender de clases de bajo nivel.] -- .large[
**Desacoplamiento** de módulos/componentes/clases] .large[
[Principo de diseño composición](#principle-composition)] - .large[Componentes/entidades deben depender de abstracciones, no de implementaciones] ??? Clases de bajo nivel implementan operaciones básicas como transferir datos por la red. Clases de alto nivel contienen la lógica de negocio que indican a las clases de bajo nivel que hagan algo El uso del operador `new` crea dependencias fuertes entre clases [https://stackify.com/dependency-inversion-principle/](https://stackify.com/dependency-inversion-principle/) --- # .cold[SOLID] con ejemplos .large[.small[<a name=cite-milington2022></a>[[Mil22](https://www.baeldung.com/solid-principles)]] Ejemplos claros y sencillos en Java para entender los principios SOLID] .large[.small[<a name=cite-oloruntoba2020></a><a name=cite-soysal2022></a>[[Olo21](https://www.digitalocean.com/community/conceptual-articles/s-o-l-i-d-the-first-five-principles-of-object-oriented-design); [Soy22](https://betterprogramming.pub/solid-principles-with-almost-real-life-examples-in-java-b292a4e2c18b)]] Más ejemplos] .large[.small[<a name=cite-martin2014></a>[[Mar14](https://www.youtube.com/watch?v=TMuno5RZNeE)]] Charla de Robert Martín (creador principios) in Yale] --- # Referencias <a name=bib-martin2002></a>[Martin, Robert](#cite-martin2002) (2002). _Agile Software Development: Principles, Patterns, and Practices_. Pearson Education, 1st edition. ISBN: 978-0135974445. URL: [http://blog.cleancoder.com/uncle-bob/2020/10/18/Solid-Relevance.html](http://blog.cleancoder.com/uncle-bob/2020/10/18/Solid-Relevance.html). <a name=bib-martin2014></a>[\-\-\-](#cite-martin2014) (2014). _SOLID Principles of Objetc Oriented & AGILE Design (video)_. URL: [https://www.youtube.com/watch?v=TMuno5RZNeE](https://www.youtube.com/watch?v=TMuno5RZNeE). <a name=bib-milington2022></a>[Milignton, Sam](#cite-milington2022) (2022). _A Solid Guide to SOLID: Principles_. URL: [https://www.baeldung.com/solid-principles](https://www.baeldung.com/solid-principles). <a name=bib-oloruntoba2020></a>[Oloruntoba, Samuel](#cite-oloruntoba2020) (2021). _SOLID: The First 5 Principles of Object Oriented Design_. URL: [https://www.digitalocean.com/community/conceptual-articles/s-o-l-i-d-the-first-five-principles-of-object-oriented-design](https://www.digitalocean.com/community/conceptual-articles/s-o-l-i-d-the-first-five-principles-of-object-oriented-design). <a name=bib-soysal2022></a>[Soysal, Berke](#cite-soysal2022) (2022). _SOLID Principles With (almost) Real-Life Examples in Java_. URL: [https://betterprogramming.pub/solid-principles-with-almost-real-life-examples-in-java-b292a4e2c18b](https://betterprogramming.pub/solid-principles-with-almost-real-life-examples-in-java-b292a4e2c18b).