Merida Design Blog

Publicado el | Artículos / , ,

S.O.L.I.D. Principios de programación orientada a objetos: Sustitución de Liskov

Este principio establece lo siguiente:

Sea q(x) una propiedad provable de objetos x de tipo T, entonces q(y) debe ser provable para los objetos y de tipo S, siendo S un subtipo de T.

Lo que esto quiere decir es que, todas las clases derivadas de otra clase deben ser sustituibles por su clase padre sin que esto afecte el funcionamiento.

Para demostrar este principio vamos a extender la clase que usamos para realizar la sumatoria de áreas en los artículos anteriores AreaCalculator creando una nueva clase para el cálculo de volumen llamada VolumeCalculator.

class VolumeCalculator extends AreaCalculator {
    public function __construct($shapes = array()) {
        parent::__construct($shapes);
    }
		
    public function sum() {
        // lógica para calcular la sumatoria de volumen y regresar el resultado.
	
        return $summentData;
    }
}

Nota: En la programación orientada a objetos cuando extendemos una clase debemos iniciar el constructor con una llamada al constructor de la clase padre para asegurarnos de heredar las mismas propiedades.

Veamos ahora el código de la clase SumCalculatorOutputter (mencionada al final del primer artículo).

class SumCalculatorOutputter {
    protected $calculator;
		
    public function __constructor(AreaCalculator $calculator) {
        $this->calculator = $calculator
    }
		
    public function JSON() {
        $data = array(
            'sum' => $this->calculator->sum();
        );
			
        return json_encode($data);
    }
		
    public function HTML() {
        return implode('', array(
            '<h1>',
                'Sumatoría de las áreas de las figuras proporcionadas: ',
                $this->calculator->sum(),
            '</h1>'
        ));
    }
		
    public function XML() { ... }
}

Ahora hacemos uso de nuestras clases:

$areas = new AreaCalculator($shapes);
$volumes = new VolumeCalculator($solidShapes);
	
$output = new SumCalculatorOutputter($areas);
$output2 = new SumCalculatorOutputter($volumes);
	

Como puedes adivinar, los objetos $output y $output2 serán instanciados sin problemas aunque hemos proporcionado distintas clases ya que la clase VolumeCalculator es intercambiable con su clase padre AreaCalculator, cumpliendo con esto el Principio de Sustitución de Liskov.


Conclusión

Este principio ayuda a que nuestros módulos sean fácilmente reutilizados sin tener que modificarlos.
En el siguiente artículo veremos el Principio de la Segregación de Interfaz



Publicaciones que pueden interesarte

    Deja un comentario

      tope
    Derechos Reservados, Merida Design 2017
    %d bloggers like this: