Jsou Laravel fasády zlo?

PHP

POZOR! Článek jsem napsal před více jak rokem, a tudíž už nemusí reflektovat můj nynější názor nebo může být zastaralý.

Už nějakou dobu přemýšlím nad tím, jestli jsou fasády ve frameworku Laravel špatné či dobré řešení. Odpověď není jednoznačná, alespoň pro mě ne. Zpočátku jsem je zcela odsuzoval, ale nakonec si myslím, že jsou případy, kdy dávají smysl. Zajímalo by mne i jak to vidíte vy, a proto bych se chtěl podělit o své dumání a porovnat naše názory.
 


Nejprve je potřeba říci si pro a proti.

Hlavní výhoda fasád

Kód je úspornější.

Vezměme například situaci, kdy máme 10 kontrolerů a máme podobný kód:

<?php

use Illuminate\Routing\Controller;
use Illuminate\Contracts\Routing\ResponseFactory;

final class HomepageController extends Controller
{
    private $response;

    public function __construct(ResponseFactory $response)
    {
        $this->response = $response;
    }

    public function index()
    {
        return $this->response->json("OK");
    }
}

Pomocí fasády to lze zkrátit na:

<?php

use Illuminate\Routing\Controller;
use Illuminate\Support\Facades\Response;

final class HomepageController extends Controller
{
    public function index()
    {
        return Response::json("OK");
    }
}

Mnohem hezčí, že?

Nevýhody fasád

1. Je to magie

Na první pohled při použití dependency injection místo fasád je jasně vidět, jakou třídu ve skutečnosti používáte. Fasáda to celé obalí do statického volání a zahalí to. Například do PHPStormu je potřeba kvůli správnému napovídání plugin, minoritnější IDE se mohou jít klouzat.

2. Horší přenositelnost kódu

Samotná dokumentace Laravelu nedoporučuje nadužívání fasád a použití, pokud vyvíjíte například nějakou knihovnu. Zde je kámen úrazu, protože v dokumentaci je preferována v ukázkách fasáda a lidé následně mohou dojít k názoru, že je to best practice.

Při použití fasád není na první pohled zřejmá závislost, oproti přesnému definování závislostí v konstruktoru.

Co z toho vyplývá?

Vidím pouze dvě situace, kdy fasády dávají smysl:

  1. Části aplikace pevně spjaté s frameworkem – například kontroler.
  2. Drobné aplikace, kde je rozhodující rychlost vývoje.

Ta druhá situace je možná diskutabilní, protože kde je hranice malé a středně velké aplikace? Navíc i u drobných aplikací bychom se měli snažit o znovupoužitelnost.

Všude jinde jsou pro mne fasády antipattern.

Laravel fasády tedy obecně jako zlo neberu, ale je třeba vědět, kde a kdy je použít.

Jaký je na to váš názor?

Znáte někoho, komu by článek mohl pomoct? Zasdílejte mu ho :)

Komentáře