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)

Definició

Conjunt de patrons de disseny (Disseny Orientat a Objectes).

Principis

Single Responsibity

1- Primer principi --> S

Responsabilidad individual

Una classe hauria de tenir una, i només una, raó per canviar-la. (A class should have one, and only one, reason to change.)
Si una classe té moltes raons per canviar-la vol dir que fa més d'una cosa, potser és millor que faci sols un metòde.
Objectius
1 - Autenticar --> Comprova que esta autenticat, es pot fer en una excepció.
2 - Report --> Agafa la informació de la base de dades.
3 - Pintar --> mostrar el resultat.
Llibreria Carbon --> per treballar amb dades que fan qualsevol cosa.

Uns dels objectius era el de Autenticació, amb el primer principi se n'encarrega d'eliminar-lo perquè la classe sols faci una cosa.

Capa de persistencià --> On es guarda la informació de la base de dades.
Injecció de dependencies --> pel tema de les relacions.

Exemple

SalesReporter.php

<?php namespace Acme\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->queryDBForSalesBetween($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>";
 }
}

routes.php

<?php

Route::get('/', function()
{
   $report = new Acme\Reporting\SalesReporter();

   $begin = Carbon\Carbon::now()->subDays(10);
   $end = Carbon\Carbon::now();

   return $report->between($begin, $end);
});

Single Responsibility Principle example with Laravel

Requeriments

* Tenir insta·lat Laravel5.
* La màquina virtual Homestead.
* Utilitzar Github per al control de versions.
* Usar un editor de php (Ex: PhpStorm).

Configuració

Creem la carpeta github per guardar els projectes (si no la tenim crearà)

mkdir github && cd github 

Entrem dins hi generem el nou laravel i entrem dins

laravel new solid_laravel
cd solid_laravel

L'iniciem per poder pujar-lo al github.

git init

Creem un nou repositori amb al github amb el mateix nom (solid_laravel)

git remote add origin [email protected]:AlexMartCap/solid_laravel.git
git remote -v
git pull origin master
git status
git add .
git commit -a -m "First commit" 
git push origin master

D'aquesta forma es pujarà al github. (S'ha de tenir la clau configurarà al github, PD: No hem funciona d'aquesta forma, pujat de la forma tradicional però efectiva.(git clone)).

Open-Closed

2- Segon principi --> O

Obert-Tancat

Les entitats han d'estar oberts per a l'extensió, però tancat per a la modificació. --> (Entities should be open for extension, but closed for modification)
Canviar el comportament sense modificar el codi font... --> (Change behavior without modifying source code...)
Aquest codi apesta. --> (Avoid code rot)
Comportament extensible separada darrere d'una interfície, i voltejar les dependències. --> (Separate extensible behavior behind an interface, and flip the dependencies)

Liskov Substitution

3- Tercer principi --> L

Substitució de Liskov

Interface Segregation

4- Quart principi --> I

Interfície Segregació

Dependency Inversion

5- Quint principi --> D

Vocabulari (The Service Container "Laravel")

  • Dependency Injection, DI ( Injecció de dependencies): es defineix com a un patró de disseny orientat a objecte, en el que es subministren objectes a un classe en lloc de ser la pròpia classe qui crea l'objecte.

(Relacions entre les nostres classes)

routes.php

<?php

class Baz{}

class Bar {
 public $baz;

 public function __contruct(Baz, $baz
 {
    $this->baz = $baz;
 }
}

  • Dissenyar per contracte (Ex: Interficies)

Una interfície ens diu la (high level), recordem que hi han de high level i de low level.


$bar = App::make('BarInterface');

Vegeu també

* SOLID
* Single Responsibility Principle example with Laravel
* Single Responsibility Principle example with Laravel Solution1

Enllaços Externs

* Solid
* Single Responsibility
* Open-Closed
* https://github.com/AlexMartCap/solid_laravel