IMPORTANT: Per accedir als fitxer de subversion: http://acacha.org/svn (sense password). Poc a poc s'aniran migrant els enllaços. Encara però funciona el subversion de la farga però no se sap fins quan... (usuari: prova i la paraula de pas 123456)

SOLID

Conjunt de patrons o principis de disseny introduïts per Michael Feathers per fer referència als primers 5 principis definits per uncle Bob per al disseny de programari orientat a objectes.

S = Single Responsibility Principle
O = Opened Closed Principle 
L = Liscov Substitution Principle
I = Interface Segregation Principle
D = Dependency Inversion Principle

Single responsibility

Single responsibility és el primer patró de tot el conjunt i el que ens diu és que, en una classe, mai ha d'haver més d'una raó per modificar o dit d'un altra forma, una classe ha de tenir una i només una responsabilitat.

Imatge que ens mostra la raó

Aquest principi diu que si tenim una classe que té més d'una raó per canviar o més d'una responsabilitat general, cal dividir la classe en múltiples classes i que cadascuna tingui la seva única responsabilitat. Això provoca la pregunta, puc tenir diversos mètodes en una sola classe? I la resposta és sí, sense cap dubte però sempre i quan compleixin amb la idea de tindre una classe amb un únic propòsit.

Raons importants d'aquest principi:

  • Cada responsabilitat és un eix de canvi.
  • El codi queda mesclat si les classes tenen més d'una responsabilitat.

Exemple

El codi següent és el típic exemple que fa tot el contrari del que ens explica el disseny de codi SRG. Com se pot observar, és una classe que està fent 3 cosses diferents, connectar-se a la base de dades i agafar la informació necessària, utilitzar un mètode per a calcular una informació relacionada amb les vendes realitzades i imprimir la sortida d'aquesta informació:

 
<?php namespace NT\Reporting;


Use Auth, DB, Exception;


class SalesReporter {


    public function between($startDate,$endDate)
    {

        //Perform authentication
        if( ! Auth::check()) throw new Exception('Authentication required for reporting');

        //get sales from db
        $sales =$this->queryDBSalesBetween($startDate,$endDate);

        //Return results
        return $this->format($sales);

    }

    protected function queryDBForSalesBetween($startDate,$endDate)
    {

        return DB::table('sales')->whereBetween('created_at')[$startDate,$endDate])->sum('charge')/100;

    }

    protected function format ($sales)
    {

        return "<h1>Sales: $sales</h1>";

    }

}

<?php


interface SalesOutputInterface{

    function output();
    
}

<?php namespace NT\Reporting;


class HtmlOutput implements SalesOutputInterface{

    public function output($sales)
    {

        return "<h1>Sales: $sales</h1>";
    }
    
}
public function between($startDate, $endDate, SalesOutputInterface $formatter)
{
    $sales = $this->repo->between($startDate, $endDate);

     return $formatter->output($sales);
}

SOLID principles example with Laravel

Vegeu també

Enllaços externs