Haciendo del Desarrollo y la Arquitectura Web, ciencia y pasión.

Single Responsability Principle, SRP

El principio de la única responsabilidad es tan sencillo como su nombre indica. Una clase solo debe tener una única función o cometido. A primera vista podría parecer sencillo y trivial pero en ocasiones no es así y es facil caer en la tentación: "ya que estoy aqui le meto esto también". Se acaba teniendo clases que hacen infinidad de cosas dificultando el mantenimiento y el testeo. Una clase con menos responsabilidades que otra tendra más garantías de perdurar en el tiempo, sin estar sujeta a reiteradas mejoras y actualizaciones. Supongamos una clase encargada de hacer una única tarea. Aplicar aqui reusabilidad de codigo será siempre más fácil que si heredamos una librería con miles de lineas y n funciones que habrá que repasar para poder integrar en nuestro código. El principio de la unica responsabilidad o SRP, por sus siglas en ingles establece que:

Solo debe haber un motivo para cambiar una clase, en el sentido de que solo debe tener una unica tarea.

Supongamos que tenemos un código como el siguiente. Tenemos nuestras clases básicas y una tercera que efectua una operación sobre ellas:


class A {
    public $myA;

    public function __construct($a) {
        $this->myA = $a;
    }
}


class B {
    public $myB;

    public function __construct($b) {
        $this->myB = $b;
    }
}


class Operator{
	protected $items;
	public function __construct ($itemsArray){
		$this->items = $itemsArray;
	}

	public function opAB(){
	 // opero
return $res; } public function print(){ print_r ($this->opAB()); } }

 $objs = array( new a(1), new a(5), new b(4) ); 
$op = new Operator($objs);
$op->print();

Es evidente que nuestra clase operator efectua más de una tarea. Si hubieramos querido hacer un cambio en la presentación del resultado de la operación nos veriamos obligados al cambio de lógica ajena. Si el formateo de la salida hubiera sido necesario cambiarlo, por ejemplo para devolve XML o json, tendriamos que cambiar la clase operator que es lo que queremos evitar con este principio. Precisaríamos una segunda clase especializada en formatear.

       $objs = array( new a(1), new a(5), new b(4) ); 
$op = new Operator($objs);
$result = $op->opAB();

$operatorPrinter = new OperatorPrinter ($result);
$operatorPrinter->json();
$operatorPrinter->XML();