Un model sau model de design ( model de design în limba engleză ) în dezvoltarea de software este un design arhitectural repetabil , care este o soluție la o problemă de design într-un context care apare frecvent .
De obicei, un șablon nu este un exemplu complet care poate fi convertit direct în cod ; acesta este doar un exemplu de soluție de problemă care poate fi folosită în diferite situații. Modelele orientate pe obiecte arată relațiile și interacțiunile dintre clase sau obiecte , fără a specifica ce clase finale sau obiectele aplicației vor fi utilizate.
Tiparele „la nivel scăzut” care iau în considerare specificul unui anumit limbaj de programare sunt numite idiomuri . Acestea sunt decizii bune de proiectare care sunt specifice unui anumit limbaj sau platformă software și, prin urmare, nu sunt universale.
La cel mai înalt nivel, există modele arhitecturale care acoperă arhitectura întregului sistem software .
Algoritmii sunt în mod inerent și modele, dar nu modele de proiectare, ci calcule , deoarece rezolvă probleme de calcul.
În anii 1970 , arhitectul Christopher Alexander a compilat un set de modele de design. În domeniul arhitecturii, această idee nu a fost dezvoltată la fel de mult ca mai târziu în domeniul dezvoltării software.
În 1987, Kent Beck și Ward Cunningham au preluat ideile lui Alexander și au dezvoltat șabloane pentru software-ul de dezvoltare GUI Smalltalk .
În 1988, Erich Gamma a început să-și scrie teza de doctorat la Universitatea din Zurich despre portabilitatea generală a acestei tehnici în dezvoltarea de software.
Între 1989 și 1991, James Coplien a lucrat la dezvoltarea unor expresii de programare C++ și a publicat Advanced C++ Idioms în 1991.
În același an, Erich Gamma își finalizează teza de doctorat și se mută în SUA , unde, în colaborare cu Richard Helm (Richard Helm), Ralph Johnson (Ralph Johnson) și John Vlissides (John Vlissides), publică cartea Design Patterns - Elemente ale software-ului reutilizabil orientat pe obiecte . Această carte descrie 23 de modele de design. De asemenea, echipa de autori ai acestei cărți este cunoscută publicului sub numele de „Gang of Four” ( ing. Gang of Four , adesea prescurtat la GoF ). Această carte a cauzat creșterea popularității modelelor de design.
În comparație cu designul complet independent, șabloanele au o serie de avantaje. Principalul beneficiu al utilizării șabloanelor este reducerea complexității dezvoltării prin abstracții gata făcute pentru a rezolva o întreagă clasă de probleme. Șablonul dă soluției numele, ceea ce facilitează comunicarea între dezvoltatori , permițând referințe la șabloane binecunoscute. Astfel, datorită șabloanelor, detaliile soluțiilor sunt unificate: module, elemente de proiect, iar numărul de erori este redus. Aplicarea șabloanelor este similară conceptual cu utilizarea bibliotecilor de coduri gata făcute. Un model de design bine formulat permite, după ce a găsit o soluție bună, să îl folosești din nou și din nou. Un set de șabloane ajută dezvoltatorul să aleagă opțiunea de design posibilă și cea mai potrivită. [unu]
În timp ce modificarea cu ușurință a codului pentru a se potrivi unui model cunoscut poate face codul mai ușor de înțeles, conform lui Steve McConnell , există două probleme cu utilizarea modelelor. În primul rând, urmărirea orbește a unui model ales poate duce la complexitatea programului. În al doilea rând, un dezvoltator poate fi tentat să încerce un anumit model fără un motiv anume (vezi Ciocanul de Aur ). [2]
Multe modele de design în designul orientat pe obiecte pot fi gândite ca reproduceri idiomatice ale elementelor limbajelor funcționale [3] . Peter Norvig susține că 16 dintre cele 23 de modele descrise în Gangs of Four sunt mult mai ușor de implementat în limbaje tipizate dinamic decât în C++ sau sunt invizibile [4] . Paul Graham consideră însăși ideea de modele de design ca fiind un antipattern , un semnal că sistemul nu are un nivel suficient de abstractizare și trebuie reelaborat cu atenție [5] . Este ușor de observat că însăși definiția unui șablon ca „ o soluție gata făcută, dar nu un apel direct la o bibliotecă ” înseamnă în esență respingerea reutilizării în favoarea duplicării . Acest lucru poate fi evident inevitabil pentru sistemele complexe atunci când se utilizează limbaje care nu acceptă combinatoare și polimorfism de tip și poate fi exclus în principiu în limbaje care au proprietatea de homoiconicitate (deși nu neapărat eficient), deoarece orice tipar poate să fie implementat în cod executabil [6] .
Nume | numele original | Descriere | Descris în Design Patterns |
---|---|---|---|
Șabloane de bază (fundamentale) | |||
Model de delegare | model de delegare | Un obiect exprimă în exterior un anumit comportament, dar în realitate transferă responsabilitatea efectuării acestui comportament unui obiect asociat. | N / A |
șablon de proiectare funcțională | design funcțional | Se asigură că fiecare modul al unui program de calculator are o singură responsabilitate și o realizează cu un minim de efecte secundare asupra altor părți ale programului. | N / A |
Interfață imuabilă | Interfață imuabilă | Crearea unui obiect imuabil . | N / A |
Interfață | Interfață | O metodă generală de structurare a programelor de calculator astfel încât acestea să fie mai ușor de înțeles. | N / A |
Marker de interfață | Interfață marker | Ca atribut (ca marcă a unei entități), este utilizată prezența sau absența unei implementări a interfeței markerului. Limbajele de programare moderne pot folosi în schimb atribute sau adnotări. | N / A |
Container de proprietate | container de proprietate | Vă permite să adăugați proprietăți suplimentare pentru clasă la container (în cadrul clasei), în loc să extindeți clasa cu noi proprietăți. | N / A |
Canal de evenimente | canalul de evenimente | Extinde modelul Publicare/Abonare pentru a crea un canal centralizat pentru evenimente. Utilizează un proxy pentru a te abona și un proxy pentru a publica evenimentul pe canal. Reprezentantul există separat de editorul sau abonatul real. Un abonat poate primi evenimente publicate de la mai multe entități, chiar dacă este înregistrat pe un singur canal. | N / A |
Modelele creaționale sunt modele de design care abstrac procesul de instanțiere. Ele fac posibilă ca sistemul să fie independent de metoda de creare, compunere și prezentare a obiectelor. Șablonul care generează clase folosește moștenirea pentru a modifica clasa instanțiată, în timp ce șablonul care generează obiecte delegă instanțierea unui alt obiect. | |||
Fabrica de abstracte | fabrică abstractă | O clasă care reprezintă o interfață pentru crearea componentelor sistemului. | da |
Constructor | Constructor | O clasă care reprezintă o interfață pentru crearea unui obiect complex. | da |
metoda din fabrică | metoda din fabrică | Definește o interfață pentru crearea unui obiect, dar lasă la latitudinea subclaselor să decidă ce clasă să instanțieze. | da |
Inițializare leneșă | Inițializare leneșă | Un obiect care este inițializat prima dată când este accesat. | Nu |
Multiton | Multiton | Se asigură că clasa are instanțe de obiect denumite și oferă un punct de acces global pentru acestea. | Nu |
Bazin de obiecte | bazin de obiecte | O clasă care reprezintă o interfață pentru lucrul cu un set de obiecte inițializate și gata de utilizare. | Nu |
Prototip | prototip | Definește o interfață pentru crearea unui obiect prin clonarea unui alt obiect în loc să-l creeze printr-un constructor. | da |
Achiziția de resurse este inițializare | Achiziția de resurse este inițializare (RAII) | Obținerea unei resurse este combinată cu inițializarea și eliberarea - cu distrugerea obiectului. | Nu |
singuratic | Singleton | O clasă care poate avea o singură instanță. | da |
Șabloanele structurale (Structural) definesc diverse structuri complexe care modifică interfața obiectelor existente sau implementarea acesteia, facilitând dezvoltarea și optimizarea programului. | |||
Adaptor | Adaptor/Wrapper | Un obiect care permite altor două obiecte să interacționeze, dintre care unul folosește, iar celălalt oferă o interfață care este incompatibilă cu primul. | da |
Pod | Pod | O structură care vă permite să schimbați interfața de apel și interfața de implementare a clasei în mod independent. | da |
linker | Compozit | Un obiect care combină obiecte asemănătoare cu el însuși. | da |
Decorator sau Wrapper | decorator | O clasă care extinde funcționalitatea unei alte clase fără a utiliza moștenirea. | da |
Faţadă | faţadă | Un obiect care abstractizează lucrul cu mai multe clase combinându-le într-o singură entitate. | da |
Punct unic de intrare | controler frontal | Oferă o interfață unificată pentru interfețele dintr-un subsistem. Front Controller-ul definește o interfață de nivel înalt care simplifică utilizarea subsistemului. | Nu |
oportunist | Greutatea muștei | Acesta este un obiect care se prezintă ca o instanță unică în diferite locuri din program, dar de fapt nu este. | da |
Adjunct | proxy | Un obiect care mediază între alte două obiecte și care implementează/restrânge accesul la obiectul accesat prin intermediul acestuia. | da |
Tiparele comportamentale definesc interactiunea dintre obiecte, crescand astfel flexibilitatea acesteia. | |||
Lanțul de responsabilități | Lanț de responsabilitate | Conceput pentru a organiza nivelurile de responsabilitate din sistem. | da |
Comandă , Acțiune, Tranzacție | comanda | Reprezintă o acțiune. Obiectul de comandă conține acțiunea în sine și parametrii acesteia. | da |
Interpret | interpret | Rezolvă o problemă comună, dar care poate fi schimbată. | da |
Iterator , Cursor | Iterator | Reprezintă un obiect care vă permite să obțineți acces secvenţial la elementele obiectului agregat fără a utiliza descrieri ale fiecăruia dintre obiectele care fac parte din agregare. | da |
Mediator | mediator | Oferă interacțiunea multor obiecte, formând în același timp un cuplaj liber și eliminând nevoia ca obiectele să se refere în mod explicit unele la altele. | da |
Păstrătorul | Memento | Permite, fără a încălca încapsularea , să repare și să salveze stările interne ale unui obiect pentru ca ulterior să poată fi restabilit în aceste stări. | da |
Obiect nul | Obiect nul | Previne pointerii nuli prin furnizarea unui obiect „implicit”. | Nu |
Observator sau editor-abonat | Observator | Definește o dependență unu-la-mulți între obiecte, astfel încât, atunci când starea unui obiect se schimbă, toți cei dependenți de acesta sunt notificați despre eveniment. | da |
Servitor | Servitor | Folosit pentru a oferi funcționalități comune unui grup de clase. | Nu |
Specificație | Specificație | Folosit pentru a lega logica de afaceri. | Nu |
Stat | Stat | Se folosește în acele cazuri când, în timpul execuției programului, obiectul trebuie să își schimbe comportamentul în funcție de starea sa. | da |
Strategie | Strategie | Se urmărește definirea unei familii de algoritmi, încapsularea fiecăruia dintre ei și asigurarea interschimbabilității acestora. | da |
metoda șablonului | metoda șablonului | Definește baza algoritmului și permite descendenților să redefinească niște pași ai algoritmului fără a-și schimba structura în ansamblu. | da |
Vizitator | Vizitator | Descrie o operație care este efectuată pe obiecte din alte clase. Când se schimbă clasa Vizitator, nu este nevoie să se schimbe clasele deservite. | da |
Politică simplă | politică simplă | Nu | |
ascultător de evenimente | ascultător de evenimente | Nu | |
Vizitator unic | Vizitator cu o singură porție | Optimizează implementarea modelului vizitator, care este inițializat, folosit o dată și apoi eliminat. | Nu |
Vizitator ierarhic | Vizitator ierarhic | Oferă o modalitate de a parcurge toate nodurile unei structuri de date ierarhice (de ex. arbore). | Nu |
Concurență - Concurență
Folosit pentru a scrie mai eficient programe cu mai multe fire și pentru a oferi soluții imediate la problemele de sincronizare .
Nume | numele original | Descriere |
---|---|---|
Obiect activ | obiect activ | Servește la separarea firului de execuție al unei metode de firul în care a fost apelată. Folosește apelurile metodei asincrone și modelele de planificare. |
Balking | Început | Folosit pentru a efectua o acțiune asupra unui obiect numai atunci când acesta este în starea corectă. |
Proprietăți de legare | Combină mai mulți observatori pentru a menține proprietățile sincronizate între diferite obiecte [7] . | |
Mesaje | Model de mesagerie, Model de design de mesagerie (MDP) | Permite componentelor și aplicațiilor să facă schimb de informații (mesaje). |
Verificați blocarea | Închidere dublu verificată | Conceput pentru a reduce supraîncărcarea asociată cu obținerea unui lacăt. |
bazat pe evenimente | Asincron bazat pe evenimente | Abordarea problemelor cu modelul Asynchronous care apar în programele cu fire multiple [8] . |
Suspensie păzită | Suspensie protejată | Folosit pentru a bloca executarea unei acțiuni asupra unui obiect numai atunci când acesta este în starea corectă. |
Jumătate sincronizat/Jumătate asincron | ||
Lideri/adepti | ||
blocare | Lacăt | Un fir de execuție blochează o resursă pentru a împiedica alte fire de execuție să o acceseze sau să o modifice [9] . |
Monitorizați | Monitorizați | Un obiect destinat a fi folosit în siguranță de mai multe fire. |
reactor | Reactor | Proiectat pentru transmiterea sincronă a cererilor către serviciu din una sau mai multe surse. |
citire/scriere | Blocare citire/scriere | Permite mai multor fire de execuție să citească informații din spațiul de stocare partajat în același timp, dar permite doar unui fir odată să le modifice. |
Programator | Programator | Oferă un mecanism pentru implementarea unei politici de programare fără a fi dependent de vreo politică anume. |
pool de fire | Oferă un grup de fire de execuție pentru procesarea joburilor, de obicei reprezentate ca o coadă. | |
Stocare specifică firului | Servește pentru a furniza variabile globale diferite pentru fire diferite. | |
Execuție cu un singur thread | execuție cu un singur fir | Împiedică apelarea unei metode simultan, împiedicând astfel executarea concomitentă a acelei metode. |
Model de cooperare | model de cooperare | Oferă un mecanism pentru a opri în siguranță firele de execuție prin utilizarea unui steag comun pentru a semnala terminarea firului de execuție. |
De asemenea, astăzi există o serie de alte șabloane.
Modele de design | |
---|---|
Principal | |
Generativ | |
Structural | |
Comportamental | |
Programare în paralel |
|
arhitectural |
|
Șabloane Java EE | |
Alte șabloane | |
Cărți | |
Personalități |