¡ELIMINA el Caos! Implementa el Principio de Segregación de Interfaces en SOLID

Repositorio:github.com/JamiltonQuintero/S...
Discord: / discord
Twitch: / jamiltonquinteroosorio
Git personal: github.com/JamiltonQuintero?t...
Git Entrevistador: github.com/EntrevistadorIntel...
Avanzamos en nuestra serie sobre los principios SOLID y llegamos a la 'I', el Principio de Segregación de Interfaces. Este principio establece que los clientes no deberían verse obligados a depender de interfaces que no utilizan. En términos más simples, sugiere que es mejor tener muchas interfaces específicas de cliente en lugar de una interfaz general única. Este enfoque reduce el acoplamiento y aumenta la cohesión, haciendo que los sistemas de software sean más flexibles y fáciles de mantener.
En este video, explicaremos en detalle cómo aplicar el Principio de Segregación de Interfaces con ejemplos prácticos de código. Veremos cómo dividir interfaces grandes en interfaces más pequeñas y específicas, y cómo esto puede mejorar significativamente la calidad y manejabilidad de tu código. Analizaremos casos de uso reales y discutiremos cómo evitar el diseño de interfaces infladas que pueden llevar a un código frágil y difícil de modificar.
Acompáñanos en esta exploración profunda para entender mejor cómo la segregación de interfaces puede beneficiar tus proyectos de desarrollo. No olvides suscribirte para seguir recibiendo contenido educativo sobre los principios SOLID y comparte tus experiencias y preguntas en los comentarios. ¡Vamos a construir juntos un software más eficiente y modular!
🌎 Mis Redes Sociales
Sigueme en Linkedin : / jamilton-alonso-quinte...
Sigueme en TikTok : www.tiktok.com/@jamilton.quin...

Пікірлер: 7

  • @JamiltonQO
    @JamiltonQOАй бұрын

    Buenas mi gente continuando con esta entrega de videos. Hoy vemos la letra I. Recuerden que si tienen alguna duda por favor háganmelo saber en los comentarios. Si te gusto este video apoyadlo con un like

  • @gjcardonam
    @gjcardonamАй бұрын

    Excelente información, mil gracias

  • @JamiltonQO

    @JamiltonQO

    Ай бұрын

    Gracias popr el apoyo mi rey 😀😀 me alegra mucho que te gustara el video

  • @lara97196516
    @lara9719651628 күн бұрын

    Amigo, excelente trabajo. Me parece muy valioso su contenido. Tenga una consulta: cuando se empieza a segregar las funcionalidades, cómo logras controlar en la implementación que exista un método específico, es decir, cuando tienes una sola interfaz, no hay problema porque si o si todas las clases implementan el contrato, pero cuando ya tienes muchas interfaces cómo controlas que exista cierto método? La verdad esa parte me confunde. Sería chévere que colocaras la implementación completa del ejercicio de la impresora. Gracias 🙏🏻

  • @JamiltonQO

    @JamiltonQO

    27 күн бұрын

    Hola, Gracias por tu comentario y por apreciar el contenido. Cuando segregamos las interfaces, es importante diseñarlas de tal manera que cada una represente una funcionalidad específica y cohesiva. Para controlar que una clase implemente los métodos necesarios puedes ahcer uso de las interfaces compuestas que es tomar comportamientos de otras interfaces que obligaran a el cliente o clase a implementarla si llenar de n interfaces ejemplo. public interface IPrint { void print(Document document); } public interface IScan { void scan(Document document); } public interface IFax { void fax(Document document); } public interface IMultiFunctionDevice extends IPrint, IScan, IFax { } public class MultiFunctionPrinter implements IMultiFunctionDevice De esta manera, puedes asegurarte de que ciertos métodos específicos estén presentes en tus clases, incluso cuando utilices múltiples interfaces. Es cierto que al final no hay una regla de oro para esto y podrías hacerlo de muchas formas. Pero piensa que esta es una manera en la que puedes dividir y segmentar tus interfaces correctamente, asegurando que cada cliente solo implemente lo que realmente necesita.

  • @lara97196516

    @lara97196516

    27 күн бұрын

    @@JamiltonQO Muchas gracias amigo, por siempre contestar nuestras inquietudes. Me parece super interesante este tema. Disculpa mi atrevimiento, pero quiero exponerte el siguiente caso para tener mayor contexto de este principio y siguiendo tu sugerencia. Supongamos que necesitamos un servicio que procese por medio de un parámetro diferentes tipos de cupones (Cupones Empleado, Cupones Cortesía y Cupones Dinero). Todos los cupones tienen un proceso en particular, canjear cupón, pero no todos los cupones tienen la opción de anular un canje, es decir, solo cupón dinero y cortesía pueden anularse. Mi duda surge porque siempre que se ejecuta el servicio, espera un cupón por abstracción (dinero, empleado, cortesía) , pero no todos los cupones pueden anular y la aplicación pueden caer por falta de esa validación. Te agradecería enormemente tu apoyo para saber lo mejor en estos casos 🙏🏻 public interface RedeemCoupon { void Redeem(); } public interface CancellableCoupon { void Cancel(); } public interface CouponGeneric : RedeemCoupon, CancellableCoupon { } // cupon empleado solo puede redimirse // y si le implemento CouponGeneric estaría dejando metodos vacios public class EmployeeCoupon : RedeemCoupon { public void Redeem() { Console.WriteLine("Employee coupon redeemed."); } } // cupon Cortesia si implementa los dos metodos public class CourtesyCoupon : CouponGeneric { public void Redeem() { Console.WriteLine("Courtesy coupon redeemed."); } public void Cancel() { Console.WriteLine("Courtesy coupon redemption voided."); } } // Cupon dinero si implementa los dos metodos public class MoneyCoupon : CouponGeneric { public void Redeem() { Console.WriteLine("Money coupon redeemed."); } public void Cancel() { Console.WriteLine("Money coupon redemption voided."); } } // el tema es que acá no puedo pasar cupón empleado // ya que esta clase recibe es un CouponGeneric // sin embargo, cupón empleado no tiene CancelCoupon // acá es donde no entiendo public class CouponManager { private readonly CouponGeneric _coupon; public CouponManager(CouponGeneric coupon) { _coupon = coupon; } public void RedeemCoupon() { _coupon.Redeem(); } public void CancelCoupon() { _coupon.Cancel(); } }

  • @JamiltonQO

    @JamiltonQO

    24 күн бұрын

    ​@@lara97196516 Holaaaa luis mil disculpas la demora en responder esta semana a sido una completa locura para mí. No por favor, pero si para mí es un completo gusto. Mira el tema aqui esta en que si las clases premium tienen diferentes comportamientos debes hacer uso de patrones tipo factory o factory method para instanciar el tipo de capón según la necesidad y que ejecute o no los métodos de cancelación. O por defecto haciendo uso de tipo Java lo hace que se hace List d = new Arraylist Esto de ta acceso a metodos que tiene o no tiene otras clases. Te dejo un ejemplo aqui La clave es piensa como usas los metodos clases en Java que te da acceso a mas o menos comportamientos. Delega logicas a clases intermedias tipo constructoras o Gestionadoras y alli segun el tipo de Cupon decides si puede o no cancelar. Por favor si esto resuelve la duda hazmelo saber sino lo seguimos revisando. Saludos querido amigo. Bendiciones public class Main { public static void main(String[] args) { RedeemCoupon employeeCoupon = new EmployeeCoupon(); CancellableCoupon courtesyCoupon = new CourtesyCoupon(); CancellableCoupon moneyCoupon = new MoneyCoupon(); CouponManager manager1 = new CouponManager(employeeCoupon); manager1.redeemCoupon(); manager1.cancelCoupon(); // Output: This coupon cannot be cancelled. CouponManager manager2 = new CouponManager(courtesyCoupon); manager2.redeemCoupon(); manager2.cancelCoupon(); // Output: Courtesy coupon redemption voided. CouponManager manager3 = new CouponManager(moneyCoupon); manager3.redeemCoupon(); manager3.cancelCoupon(); // Output: Money coupon redemption voided. } } public class CouponManager { private final RedeemCoupon redeemCoupon; public CouponManager(RedeemCoupon redeemCoupon) { this.redeemCoupon = redeemCoupon; } public void redeemCoupon() { redeemCoupon.redeem(); } public void cancelCoupon() { if (redeemCoupon instanceof CancellableCoupon) { ((CancellableCoupon) redeemCoupon).cancel(); } else { System.out.println("This coupon cannot be cancelled."); } } } // Cupon empleado solo puede redimirse public class EmployeeCoupon implements RedeemCoupon { @Override public void redeem() { System.out.println("Employee coupon redeemed."); } } // Cupon Cortesia puede redimirse y anularse public class CourtesyCoupon implements CancellableCoupon { @Override public void redeem() { System.out.println("Courtesy coupon redeemed."); } @Override public void cancel() { System.out.println("Courtesy coupon redemption voided."); } } // Cupon dinero puede redimirse y anularse public class MoneyCoupon implements CancellableCoupon { @Override public void redeem() { System.out.println("Money coupon redeemed."); } @Override public void cancel() { System.out.println("Money coupon redemption voided."); } } public interface RedeemCoupon { void redeem(); } public interface CancellableCoupon extends RedeemCoupon { void cancel(); }