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 ponavadi je dobra ideja, da se sledi pogostim vzorcem, ker bo vašo kodo naredilo enostavnejšo za upravljanje in enostavnejšo drugim za razumevanje.
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:
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.
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:
__construct()
je deklariran kot ‘protected’, da prepreči novo instanco izven razreda preko operatorja new
.__clone()
je deklarirana kot ‘private’, da prepreči kloniranje instance razreda preko operatorja clone
.__wakeup()
je deklarirana kot ‘private’, da prepreči deserializacijo instance razreda preko globalne funkcije unserialize()
.getInstance()
s ključno besedo static
.
To omogoča podrazredenje razreda Singleton
v primeru.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).
Paziti morate, 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.
S strateškim vzorcem zaobjamete specifične družine algoritmov, kar dovoljuje razredu odjemalca, 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:
Z zaobjemom zgornjega algoritma ga naredite lepega in čistega v vaši kodi, da lahko ostali razvijalci enostavno dodajo nove izhodne tipe brez vplivanja na kodo odjemalca.
Videli boste, kako vsak konkreten razred ‘output’ 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 odjemalec, ki je uporabil ta vedenja, pravilnega tipa, v tem primeru ‘OutputInterface’.
Naslednji odrezek kode opisuje, kako lahko klic razreda odjemalca uporabi enega teh algoritmov ali celo boljše nastavi zahtevano vedenje pri izvajanju:
Razred odjemalca zgoraj, ima privatno lastnost, ki mora biti nastavljena pri izvajanju in biti tipa ‘OutputInterface’. Ko je ta lastnost nastavljena, bo klic loadOutput() poklical metodo load() v konkretnem razredu izhodnega tipa, ki je bil nastavljen.
Vzorec sprednjega krmilnika je, kjer imate enojno vstopno točko za vašo spletno aplikacijo (na primer index.php), ki upravlja 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 zahtevek (kot je čiščenje vnosa).
Vzorec model-pogled-krmilnik (angl. MVC - Model-View-Controller) in njegova sorodna HMVC in MVVM vam omogočajo razbiti kodo 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, ki je uporabna 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 priljubljenih ogrodjih PHP.
Naučite se več o MVC in njegovih sorodnih vzorcih: