<?xml version="1.0"?>
<rss version="2.0">
   <channel>
      <title>Principios SOLID by Marcelo Gustavo Garcia Cruz</title>
      <link>https://padlet.com/marcelogustavogarciacruz/tgsr24397f6p6eks</link>
      <description>Los principios SOLID son un conjunto de cinco principios básicos de la programación orientada a objetos que buscan crear software más limpio, mantenible y extensible. Estos principios fueron introducidos por Robert C. Martin y han sido ampliamente adoptados en la comunidad de desarrollo de software.</description>
      <language>en-us</language>
      <pubDate>2024-11-16 02:44:58 UTC</pubDate>
      <lastBuildDate>2024-11-16 03:15:13 UTC</lastBuildDate>
      <webMaster>hello@padlet.com</webMaster>
      <image>
         <url></url>
      </image>
      <item>
         <title>S: Single Responsibility Principle (Principio de Responsabilidad Única)</title>
         <author>marcelogustavogarciacruz</author>
         <link>https://padlet.com/marcelogustavogarciacruz/tgsr24397f6p6eks/wish/3219695731</link>
         <description><![CDATA[<p>El SRP establece que una clase debe tener una única razón para cambiar. En otras palabras, una clase debe tener una sola responsabilidad bien definida. Esto significa que todos los métodos y atributos de una clase deben estar estrechamente relacionados con esa única responsabilidad.</p><p><strong>¿Por qué es importante?</strong></p><ul><li><p><strong>Mayor mantenibilidad:</strong> Cuando una clase tiene una sola responsabilidad, es más fácil de entender y modificar. Si necesitas cambiar algo, sabrás exactamente dónde buscar.</p></li><li><p><strong>Menor acoplamiento:</strong> Al separar las responsabilidades en diferentes clases, reduces el acoplamiento entre ellas. Esto significa que los cambios en una clase tienen menos impacto en otras partes del sistema.</p></li><li><p><strong>Facilidad de prueba:</strong> Las clases con una sola responsabilidad son más fáciles de probar de forma aislada.</p></li><li><p><strong>Reutilización de código:</strong> Classes con responsabilidades bien definidas son más fáciles de reutilizar en diferentes partes de una aplicación.</p><p><br></p><p><strong>Ejemplo:</strong></p><p>Imagina una clase llamada Usuario. Si esta clase se encarga de gestionar los datos del usuario, su autenticación y enviar correos electrónicos, está violando el SRP. Tendríamos que cambiar esta clase cada vez que queramos modificar cualquier aspecto de estas responsabilidades.</p><p>Una mejor solución sería crear tres clases diferentes:</p><ul><li><p>Usuario: Se encarga de almacenar los datos del usuario.</p></li><li><p>Autenticacion: Se encarga de autenticar al usuario.</p></li><li><p>CorreoElectronico: Se encarga de enviar correos electrónicos.</p></li></ul><p>Cada clase tiene una única responsabilidad, lo que hace el código más limpio y mantenible.</p></li></ul>]]></description>
         <enclosure url="https://padlet-uploads.storage.googleapis.com/3043496206/c544a9615171b6d917fac7e5ccfd8acd/image.png" />
         <pubDate>2024-11-16 03:02:48 UTC</pubDate>
         <guid>https://padlet.com/marcelogustavogarciacruz/tgsr24397f6p6eks/wish/3219695731</guid>
      </item>
      <item>
         <title>O: Open-Closed Principle (Principio de Abierto-Cerrado)</title>
         <author>marcelogustavogarciacruz</author>
         <link>https://padlet.com/marcelogustavogarciacruz/tgsr24397f6p6eks/wish/3219696804</link>
         <description><![CDATA[<p>El Principio de Abierto-Cerrado (OCP) es uno de los principios SOLID fundamentales en la programación orientada a objetos. Establece que una entidad de software (como una clase, módulo, función, etc.) debe estar <strong>abierta a la extensión</strong> pero <strong>cerrada a la modificación</strong>. En otras palabras, deberías poder agregar nuevas funcionalidades a una clase sin tener que cambiar su código existente.</p><p><strong>¿Por qué es importante?</strong></p><ul><li><p><strong>Mantenibilidad:</strong> Al evitar modificar el código existente, reduces el riesgo de introducir nuevos errores.</p></li><li><p><strong>Estabilidad:</strong> Un sistema que cumple con el OCP es más estable, ya que los cambios se realizan agregando nuevas funcionalidades en lugar de modificar las existentes.</p></li><li><p><strong>Reusabilidad:</strong> Las clases diseñadas siguiendo el OCP son más fáciles de reutilizar en diferentes contextos.</p></li><li><p><strong>Facilidad de prueba:</strong> Al no modificar el código existente, es más sencillo escribir pruebas unitarias y mantenerlas actualizadas.</p></li></ul><p><strong>Ejemplo:</strong></p><p>Imagina que tienes una aplicación de figuras geométricas. Inicialmente, solo tienes clases para calcular el área de círculos y cuadrados. Más adelante, necesitas calcular el área de triángulos. Si no aplicas el OCP, tendrías que modificar la clase que calcula el área, añadiendo una nueva condición para los triángulos.</p><p>Aplicando el OCP, crearías una interfaz FiguraGeometrica con un método calcularArea(). Luego, crearías clases Circulo, Cuadrado y Triangulo que implementen esta interfaz. Al agregar una nueva figura, solo tendrías que crear una nueva clase que implemente la interfaz, sin modificar las clases existentes.</p><p><br/></p>]]></description>
         <enclosure url="https://padlet-uploads.storage.googleapis.com/3043496206/4171cdc3bb56a4209b6009716fc4a7e6/image.png" />
         <pubDate>2024-11-16 03:05:10 UTC</pubDate>
         <guid>https://padlet.com/marcelogustavogarciacruz/tgsr24397f6p6eks/wish/3219696804</guid>
      </item>
      <item>
         <title>L: Liskov Substitution Principle (Principio de Sustitución de Liskov)</title>
         <author>marcelogustavogarciacruz</author>
         <link>https://padlet.com/marcelogustavogarciacruz/tgsr24397f6p6eks/wish/3219697568</link>
         <description><![CDATA[<p>El Principio de Sustitución de Liskov (LSP) es otro principio fundamental dentro de SOLID. Establece que <strong>un objeto de una subclase debe poder ser utilizado en lugar de un objeto de su clase base sin que se altere el correcto funcionamiento del programa</strong>. En otras palabras, si tienes una clase base y una subclase, cualquier lugar donde se espera un objeto de la clase base, debería poder recibir un objeto de la subclase sin que se produzcan errores inesperados.</p><p><strong>¿Por qué es importante?</strong></p><ul><li><p><strong>Mantiene la jerarquía de clases:</strong> El LSP garantiza que la relación "es un" entre una clase base y una subclase se mantenga.</p></li><li><p><strong>Facilita la reutilización de código:</strong> Si una subclase puede reemplazar a su clase base, puedes escribir código más genérico que funcione con cualquier objeto de la jerarquía.</p></li><li><p><strong>Mejora la mantenibilidad:</strong> Al asegurar que las subclases no rompen el contrato de la clase base, se reduce la probabilidad de introducir errores al modificar el código.</p></li></ul><p><strong>¿Cuándo se viola el LSP?</strong></p><ul><li><p><strong>Contrato roto:</strong> Cuando una subclase modifica el comportamiento de un método heredado de manera que no es compatible con el contrato de la clase base.</p></li><li><p><strong>Precondiciones más fuertes:</strong> Si una subclase impone restricciones más fuertes en los parámetros de un método que la clase base.</p></li><li><p><strong>Postcondiciones más débiles:</strong> Si una subclase devuelve un resultado menos preciso o menos completo que el prometido por la clase base.</p></li><li><p><strong>Excepciones adicionales:</strong> Si una subclase lanza excepciones que no son esperadas por la clase base.</p></li></ul><p><strong>Ejemplo:</strong></p><p>Imagina una jerarquía de clases con una clase base Rectangulo y subclases Cuadrado y RectanguloEscaleno. Si intentas hacer que Cuadrado herede de Rectangulo y luego cambias el tamaño de un cuadrado, estarías violando el LSP, ya que cambiar la altura de un cuadrado también cambia su ancho, lo cual no es válido para un rectángulo en general.</p>]]></description>
         <enclosure url="https://padlet-uploads.storage.googleapis.com/3043496206/7c606a85a6a7b5a99ffca855f7cc7958/image.png" />
         <pubDate>2024-11-16 03:06:59 UTC</pubDate>
         <guid>https://padlet.com/marcelogustavogarciacruz/tgsr24397f6p6eks/wish/3219697568</guid>
      </item>
      <item>
         <title>I: Interface Segregation Principle (Principio de Segregación de Interfaces)</title>
         <author>marcelogustavogarciacruz</author>
         <link>https://padlet.com/marcelogustavogarciacruz/tgsr24397f6p6eks/wish/3219699735</link>
         <description><![CDATA[<p>El Principio de Segregación de Interfaces (ISP) establece que <strong>muchas interfaces pequeñas son mejores que una interfaz grande</strong>. En otras palabras, en lugar de tener una única interfaz que contenga todos los métodos que un cliente podría necesitar, es preferible crear múltiples interfaces más específicas, cada una con un conjunto más reducido de métodos.</p><p><strong>¿Por qué es importante?</strong></p><ul><li><p><strong>Acoplamiento reducido:</strong> Al dividir una interfaz grande en varias más pequeñas, se reduce el acoplamiento entre las clases que implementan esas interfaces. Esto significa que los cambios en una interfaz tienen un impacto menor en otras partes del sistema.</p></li><li><p><strong>Mayor cohesión:</strong> Cada interfaz se enfoca en un conjunto específico de responsabilidades, lo que aumenta la cohesión interna de las clases que la implementan.</p></li><li><p><strong>Flexibilidad:</strong> Al permitir que las clases implementen solo las interfaces que necesitan, se aumenta la flexibilidad del sistema.</p></li><li><p><strong>Mejor mantenibilidad:</strong> Un sistema con interfaces más pequeñas es más fácil de entender y mantener.</p></li></ul><p><strong>¿Cuándo se viola el ISP?</strong></p><ul><li><p><strong>Interfaces "gordas":</strong> Cuando una interfaz contiene muchos métodos que no son necesarios para todos los clientes que la implementan.</p></li><li><p><strong>Clases que implementan métodos innecesarios:</strong> Cuando una clase se ve obligada a implementar métodos de una interfaz que no utiliza.</p></li></ul><p><strong>Ejemplo:</strong></p><p>Imagina una aplicación que gestiona diferentes tipos de impresoras. Podríamos tener una interfaz Impresora con métodos como imprimirDocumento, imprimirImagen y escanearDocumento. Sin embargo, no todas las impresoras pueden escanear. Al obligar a todas las clases que implementan Impresora a implementar el método escanearDocumento, estaríamos violando el ISP.</p><p>Una mejor solución sería crear dos interfaces: Impresora (con los métodos imprimirDocumento e imprimirImagen) y Escáner (con el método escanearDocumento). Las impresoras que pueden escanear implementarían ambas interfaces.</p>]]></description>
         <enclosure url="https://padlet-uploads.storage.googleapis.com/3043496206/70f53dcc13c9baca375c1bdf71f94e65/image.png" />
         <pubDate>2024-11-16 03:11:59 UTC</pubDate>
         <guid>https://padlet.com/marcelogustavogarciacruz/tgsr24397f6p6eks/wish/3219699735</guid>
      </item>
      <item>
         <title>D: Dependency Inversion Principle (Principio de Inversión de Dependencias)</title>
         <author>marcelogustavogarciacruz</author>
         <link>https://padlet.com/marcelogustavogarciacruz/tgsr24397f6p6eks/wish/3219701033</link>
         <description><![CDATA[<p>El Principio de Inversión de Dependencias (DIP) establece que:</p><ul><li><p><strong>Las clases de alto nivel no deben depender de las clases de bajo nivel.</strong> Ambas deberían depender de abstracciones (como interfaces).</p></li><li><p><strong>Las abstracciones no deben depender de los detalles.</strong> Los detalles (implementaciones concretas) deben depender de las abstracciones.</p></li></ul><p>En términos más simples, esto significa que las clases no deben estar acopladas directamente a implementaciones concretas, sino a interfaces o clases abstractas.</p><p>¿Por qué es importante?</p><ul><li><p><strong>Desacoplamiento:</strong> Reduce la dependencia entre módulos, haciendo el sistema más flexible y fácil de cambiar.</p></li><li><p><strong>Reusabilidad:</strong> Al depender de abstracciones, las clases se vuelven más reutilizables en diferentes contextos.</p></li><li><p><strong>Testabilidad:</strong> Es más fácil crear pruebas unitarias al aislar las clases de sus dependencias concretas.</p></li><li><p><strong>Mantenibilidad:</strong> Los cambios en las implementaciones concretas tienen un menor impacto en el resto del sistema.</p></li></ul><p>¿Cómo se aplica el DIP?</p><ul><li><p><strong>Interfaces:</strong> Define interfaces para representar las abstracciones.</p></li><li><p><strong>Inyección de dependencias:</strong> En lugar de instanciar directamente las clases de bajo nivel, estas se inyectan en las clases de alto nivel a través del constructor o propiedades.</p></li><li><p><strong>Contenedores de inversión de control (IoC):</strong> Herramientas que automatizan la gestión de las dependencias y la inyección de las mismas.</p></li></ul><p>Ejemplo</p><p>Imagina una aplicación que envía notificaciones por correo electrónico. Sin aplicar el DIP, una clase Notificador podría depender directamente de una clase ServicioCorreoElectronico. Si quisiéramos cambiar el proveedor de correo electrónico, tendríamos que modificar la clase Notificador.</p><p>Aplicando el DIP, crearíamos una interfaz IServicioCorreoElectronico y la clase Notificador dependería de esta interfaz. Luego, en el momento de ejecutar la aplicación, se inyectaría una implementación concreta del servicio de correo electrónico (por ejemplo, Gmail, Outlook).</p>]]></description>
         <enclosure url="https://padlet-uploads.storage.googleapis.com/3043496206/c0e7d5eaf1ddf044b53f7302265fe890/image.png" />
         <pubDate>2024-11-16 03:15:11 UTC</pubDate>
         <guid>https://padlet.com/marcelogustavogarciacruz/tgsr24397f6p6eks/wish/3219701033</guid>
      </item>
   </channel>
</rss>
