Object Composition en PHP


Lección 22 / 24

Object Composition en PHP

Php Desarrollador Php Curso php

Hemos dicho que una de las actividades fundamentales en un proyecto creado con lenguajes de programación orientados a objetos es establecer relaciones entre clases.
En la programación orientada a objetos, dos formas de relacionar clases son la herencia (que vimos anteriormente) y el Object Composition, que analizaremos en este artículo.

Como pudimos entender, la relación de herencia dificulta el cambio de clase padre, ya que estos cambios afectarían a todas las clases hijo que, por tanto, tendrían que ser readaptadas.

En este sentido, sin embargo, la composición proporciona un enfoque que facilita mucho la modificación del código.

Además, a diferencia de la herencia, la composición es más dinámica, ya que cada objeto puede ser reemplazado por otro objeto siempre que sea del mismo tipo.
Sin embargo, también evita la construcción de clases jerárquicas enormes y por lo tanto inmanejables.

Por otro lado, la Object Composition es, sin embargo, más compleja que la herencia, ya que conduce a un aumento en el número de objetos instanciados.

¿Confundido? No temas. Traduzcamos lo dicho a código, reutilizando nuestro querido ejemplo anterior del ordenador.

Creación de un objeto a través de la Composition

En el ejemplo del capítulo anterior, hablando de Dependency Injection, declaramos cómo la clase Computer usaba la clase MotherBoard para funcionar.
Dado que MotherBoard es un concepto muy amplio (diferentes formatos, diferentes tipos de zócalos de CPU, diferentes tipos de RAM compatibles, etc.), podemos pensar en transformar MotherBoard en una clase abstracta.

abstract class MotherBoard{

    public $format;
    public $socket;
    public $ram;
}

Pasemos, pues, a crear clases que amplíen la clase abstracta, cada una para cada tipo de placa base.

class MsiB550 extends MotherBoard{

    public function __construct($format, $socket, $ram){
        $this->format = 'ATX';
        $this->socket = 'AM4';
        $this->ram = 'DDR4';
    }
}

class MsiCreator extends MotherBoard{

    public function __construct($format, $socket, $ram){
        $this->format = 'E-ATX';
        $this->socket = 'TRX4';
        $this->ram = 'DDR4';
    }
}

Ahora, podemos volver a nuestro Computer, tal como la dejamos en el capítulo anterior.

class Computer {

    public $motherBoard;

    public function __construct(MotherBoard $motherBoard){
        $this->motherBoard = $motherBoard;
    }
}

Gracias a la Object Composition podemos componer, de hecho, una instancia de la clase Computer como queramos: de hecho, las clases MsiB550 y MsiCreator, al extender la clase abstracta MotherBoard, comparten su tipo (o interfaz).
Esto se traduce en la posibilidad de llamar a la función constructora, sin dejar de respetar el type hinting de la Dependency Injection.

$computer1 = new Computer(new MsiB550());
$computer2 = new Computer(new MsiCreator());


echo $computer1->motherBoard->format . "\n";
echo $computer2->motherBoard->format;

//Output:

// ATX
// E-ATX

Este tipo de gestión nos ha permitido crear dos instancias de la clase Computer que son completamente diferentes entre sí y que potencialmente pueden comportarse de forma totalmente diferente. No está mal, ¿eh?

Herencia VS Object Composition: ¿cuál usar?

Como sucede a menudo en el mundo de la programación informática, un desarrollador web puede, no pocas veces, encontrarse en una encrucijada. En este punto de nuestras lecciones de php habrás asimilado las diferencias entre herencia y Object Composition.
Pero, ¿cuál elegir entre los dos?
¡No te sientas confundid@! Desde un punto de vista puramente didáctico, deberíamos elegir entre herencia y composición en función de la relación que queramos expresar:

  • se prefiere la herencia cuando un objeto de una clase secundaria también es un objeto de la clase principal: por ejemplo, Persona -> Profesor. Este tipo de relación se llama is-a;

  • la composición, en cambio, es preferible cuando una instancia de una clase tiene, en su interior, una instancia de otra clase, sin ningún tipo de vínculo hereditario: por ejemplo, Computadora -> Placa base. Este tipo de relación se llama has-a.

P.D. este razonamiento también se puede transferir a los métodos:

  • si todos los métodos de una clase deben ser también de otra, entonces se usa la herencia;

     

  • si algunos métodos de una clase no deben ser también métodos de otra, entonces usamos el Object Composition.

© 2022 Aulab. Todos los derechos reservados • P.IVA: IT07647440721 • Política de privacidad