Načrtovalski vzorci

Obstaja mnogo načinov za strukturiranje kode in projekta za vašo spletno aplikacijo in v to lahko vložite ogromno ali pa malo premisleka v arhitekturo. Vendar je ponavadi dobra ideja, da se sledi pogostim vzorcem, ker bo vašo kodo naredilo enostavnejšo za upravljanje in enostavnejšo drugim za razumevanje.

Tovarna

Eden najpogosteje uporabljanih načrtovalskih vzorcev je vzorec tovarne. V tem vzorcu razred enostavno naredi objekt, ki ga želite uporabiti. Premislite o sledečem primeru vzorca tovarne:

<?php
class Automobile
{
    private $vehicleMake;
    private $vehicleModel;

    public function __construct($make, $model)
    {
        $this->vehicleMake = $make;
        $this->vehicleModel = $model;
    }

    public function getMakeAndModel()
    {
        return $this->vehicleMake . ' ' . $this->vehicleModel;
    }
}

class AutomobileFactory
{
    public static function create($make, $model)
    {
        return new Automobile($make, $model);
    }
}

// have the factory create the Automobile object
$veyron = AutomobileFactory::create('Bugatti', 'Veyron');

print_r($veyron->getMakeAndModel()); // outputs "Bugatti Veyron"

Ta koda uporablja tovarno za izdelavo objekta Automobile. Na voljo sta dve možni prednosti za gradnjo vaše kode po tej poti; prva je, da če potrebujete naknadno spremeniti, preimenovati ali zamenjati razred Automobile, lahko to storite samo s spremembo kode v tovarni, namesto na vsakem mestu v vašem projektu, ki uporablja razred Automobile. Druga možna prednost je, da če je izdelava objekta komplicirano opravilo, lahko vso delo opravite v tovarni namesto ponavljanja vsakokrat, ko želite narediti novo instanco.

Uporaba tovarniškega vzorca ni vedno potrebna (ali pametna). Primer kode uporabljene tu je tako enostavna, da bi bila tovarna enostavno dodajanje nepotrebne kompleksnosti. Vendar če izdelujete dokaj velik ali kompleksen projekt, si lahko prihranite precej težav na poti z uporabo tovarn.

Enojni vzorec (singleton)

Ko se načrtuje spletne aplikacije, je pogosto smiselno konceptualno in arhitekturno dovoliti dostop do ene in samo ene instance določenega razreda. To nam omogoči narediti enojni vzorec.

Koda zgoraj implementira enojni vzorec z uporabo statične spremenljivke in statične izdelovalne metode getInstance(). Upoštevajte sledeče:

Enojni vzorec je uporaben, ko moramo zagotoviti, da imamo samo enojno instanco razreda za celoten cikel zahtevka v spletni aplikaciji. To se običajno zgodi, ko imamo globalne objekte (kot je razred ‘Configuration’) ali deljeni vir (kot je čakalna vrsta dogodkov).

Morate paziti, ko uporabljate enojni vzorec, saj po svoji naravi uvede globalno stanje v vašo aplikacijo, kar zmanjša možnost testiranja. V večini primerov, injiciranje odvisnosti je lahko (in bi moralo) biti uporabljeno na mestu enojnega razreda. Uporaba injiciranja odvisnosti pomeni, da ne uvajamo nepotrebnih skupkov v načrt naše aplikacije, saj objekt, ki uporablja deljeni ali globalni vir, ne potrebuje znanja o konkretno definiranem razredu.

Strategija

S strateškim vzorcem zaobjamete specifične družine algoritmov, kar dovoljuje klientnem razredu, ki je odgovoren za instantizacijo določenega algoritma, da nima znanja aktualne implementacije. Na voljo je nekaj variacij strateškega vzorca, najenostavnejši je izpostavljen spodaj:

Prvi odrezek kode orisuje družino algoritmov; morda želite serializirano polje, nekaj JSON ali morda samo polje podatkov:

<?php

interface OutputInterface
{
    public function load();
}

class SerializedArrayOutput implements OutputInterface
{
    public function load()
    {
        return serialize($arrayOfData);
    }
}

class JsonStringOutput implements OutputInterface
{
    public function load()
    {
        return json_encode($arrayOfData);
    }
}

class ArrayOutput implements OutputInterface
{
    public function load()
    {
        return $arrayOfData;
    }
}

Z zaobjemom zgornjega algoritma ga delate lepega in čistega v vaši kodi, da ostali razvijalci lahko enostavno dodajo nove izhodne tipe brez vplivanja na kodo klienta.

Videli boste, kako vsak konkreten ‘output’ razred izvede OutputInterface - to ima dvojen namen, primarno ponuja enostavno naročilo, katero mora biti ubogano s strani katerekoli nove konkretne izvedbe. Drugič, z implementacijo pogostega vmesnika boste videli v naslednji sekciji, da lahko sedaj uporabite t.i. Type Hinting, da zagotovite, da je klient, ki je uporabil ta vedenja, pravilnega tipa, v tem primeru ‘OutputInterface’.

Naslednji odrezek kode opisuje, kako klic razreda klienta lahko uporabi enega teh algoritmon ali celo boljše nastavi zahtevano vedenje pri izvajanju:

<?php
class SomeClient
{
    private $output;

    public function setOutput(OutputInterface $outputType)
    {
        $this->output = $outputType;
    }

    public function loadOutput()
    {
        return $this->output->load();
    }
}

Razred klienta, ki kliče zgoraj ima privatno lastnost, ki mora biti nastavljena pri izvajanju in biti tipa ‘OutputInterface’, ko je enkrat ta lastnost nastavljena, bo klic loadOutput() poklical metodo load() v konkretnem razredu izhodnega tipa, ki je bil nastavljen.

<?php
$client = new SomeClient();

// Want an array?
$client->setOutput(new ArrayOutput());
$data = $client->loadOutput();

// Want some JSON?
$client->setOutput(new JsonStringOutput());
$data = $client->loadOutput();

Sprednji krmilnik

Vzorec sprednjega krmilnika je, kjer imate enojno vstopno točko za vašo spletno aplikacijo (na primer index.php), ki ravna vse zahtevke. Ta koda je odgovorna za nalaganje vseh odvisnosti, ki obdelujejo zahtevek in pošiljajo odziv brskalniku. Vzorec sprednjega krmilnika je lahko koristen, ker spodbuja modularno kodo in vam ponuja centralni prostor za povezavo kode, ki bi morala biti gnana za vsak request (kot je čiščenje vnosa).

Model-pogled-krmilnik (MVC)

Vzorec model-pogled-krmilnik (MVC - Model-View-Controller) in njegova sorodna HMVC in MVVM vam omogočata zlom kode v logične objekte, ki služijo zelo specifičnim razlogom. Modeli služijo kot plast podatkovnega dostopa, kjer so podatki pridobljeni in vrnjeni v obliki uporabni skozi vašo aplikacijo. Krmilniki upravljajo zahtevek, obdelujejo podatke vrnjene iz modela in nalagajo poglede, da pošljejo odziv. In pogledi so prikazane predloge (markup, xml itd), ki so poslani v odzivu spletnemu brskalniku.

MVC je najbolj pogost arhitekturni vzorec uporabljen v popularnih PHP ogrodjih.

Naučite se več o MVC in njegovih sorodnih vzorcih: