Codigo limpio y refactorización

"No nos llames, nosotros te llamamos". Este principio delega el control principal a un framework o componente de mayor nivel. Es común en frameworks como Spring, Angular, y Django.

Este principio enfatiza la idea de control inverso: en lugar de que un componente de bajo nivel controle el flujo de ejecución, el componente de alto nivel es quien decide cuándo y cómo interactuar con el componente de bajo nivel. Es fundamental en patrones como Inversión de Control (IoC) y Inyección de Dependencias (DI).

¿Cómo Funciona?

  • En el desarrollo tradicional, los componentes de bajo nivel llaman a los componentes de alto nivel para ejecutar ciertas acciones. Esto crea una fuerte dependencia entre ellos, lo que puede dificultar la mantenibilidad y escalabilidad del sistema.

  • Con el principio de Hollywood:

    • Los componentes de bajo nivel están registrados o inyectados en los de alto nivel.
    • Los componentes de alto nivel deciden cuándo y cómo llamar a los de bajo nivel.

¿Dónde se Aplica?

  • Inversión de Control (IoC): Frameworks como Spring o .NET Core gestionan el ciclo de vida de los objetos, inyectándolos según sea necesario.
  • Callbacks: Los callbacks en lenguajes como JavaScript siguen este principio: el sistema llama a tu función cuando sucede un evento.
  • Patrón Observador: En patrones como el observador, los objetos registrados son notificados por un componente principal cuando ocurre un cambio.

Código Malo

1class Motor {
2    public void encender() {
3        System.out.println("Motor encendido");
4        Auto auto = new Auto();
5        auto.notificarEncendido();
6    }
7}
8
9class Auto {
10    public void notificarEncendido() {
11        System.out.println("El auto ha sido notificado que el motor está encendido");
12    }
13}

Problema: El flujo de control lo maneja el desarrollador, lo que dificulta la escalabilidad.

Solución: El framework controla el flujo de ejecución, haciendo el código más modular.

  • Desacoplamiento: Los componentes de bajo nivel no necesitan saber cómo funcionan los de alto nivel.
  • Flexibilidad: Es fácil reemplazar o modificar los componentes de bajo nivel sin afectar el resto del sistema.
  • Reutilización: Los componentes de bajo nivel son más reutilizables, ya que no dependen de implementaciones específicas.
  • Escalabilidad: Facilita la integración de nuevos componentes sin afectar los existentes.

Código Bueno

1class Motor {
2    public void encender() {
3        System.out.println("Motor encendido");
4    }
5}
6
7class Auto {
8    private Motor motor;
9
10    public Auto(Motor motor) {
11        this.motor = motor;
12    }
13
14    public void iniciar() {
15        System.out.println("Iniciando el auto...");
16        motor.encender(); // El Auto llama al Motor
17        System.out.println("El auto está funcionando");
18    }
19}
20
21public class PrincipioHollywood {
22    public static void main(String[] args) {
23        Motor motor = new Motor();
24        Auto auto = new Auto(motor);
25        auto.iniciar();
26    }
27}
  • Loading...