Modele de proiectare în PHP, dezvoltarea

modele de design au fost prezentate publicului în tiparele design de carte (Erich Gamma, Richard Helm, Ralph Johnson și John Vlissides (cunoscut sub numele de „banda de patru“)). Conceptul de bază prezentat în introducere, a fost simplu. Pe parcursul anilor de dezvoltare a software-ului și a tovarășilor Gamma a descoperit anumite tipare ( „modele“) de proiectare, precum și arhitecți care construiesc case și clădiri, pot proiecta șabloane pentru aspect toalete sau construirea de bucătărie. Folosind aceste șabloane sau modele de design, aveți posibilitatea să proiectați calitatea clădirii mai repede. Același lucru este valabil pentru dezvoltarea de software.

modele de design nu sunt doar un mod convenabil pentru o dezvoltare mai rapidă a software-ului de încredere, dar, de asemenea, o modalitate de a încapsula idei mari în termeni ușor de înțeles. De exemplu, putem vorbi despre scrierea unui sistem de mesagerie pentru a asigura conectivitate săraci, și este posibil - pe modelul de observator, dar aceasta va însemna același lucru.

Este dificil de a demonstra valoarea modelelor pe un mic exemplu. Ele sunt, astfel, apar adesea ca o complexitate excesivă a codului, deoarece, de obicei se manifestă în sisteme mari, cu un număr mare de cod sursă. Acest articol nu vor fi considerate aplicații mari, astfel încât trebuie să vă folosiți imaginația pentru a aplica principiile de exemplu (și nu neapărat codul său exact) în cererile lor mari. Acest lucru nu înseamnă că nu ar trebui să utilizeze modele în aplicații mici. Multe aplicații începe la fel de mici și de a dezvolta în mare, astfel încât nu există nici un motiv să nu urmeze aceste reguli dintr-o dată.

Acum, când a devenit un pic mai clar, ce design-modele, și ceea ce sunt folosite, este timpul pentru a trece la cele cinci modele cele mai populare PHP 5 de design.

Model Factory (Fabrica)

Multe dintre modelele de design în original, cartea Design Patterns încurajează cuplajul slab. Pentru a înțelege acest concept, trebuie să menționăm lupta, prin care mulți dezvoltatori de sisteme de mari dimensiuni. Problema apare atunci când o bucată de cod și o încercare suplimentară pentru a urmări impactul acestei schimbări asupra sistemului (și, în cel mai rău caz - observarea cascada de erori de sistem, care sunt asumate în nici un fel cu codul modificat nu are legătură).

Problema este svzyazannosti severă. Funcții și clase într-o parte a sistemului se bazează prea mult pe comportamentul și arhitectura altor funcții și clase (în alte părți ale sistemului). Aici modelul dorit, ceea ce va permite clase să comunice unul cu celălalt, dar va evita prea mult de legarea lor unul de altul, ceea ce ar conduce la unele „întrepătrundere“ de piese independente de cod.

În sistemele mai mari, mai mult și mai mult legat de câteva clase cheie. Problemele pot apărea atunci când modificați aceste clase. Să presupunem că avem o clasă de utilizator care citește dintr-un fișier. Trebuie să-l schimbe la o altă clasă care citește din baza de date, dar peste tot codul se referă la clasa ktoroy citirea dintr-un fișier. Aici este model util din fabrică.

Fabrica de model - o clasă care oferă metode pentru crearea obiectelor. În loc de a folosi noul design direct pentru a crea obiecte folosim fabrica de clasă. Toate codul care utilizează fabrica-clasa se modifică în mod automat.
În listinge1 un exemplu de fabrică de clasă. Server Storn este format din două părți: baza de date și set php-pagini pentru a adăuga canale (feed-uri), lista de solicitare de canal și de a primi articole, legat de un anumit canal.

Ambele apeluri returnează același obiect. La utilizarea acestui Singleton în cerere, aceeași conexiune este utilizată întotdeauna.
În aplicații mai mici, puteți gestiona variabile globale, dar în aplicații mari care ar trebui evitate prin utilizarea obiectelor și metode pentru a accesa resursele.

Pattern Observer (observator)

model de observator sugerează un alt mod de a evita conectivitatea puternică între componente. Acest model este simplu: un obiect face în sine observabilă prin adăugarea unei metode care permite o altă entitate, observatorul, să se înregistreze.
Atunci când obiectul observat este schimbat, acesta trimite o notificare către observatori înregistrați. Ce se întâmplă după primirea notificării către observator, nu depinde de obiectul observat. Rezultatul este un mod de comunicare între obiecte, fără a fi nevoie să înțeleagă de ce.

Un exemplu simplu - lista de utilizatori de sistem. Codul din listingul 4 prezintă o listă de utilizatori care trimite o notificare atunci când adăugați utilizatori noi. Pentru această listă, următorii observatori, jurnalul de conducere; la primirea notificării afișează mesajul.

Listarea 4. Observer.php

Codul eșantion creează o userlistul adaugă UserListLogger în calitate de observator. Apoi se adaugă un vizitator nou și UserListLogger notificat acestei schimbări.
Este important să înțelegem că userlistul nu știe că logger va face. Pot exista unul sau mai mulți observatori, care vor face altceva. De exemplu, puteți face un observator, care va trimite un mesaj către noul utilizator, primitoare nou-veniți.
Valoarea acestei abordări - că nu știe listei de utilizatori nimic despre ce depind de ea obiectelor; El se concentrează pe gestionarea listei de utilizatori și trimite o notificare atunci când se schimbă.

Acest model nu este limitată la obiectele stocate în memorie. Acesta este utilizat pentru sistemele de coadă de mesaje bazate pe baze de date (sisteme de așteptare pentru mesaje bazate pe baze de date), utilizate în aplicații mari.

Shain pattern-de-comandă (lanț de comandă)

Pentru a pune în aplicare ideea de model de cuplare în vrac Shain-de-comandă trimite un mesaj, comanda, cerere, într-un fel, printr-un set de manipulare. Fiecare handler decide dacă acesta va fi capabil de a procesa această solicitare. Dacă se poate, cererea este procesată și procesul de transmitere se oprește. Puteți adăuga / elimina stivuitoare, fără a afecta alte stivuitoare. Listarea 5 prezintă un exemplu de acest model.

Listarea 5. Chain.php

Codul creează primul CommandChain obiect și adaugă două echipe obiecții cu privire la aceasta. Apoi, cele două echipe au început să vadă cine răspunde. Dacă numele comenzii nu se potrivește nici UserCommand, nici MailCommand, codul funcționează off și nu se întâmplă nimic.

Modelul lanțul de comandă poate fi valoroase la crearea extensibila de prelucrare de interogare arhitectura, care poate fi folosit pentru a rezolva multe probleme.

Strategia de model (Strategie)

Ne uităm la ultima strategie de model. În acest model de algoritmi sunt eliminate din clasele dure, astfel încât acestea să poată fi modificate cu ușurință. De exemplu, modelul de strategie - aceasta este o opțiune, dacă doriți să schimbați modul în clasament pagină în motorul de căutare. Împărțim motorul de căutare în mai multe părți - una trece prin paginile, o clasează fiecare pagină, și mai mult de un ordonează rezultatele pe baza clasării. mod complex - de a combina toate piesele într-o singură clasă. Folosind modelul de strategie, putem lua parte, responsabil pentru clasamentul paginilor din cealaltă clasă, și puteți schimba mecanismul de clasament, fără a interfera cu restul motorului de căutare cod.

Într-un exemplu simplu din listingul 6 prezintă clasa o listă de utilizatori, care oferă un set de metode de căutare a utilizatorilor bazată pe un plug-and-play-set de strategii.

Listarea 6. Strategy.php

În exemplul de aceeași listă de utilizatori este forțat prin două strategii, și afișează rezultatele. În primul caz, strategia de a cauta toate numele, „mai mult“ decât «J» (Jack, Lori, și Megan). A doua strategie alege nume aleatoriu și, astfel, produce rezultate diferite pentru diferite serii. În cazul nostru, este Andy și Megan.

model de strategie foarte bun pentru sisteme complexe de management al datelor, care au nevoie de mai multă flexibilitate în procesul de filtrare, căutarea și de prelucrare a datelor.

Acestea sunt unele dintre cele mai comune modele de design folosite în PHP-aplicații. Mult mai pot fi găsite în modelele de design de carte. Nu este nevoie să timid departe de modele de modul în care ceva mistic. Tipare - o mare de idei pe care le puteți utiliza atunci când programează în orice limbă și orice nivel de calificare profesională.

23 răspunsuri până acum.

Foarte similar cu informațiile din cartea: «PHP 5 OOP avansată și design Modele Stig Bakken, Andi Gutmans, Derick Rethans»

Foarte bine scris.
Vă mulțumim pentru traducere.

dar se pare că nimic complicat)
încerc

așteptăm cu nerăbdare să continue

Am impresia că acest cod

funcția get public static ()
static $ db = null;
if ($ db == null)
$ Db = new DatabaseConnection ();
reveni $ db;
>

se va întoarce întotdeauna o nouă instanță a DatabaseConnection ();
overpersuade mi te rog

Nu aveți dreptate.
Încercați să rulați acest cod:
Funcția t ()
static $ v = null;
if (is_null ($ v)) $ v = rand (1, 1000);
>
reveni $ v;
>

Săgețile Ugly pe topuri

Toți cei care nu-i place săgeți - cere manibek!
Dar serios: dacă doriți să ajutați - să facă mai bine, voi fi plasat.

Super, foarte intuitiv și o explicație bună. Multumesc pentru articol.

Se spală în Singleton typo
static $ db = nevoie de nul pentru a învăța de la metoda get () în descrierea clasei.

funcția get public static ()
static $ db = null; // <— вот это
if ($ db == null)
$ Db = new DatabaseConnection ();
reveni $ db;
>