SOLID es un acrónimo de los cinco principios del diseño orientado a objetos (OOD Object Oriented Design) creados por Uncle Bob, quien también es coautor de los principios del desarrollo web agile.
Los cinco principios son:
S. Single responsibility principle
O. Open/Closed principle
L. Liskov substitution principle
I. Interface segregation principle
D. Dependency Inversion Principle
Estos principios combinados facilitan al desarrollador crear proyectos fáciles de mantener y expandir.
- Single responsibility principle
Una clase sólo debe tener un motivo para cambiar, lo que significa que sólo debe tener una tarea. Tenemos varias figuras de las que después queremos calcular su área total:
Class Circle
{
public $radius;
public function __construct($radius)
{
$this->radius = $radius;
}
}
Class Square
{
public $length;
public function __construct($length)
{
$this->length = $length;
}
}
Primero creamos las clases de las figuras y dejamos que los constructores se encarguen de recibir las medidas necesarias.
Ahora creamos la clase AreaCalculator, que recibe un array con los objetos de cada una de las figuras para ser sumadas:
class AreaCalculator
{
protected $shapes;
public function __construct($shapes = array())
{
$this->shapes = $shapes;
}
public function sum()
{
// Aquí va la lógica para sumar todas las áreas
}
public function output()
{
return implode('', array(
"<h1>",
"Suma de todas las áreas: ",
$this->sum(),
"</h1>"
));
}
}
Para utilizar la clase AreaCalculator simplemente instanciamos la clase y le pasamos un array con las figuras, mostrando el output al final:
$shapes = array (
new Circle(3),
new Square(4)
);
$areas = new AreaCalculator($shapes);
echo $areas->output();```
El problema del método output es que la clase AreaCalculator además de calcular las áreas maneja la lógica de la salida de los datos. El problema surge cuando queremos mostrar los datos en otros formatos como json, por ejemplo.
El principio Single responsibility determinaría en este caso que AreaCalculator sólo calculase el área, y que la funcionalidad de la salida de los datos de produjera en otra entidad. Para ello podemos crear la clase SumCalculatorOutputter, que determinará como mostraremos los datos de las figuras. Con esta clase el código quedaría así:
¿Quieres ver más aportes, preguntas y respuestas de la comunidad?
o inicia sesión.