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

GITHUB -> https://github.com/cinek19/solid_laravel

Solid es un conjunt de patrons de disseny. Les lletres volen dir, Single responsability, Open-closed, Liskov substitution, Interface segretgation i Dependency inversion.

L'objectiu de SOLID es aconseguir que els programes creats seguint aquests principis seguin més fàcils de mantenir i estendre en el futur.

HighLevelDesign.png

Single Responsability

Single responsibility principle

Al definir una clase, la clase hauria de tindre una sola responsabilitat, només hauria de fe una feina. L'objectiu es perque ens interesa cambiar el codi lo menos posible, per a poder reutilitzar sense cambiar lo menos posible.

Un metode fa soles una cosa.

Injeccio de dependencies, pel tema de les relacions, per exemple al construct(SalesRepository $repo)

En POO s'han de fer execpcions, per anar bé, amb el try cache.

Codi al principi

<?php namespace Acme\Reporting;
use Auth, DB, Exception;

class SalesReporter{

public function between($startDate, $endDate){

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

$sales = $this->queryDBForSalesBetween($startDate, $endDate);

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>";
}

Codi bo

class SalesReporter{

private $repo;

public function __construct(SalesRepository $repo)
{
$this->repo = $repo;
}

public function between($startDate, $endDate, SalesOutputInterface $formatter)
{
$sales = $this->repo->between($startDate, $endDate);

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

}


Open close

Open/Closed principle

Es trata basicament de fer el codi extensible, pero no modificable. Generealitza el codi. Camviar el comportament sense modificar el codi font.

Per exemple, cambiar de guardar-ho tot en fitxer, a guardar-ho tot en base de dades.


Liskov substituttion

Liskov substitution principle


Interface segregation

ISP: Interface segregation principle

Dependency inversion

DIP: Dependency inversion principle


IoC Container

Injeccció de dependencies.

S'utlitza el bind per a ajuntar dos clases, la forma manual sempre mana sobre la l'automàtica.

Vegeu també

Enllaços Externs