0% au considerat acest document util (0 voturi)
167 vizualizări28 pagini

CURS ACS 1.clean Code 2.design Patterns

Documentul prezintă principii de clean code și design patterns. Este prezentat modelul singleton care permite crearea unei singure instanțe pentru o clasă, precum și alte tipuri de design patterns creaționale, structurale și comportamentale.
Drepturi de autor
© © All Rights Reserved
Respectăm cu strictețe drepturile privind conținutul. Dacă suspectați că acesta este conținutul dumneavoastră, reclamați-l aici.
Formate disponibile
Descărcați ca DOCX, PDF, TXT sau citiți online pe Scribd
0% au considerat acest document util (0 voturi)
167 vizualizări28 pagini

CURS ACS 1.clean Code 2.design Patterns

Documentul prezintă principii de clean code și design patterns. Este prezentat modelul singleton care permite crearea unei singure instanțe pentru o clasă, precum și alte tipuri de design patterns creaționale, structurale și comportamentale.
Drepturi de autor
© © All Rights Reserved
Respectăm cu strictețe drepturile privind conținutul. Dacă suspectați că acesta este conținutul dumneavoastră, reclamați-l aici.
Formate disponibile
Descărcați ca DOCX, PDF, TXT sau citiți online pe Scribd
Sunteți pe pagina 1/ 28

CURS 1.

CLEAN CODE

1. De ce Clean Code?
 Codul trebuie sa fie ușor de citit, ușor de înțeles, ușor de modificat de către oricine

2. Principii
1. D.R.Y ( Don’t Repeat Yourself)
 Aplicabil ori de câte ori dăm Copy/Paste unei bucăți de cod
 Daca noi modif o sectiune de cod care a fost copiat si in alta parte, s-ar putea sa uitamsa modif peste tot pe unde
am dat paste
 Trb sa urmam Single Responsibility Principle : incurajeaza reutil. Codului in alte prog, nu repetitia lui in acelasi prog
 Recomandari: metode sau clase diverse

2. K.I.S.S(Keep It Simple and Stupid)


 Cand vrem sa implementam o metoda care sa faca mai multe lucruri, o separam in metode diverse

3. Y.A.G.N.I(You Ain’t Gonna Need It)


 Nu scriem metode ce nu sunt necesare încă (poate nu vor fi necesare niciodată), doar pe cele pe care le folosim
imediat
4. S.O.L.I.D
i. SRP ( Single Responsibility Principle ): O clasă trebuie să aibă întotdeauna o singură responsabilitate și
numai una pt ca o singura schimbare a specificatiilor duce la inutilitatea intregului cod
ii. OCP ( Open Close Principle ) : o clasa trb sa fie responsiva la extensii dar restrictiva la modificari ==> adica
o clasa sa poata fi extinsa fara a i se modifica si codul sursa ==> fol mostenirea : se adauga noi caract la clasa
parinte, fara a o modif pe aceasta
iii. LSP ( Liskov Substitution Principle ) : Obiectele pot fi înlocuite oricând cu instanțe ale claselor derivate fără
ca acest lucru să afecteze funcționalitatea
iv. ISP ( Interface Segregation Principle ) : Mai multe interfețe specializabile sunt oricând de preferat unei
singure interfețe general; nu trb sa includa metode inutile
v. DIP ( Dependency Inversion Principle ) : O clasă trebuie să depindă de abstractizări, niciodată de obiecte
concrete
 Abstractizarea = tehnica care stab un nivel de simplitate pt interact. userului cu sist, detaliile
mai complexe se gasesc below the current level; sunt adaugate treptat nivele de functionalitate
interfete curente

3. Naming conventions
UpperCamelCase • lowerCamelCase • System Hungarian Notation • Apps Hungarian Notation
1. Clase : substantiv specific, fără prefixe și sufixe inutile
2. Metode: daca contine conjuctii=> sugereaza ca trb sa o impartim in mai multe met
3. Variabile: Nu e indicat ca variabilele de tip șiruri de caractere să conțină cod din alte limbaje (SQL, CSS)
 Variabilele booleane trebuie să sune ca o întrebare la care se poate răspunde cu adevărat/fals boolean
isTerminated = false;

4. Reguli de scriere cod sursa


 Blocurile de cod încep cu { și se termină cu }. Chiar dacă avem o singură instrucțiune.
 Blocurile cu instrucțiuni sunt marcate și prin identare.
 Între headerul funcției și acolada de deschidere a blocului funcției se pune un spațiu
 Acolada de închidere a unui corp de instrucțiuni este singură pe linie
 Metodele sunt separate printr-o singură linie goală.
 Parametrii sunt separați prin virgulă și spațiu.
 Operatorii sunt separați de operanzi printr-un spațiu, in afara de op unari.

5. Reguli de scriere in structuri conditionate


 Evitați comparațiile cu true și false
 Variabilele booleane pot fi instanțiate direct
 Nu comparați direct cu stringuri, folosiți enum pentru situații de genul
 Ori de câte ori condițiile devin prea mari sunt indicate variabilele intermediare

6. Reguli de clean code in metode


 Orice metodă e indicat să aibă cel mult trei niveluri de structuri imbricate (arrow code)
 Variabilele vor fi declarate cât mai aproape de utilizarea lor
 Încercați pe cât posibil folosirea this și stabilirea unei convenții de nume pentru parametrii constructorului
 Evitați metodele cu mai mult de doi parametri
 Evitați metodele foarte lungi (peste 20 de linii de cod)
 Complexitatea trebuie să fie invers proporțională cu numărul de linii de cod
 Atenție la ordinea în care tratați excepțiile

7. Reguli de clean code in clase


 Toate metodele dintr-o clasă trebuie să aibă legătură cu acea clasă
 Folosiți fișiere de resurse pentru șirurile de caractere din GUI

8. Dictionar
 Test Driven Development (TDD) – Dezvoltare bazată pe cazuri de utilizare
 Refactoring – rescrierea codului într-o manieră ce se adaptează mai bine noilor specificații
 Automatic Testing (Unit Testing) – Testarea automată a codului pe baza unor cazuri de utilizare. Foarte
utilă în refactoring pentru că putem verifica dacă am păstrat toate funcționalitățile sau nu (regression)
 Code review – Procedură întâlnită în special în AGILE (XP, SCRUM) ce presupune ca orice bucată de cod
scrisă să fie revizuită și de un alt programator
 Pair programming – Tehnică specifică AGILE prin care programatorii lucrează pe perechi pentru task-uri
complexe, pentru a învăța sau pentru a evita code review
CURS 2. DESIGN PATTERNS

1. Calitate cod sursa


1.1. Principii urmărite în scrierea codului:
 Ușor de citit/înțeles – clar
 Ușor de modificat – structurat
 Ușor de reutilizat
 Simplu (complexitate)
 Ușor de testat
 Implementează pattern-uri pentru

1.2 Puncte forte care o influențează:

 Timpul disponibil (termene de predare)


 Costuri
 Experiența programatorului
 Competențele programatorului
 Claritate specificații
 Complexitate soluție
 Rata schimbări in specificații, cerințe, echipa, etc

2. Anti-Pattern: Big ball of mud


“A Big Ball of Mud is a haphazardly structured, sprawling, sloppy, duct-tapeand-baling-wire,
spaghetticode jungle.”

 Throwaway code – soluții temporare (Prototyping) ce trebuie înlocuite/rescrise


 Cut and Paste code -
 Adaptarea prin comentare/ștergere a altor soluții
 Termene limită foarte scurte sau nerealiste
 Lipsa de experiență
 Lipsa unor standarde/proceduri
Cum eviți ?

 Rescrierea codului (Refactoring) pana la un nivel acceptabil de maturitate


 Utilizare Principii Clean Code
 Implementare Design Patterns

3. Design pattern
 Un pattern reprezintă o soluție reutilizabila pentru o problema standard, într-un anumit context
 Facilitează reutilizarea arhitecturilor si a design-ului software
 NU sunt structuri de date
3.1 Avantaje
 Permit reutilizarea soluțiilor standard la nivel de cod sursa/arhitectura
• Permit documentarea codului sursa/arhitecturilor
• Permit înțelegerea mai facila a codului sursa/a arhitecturii
• Reprezintă concepte universal cunoscute - definesc un vocabular comun
• Sunt soluții testate si foarte bine documentate

3.2. Componente
3.2.1. Nume:

 Face parte din vocabularul unui programator/designer/arhitect software


 Identifica in mod unic pattern-ul
3.2.2. Problema:

 Descrie scopul urmărit


 Definește contextul
 Stabilește când este aplicabil pattern-ul
3.2.3. Soluție

 Diagrama UML, pseudo-cod ce descrie elementele


3.2.4. Consecințe

 Rezultate
 Avantaje si dezavantaje

3.3. Utilizare
 Observer in Java AWT si Swing pentru callback-uri
 Iterator in C++ STL si Java Collections
 Façade in multe librarii Open-Source pentru a ascunde complexitatea rutinelor interne
 Bridge si Proxy in framework-uri pentru aplicatii distribuite
 Singleton in Hybernate si NHybernate

3.4. Tipuri de design pattern


3.4.1 Creaționale ( Creational )

 Inițializarea si configurarea claselor si obiectelor


3.4.1.1. Abstract Factory: crearea de obiecte aflate intr-un anumit context
3.4.1.2. Builder: crearea in mod structurat (incremental) de obiecte complexe
3.4.1.3. Factory Method: defineste o metoda pentru crearea de obiecte din aceeasi familie
(interfata) in subclase
3.4.1.4. Prototype: clonarea unor noi instante (clone) ale unui prototip existent
3.4.1.5. Singleton: crearea unei singure instante (unica)
3.4.2. Structurale ( Structural )

 Compoziția claselor si obiectelor


 Decuplarea interfețelor si a claselor
3.4.2.1. Adapter: Adaptează interfața unui server/serviciu la client
3.4.2.2. Bridge: Decuplează modelul abstract de implementare
3.4.2.3. Composite: Agregarea a mai multor obiecte similare
3.4.2.4. Decorator: Extinde intr-un mod transparent un obiect
3.4.2.5. Facade: Simplifica interfața unui modul/subsistem
3.4.2.6. Flyweight: Partajare memorie intre obiecte similare.
3.4.2.7. Proxy: Interfață către alte obiecte/resurse

3.4.3. Comportamentale ( Behavioral )

 Distribuția responsabilității
 Interacțiunea intre clase si obiecte
3.4.3.1. Chain of Responsibility: Gest. tratarea unui eveniment de catre mai multi furnizori de solutii
3.4.3.2. Command: Request or Action is first-class object, hence re-storable
3.4.3.3. Iterator: Gestioneaza parcurgerea unei colectii de elemente
3.4.3.4. Interpreter: Intepretor pentru un limbaj cu o gramatica simpla
3.4.3.5. Mediator: Coordoneaza interactiunea dintre mai multi asociati
3.4.3.6. Memento: Salvazeaza si restaureaza starea unui obiect
3.4.3.7. Observer: Defineste un hadler pentru diferite evenimente
3.4.3.8. State: Gestioneaza obiecte al caror comportament depinde de starea lor
3.4.3.9. Strategy: Incapsuleaza diferiti algoritmi
3.4.3.10. Template Method: Incapsuleaza un algoritm ai carui pasi depend de o clasa derivate
3.4.3.11. Visitor: Descrie metode ce pot fi aplicate pe o structura neomogena
4. Creational Design Patterns

4.1.Modelul SINGLETON

Problema: Se dorește crearea unei singure instanțe pentru o clasă prin care să fie gestionată o
resursă/un eveniment în mod centralizat;

Soluția: se bazează pe existența unei singure instanțe ce poate fi creata o singură dată dar care poate
fi referită de mai multe ori;

Diagrama
Componente:

 Singleton(): un constructor privat (apelabil


doar din clasa)
 private static Singleton instance: un atribut
static, privat, de tipul clasei ce reprezinta
instanta unica
 Singleton getInstance(): o metoda publica
ce da acces la instanta unica
- instanta unica este creata la primul apel al
metodei

Avantaje:
• Gestiune centralizata a unei resurse printr-o instanță unică
• Controlul strict al instanțierii unei clase – o singura data
• Nu permite duplicarea instanțelor
• Ușor de implementat
• Lazy instantiation – obiectul este creat atunci când este necesar

Dezavantaje:

 In multi-threading pot apărea probl de sincronizare sau cooperare daca singleton-ul este partajat
 Poate deveni un bottleneck care sa afecteze performanta aplicației
Scenarii

 Conexiune unica la baza de date;


 Gestiune unica fișiere/fișier de configurare;
 Gestiune unica preferințe pe platforma Android (SharedPreferences) sau gestiunea setărilor
aplicației într-un context mai general;
 Gestiune unica conexiune rețea;
 Gestiune centralizată a accesului la anumite resurse utilizate de soluția software;
 Gestiune unică obiecte costisitoare, pe baza timpului și a resurselor necesare creării, ce trebuie să
aibă o instanță unică. utilizată de mai multe ori.
4.2.Modelul FACTORY

Problema: implementarea unui mecanism centralizat prin care crearea obiectelor este transparenta
pentru client; prin interfața publică clientul știe cum să creeze obiecte însă nu știe cum este
implementat acest lucru;

Soluția: poate să fie extinsă prin adăugarea de noi tipuri concrete de obiecte fără a afecta codul
existent;
• complexitatea creării obiectelor este ascunsa clientului;
• obiectele sunt referite printr-o interfață comună;
 clase concrete reprezintă o familie de obiecte definită în jurul interfeței comune;
• eliminarea dependenței codului clientului de crearea efectivă a obiectelor utilizate în soluție;

Modelul 1. SIMPLE FACTORY

Componente:

 InterfataProdus: interfața abstractă a obiectelor de tip Produs;


 Produs: tipurile concrete de clase ce implementează interfața ; instanțele acestei clase vor fi
generate de către Factory;
 Factory: clasa ce încapsulează procesul de creare a obiectelor de tip InterfaceProdus;
 Client: o altă clasă sau o metodă, care folosește interfața Factory-ului pentru a construi obiecte noi;
Modelul 2. FACTORY METHOD (Virtual Constructor)

Componente:

 InterfataProdus: interfață ce definește tipurile generice de obiecte ce pot fi create


• Produs: clasa concreta ce definește tipul de obiecte ce poate fi creat
• Factory: clasa abstracta ce definește interfața unui generator de obiecte
• FactoryConcretA, FactoryConcretB …: clasa concreta ce implementează generatorul de obiecte

Avantaje:

 Toate obiecte create au în comun interfața


 Controlul strict al instanțierii – obiectele nu sunt create direct prin constructori ci prin metoda de
tip factory
 Diferitele tipuri de obiecte sunt gestionate unitar prin interfață comuna – noi tipuri, din aceeași
familie, pot fi adăugate fără modificări
 Ușor de implementat
 Pot fi generate obiecte noi care aparțin aceleiași familii (interfață comună)
 Implementează principiul Dependency Inversion

Dezavantaje:

 Nu pot fi generate obiecte “noi”


 Constructorii sunt privați – clasele nu pot fi extinse
Modelul 3. ABSTRACT FACTORY

Problema: Se dorește implementarea unui mecanism prin care crearea obiectelor este transparenta
pentru client
Soluția: poate să fie extinsă prin adăugarea de noi tipuri concrete de obiecte fără a afecta codul scris
• Obiectele sunt referite printr-o interfață comună și nu direct.

Componente:
• InterfataFactory: interfață ce definește metodele abstracte pentru crearea de instanțe
• InterfataProdusA/InterfataProdusB: interfețe ce definesc tipurile abstracte de ob ce pot fi create
• FactoryConcretA/FactoryConcretB: clase concrete ce implementează interfața si metodele prin
care sunt create obiecte de tipul Product
• ProduseTipA, ProduseTipB,…:clase concrete ce definesc diferitele tipuri de obiecte ce pot fi create

Exemplu:

Avantaje:

 decuplează generatorul de instanțe de clientul care le utilizează;


 controlul strict al instanțierii – ob nu sunt create direct prin constr. ci prin metodele de tip factory;
 diferitele tipuri de obiecte sunt gestionate unitar prin interfață comuna – noi tipuri pot fi adăugate
fără modificări

Dezavantaje:

 număr mare de clase implicate


 Nivel de complexitate ridicat
Scenarii:

 Gestiune creare produse catalog magazine virtual


 Gestiune creare tipuri diferite de client
 Gestiune creare tipuri diferite de rapoarte
 Gestiune creare tipuri de numere de telefon
 Gestiune creare tipuri de conturi bancare
 Gestiune creare tipuri de pizza
 Gestiune creare meniuri într-un restaurant

Toate pattern-urile Factory promovează loose coopling si sunt bazate pe Dependency Inversion
Principle
Factory Method

 bazata pe moștenire – crearea obiectelor este realizata de subclase ce implementează metoda


factory
 Are scopul de a delega crearea obiectelor către subclase
Abstract Factory

 bazata pe compunere – crearea obiectelor este realizata de metode publicate de interfață


 Are scopul de a crea familii de obiecte fără a depinde de implementarea lor concreta
4.3.Modelul Builder

Problema:

 Soluția trebuie sa construiască obiecte complexe printr-un mecanism care este independent de
procesul de realizare a obiectelor
 Clientul construiește obiectele complexe specificând doar tipul si valoarea sa, fără a cunoaște
detaliile interne ale obiectului (cum stochează si reprezintă valorile)
 Procesul de construire a obiectelor trebuie sa poata fi utilizat pentru a defini obiecte diferite din
aceeași familie
 Obiectele sunt gestionate prin interfața comuna
 Instanța de tip Builder construiește obiectul însă tipul acestuia este definit de subclase

Componente:

 AbstractBuilder: interfața abstracta ce definește metodele prin care sunt construite parti ale
obiectului complex
 Builder: clasa concreta ce construiește părțile si pe baza lor obiectul final
 Produs: clasa abstracta ce definește obiectul complex ce este construit
 Director: clasa concreta ce construiește obiectul complex utilizând interfața de tip Builder

Avantaje:

 Obiectele complexe pot fi create independent de părțile care îl compun (un obiect poate sa le
conțină pe toate sau doar o parte)
 Sistemul permite reprezentarea diferita a obiectelor create printr-o
 interfață comună
 Algoritmul de creare a obiectului este flexibil deoarece clientul alege
 ce părți sa fie create

Dezavantaje:

 Atenție la crearea de obiecte – pot fi omise atribute


4.4.Modelul Prototype

Scenariu:
ACME Inc. dorește să dezvolte un joc 3D pentru dispozitive Android utilizând un engine propriu. Cele 2
modele 3D pentru caractere sunt destul de complexe și generarea lor are impact asupra timpului de
procesare și implicit asupra duratei de viață a acumulatorului. Același model este utilizat de mai multe
ori pentru a popula o scena cu personaje. Trebuie găsită o soluție eficientă prin care scenele să fie
încărcate rapid.

Problema:

 Soluția generează obiecte costisitoare (timp


creare si memorie ocupata) cu durata de
viată lungă
 Pentru eficienta, Soluția reutilizează
obiectul prin clonarea acestuia (se creează o
instant noua a obiectului)
 Implementat printr-o metoda clone()

Implementare:

 In Java implementarea implicită pentru clone() este Shallow Copy, dar explicit putem face si Deep
Copy

Avantaje:

 Creare rapidă de obiecte identice (valori) prin clonare


 Evită apelul explicit al constructorului
 Poate fi construita o colectie de prototipuri care sa fie utilizata pentru a genera obiecte noi

Dezavantaje:

 Atenție la crearea de obiecte ce partajează aceleași resurse –shallow copy


5. Structural Design Patterns

5.1.Modelul Adapter ( Wrapper )

Scenariu:
ACME Inc. dorește să cumpere un nou framework pentru serviciile din back-end. Interfața pentru aceste
servicii gestionează datele prin intermediul obiectelor de tip ACME, iar noul framework procesează
datele prin intermediul obiectelor de tip MICRO. Programatorii companiei trebuie sa găsească o soluție
de a integra cele doua framework-uri fără a le modifica.

Problema:

 Utilizarea împreună a unor clase ce nu au


o interfață comuna
 Clasele nu se modifica însă se
construiește o interfață ce permite
utilizarea lor in alt context
 Clasele sunt adaptate la un nou context
 Apelurile către interfața clasei sunt
mascate de interfața adaptorului
 Transformarea datelor dintr-un format în
altul

Componente:

 ClasaExistenta: clasa existenta ce trebuie adaptata la o noua interfață;


 ClasaContextNou: definește interfața specifică noului domeniu;
 Adaptor: adaptează interfața clasei existente la cea a clasei din noul context; contine (composition)
o referinta catre clasa/obiectul ce trebuie adaptat
 Client: Reprezintă framework-ul care apelează interfața specifică noului domeniu

Avantaje:

 Clasele existente (la client si la furnizor) nu sunt modif pentru a putea fi folosite într-un alt context
 Se adaugă doar un layer intermediar Pot fi definite cu ușurință adaptoare pentru orice context

Dezavantaje:

 Adaptorul de clase se bazează pe derivare multipla, lucru care nu este posibil in Java. Alternativa
este prin interfețe si compunere
5.2.Modelul FAÇADE (Wrapper)

Scenariu:
ACME Inc. dezvoltă o soluție software pentru managementul unei locuințe inteligente. Includerea în
framework a tuturor componentelor controlabile dintr-o astfel de locuință (ferestre, încălzire, alarma,
etc) a generat un număr mare de clase. Departamentul care dezvolta interfața Web a soluției oferă un
set minim de funcții ce pot fi controlate de la distanta. Deși funcționalitatea este simpla, numărul mare
de clase ce se instanțiază și a metodelor apelate îngreunează dezvoltarea si testarea. In acest sens, o
interfață mai simpla ar ajuta acest departament.

Problema:

 Soluția conține o mulțime de clase iar execuția unei funcții presupune apeluri multiple de metode
aflate in aceste clase
 Clasele nu se modifica însă se construiește un layer intermediar ce permite apelul/gestiunea facila
a metodelor din mai multe interfețe
 Utilă in situația in care framework-ul creste in complexitate si nu este posibila rescrierea lui pentru
simplificare
 Apelurile către multiplele interfețe sunt mascate de aceasta interfață comună

Componente:
• Clasa1, Clasa2, …, Package1, Package2, …:
clase existente ce pun la dispoziție diferite
interfețe;
• Facade: Definește o interfața simplificata
pentru contextul existent;
• Client: Reprezintă framework-ul care
apelează interfața specifica noului domeniu

Avantaje:

 Framework-ul nu se rescrie
 Se adaugă doar un layer intermediar ce ascunde complexitatea framework-ului din spate
 Pot fi definite cu ușurință metode care sa simplifice orice situație
 Implem. principiul Least Knowledge – reducerea interacț. intre ob la nivel de “prieteni apropriați”
Dezavantaje:

 Creste numărul de clase wrapper


 Creste complexitatea codului prin ascunderea unor metode
 Impact negativ asupra performantei aplicației
5.3.Modelul Decorator ( Wrapper )

Problema:

 Extinderea (decorarea) statica sau la run-time a funcționalității sau stării unor obiecte, independent
de alte instanțe ale aceleiași clase
 Obiectul poate sa fie extins prin aplicarea mai multor decoratori
 Clasa existenta nu trebuie sa fie modificata
 Utilizarea unei abordări tradiționale, prin derivarea clasei, duce la ierarhii complexe ce sunt greu de
gestionat. Derivarea adaugă comportament nou doar la compilare

Componente:

 AbstractProduct: clasa abstracta ce


definește interfața obiectelor ce pot fi
decorate cu noi funcții;
 ConcreteProduct: definește obiecte ce
pot fi decorate;
 Decorator: gestionează o referința de tip
AbstractProduct către obiectul decorat;
o metodele moștenite din
AbstractProduct apelează
implementările specifice din clasa
obiectului referit;
o Poate defini o interfață comună
claselor decorator;
 ConcreteDecorator: Adaugă funcții noi
obiectului referit;

Avantaje:

 Extinderea funcționalității a unui obiect particular se face dinamic, la run-time


 Decorarea este transparenta pentru utilizator deoarece clasa moștenește interfața specifica
obiectului
 Decorarea se face pe mai multe niveluri, însă transparent pentru utilizator
 Nu impune limite privind un număr maxim de decorări

Dezavantaje:

 Un decorator este un wrapper pentru obiectul inițial. El nu este identic cu obiectul încapsulat
 Utilizarea excesiva generează o mulțime de obiecte care arata la fel dar care se comporta diferit –>
dificil de înțeles si verificat codul
 Situația trebuie analizata cu atenție deoarece in unele situații patternul Strategy este mai indicat
Comparatie:
Adapter – asigură o interfață diferită obiectului
Facade – asigură o interfață simplificată obiectului
Decorator – asigură o interfață îmbunătățită obiectului

5.4.Modelul Composite

Scenariu:
ACME Inc. dezvoltă o soluție software pentru managementul resurselor umane dintr-o companie.
Soluția trebuie să ofere un mecanism unitar care să centralizeze angajații companiei și care să țină cont
de:

 relațiile ierarhice
 apartenența angajaților la un departament
 rolurile diferite ale angajaților
 setul comun de funcții pe care un angajat le poate îndeplini

Problema:

 Soluția conține o mulțime de clase aflate in relație ierarhică ce


trebuie tratate unitar
 Se construiesc structuri arborescente în care nodurile
intermediare și cele frunză sunt tratate unitar

Componente:

 Componenta conține descrierea abstractă a tuturor


componentelor din ierarhie
o Descrie interfața obiectelor aflate in compoziție
 NodFrunza Rep nodurile frunza din compoziție
o Implementează toate metodele
 Composite Rep o componentă compusa – are noduri fiu
o Implem met prin care sunt gest nodurile fiu
Avantaje:

 Framework-ul nu se rescrie
 Permite gestiunea facila a unor ierarhii de clase ce conțin atât primitive cat si obiecte compuse
 Codul devine mai simplu deoarece obiectele din ierarhie sunt tratate unitar
 Adăugarea de noi componente care respecta interfața comună nu ridica probleme suplimentare
5.5.Modelul Flyweight

ACME Inc. dezvolta un editor de texte ca soluție alternativa la soluțiile cunoscute. In faza de testare s-a
observat ca pe măsura ce crește dimensiunea textului, crește și memoria ocupată de această aplicația.
Ritmul de creștere este unul anormal, destul de rapid , iar in final generează întârzieri între momentul
tastării unui caracter si cel al afișării. Teste pe aceasta zona au arătat ca exista o legătura între numărul
de caractere tastate si numărul de obiecte.

Problema:

 Soluția generează o mulțime de obiecte cu o structura interna complexa si care ocupa un volum
mare de memorie
 Obiectele au atribute comune însă o parte din starea lor variază; memoria ocupata de ele poate fi
minimizata prin partajarea stării fixe intre ele Starea obiectelor poate fi gestionat prin structuri
externe iar numărul de obiecte efectiv create poate fi minimizat
 Utilizarea unui obiect înseamnă reîncărcarea stării lui variabile într-un obiect existent

Scenariu: Diagrama:

Componente:

 Flyweight: Interfață ce permite obiectelor să primească valori ce fac parte din starea lor si să facă
diferite procesări pe baza acesteia;
 FlyweightFactory: Un pattern de tip factory ce construiește si gestionează obiecte de tip flyweight;
o Menține o colecție de obiecte diferite astfel încât ele sa fie create o singură dată
 FlyweightConcret: Clasa implementează interfața de tip Flyweight si permite stocarea stării
permanente (ce nu poate fi partajat) a obiectelor
o Valori ce reprezintă o stare temporara partajata între obiecte sunt primite si procesate
prin intermediul metodelor din interfață
 Client: Gestionează obiectele de tip flyweight si starea lor temporara
Avantaje:

 Se reduce memoria ocupata de obiecte prin partajarea lor intre clienți sau a stării lor intre obiecte
de același tip
 Pentru a gestiona corect partajarea obiectelor de tip Flyweight între clienți și fire de execuție,
acestea trebuie sa immutable

Dezavantaje:

 Trebuie analizate clasele si contextul pentru a se determina ce reprezintă stare variabilă ce poate fi
internalizată
 Efectele sunt vizibile pentru soluții in care numărul de obiecte este mare
 Nivelul de memorie redusa depinde de numărul de categorii de obiecte de tip Flyweight

 Prototype creează obiecte identice prin clonarea unui obiect existent.


o Obiectele create sunt identice (spațiu de memorie, atribute)
 Decorator permite modificarea la run-time a funcționalității obiectului fără a-i schimba definiția.
o Obiectele sunt create în mod normal și apoi decorate la execuție
 Flyweight permite stocarea și crearea obiectelor prin partajarea unui obiect parțial ce conține doar
partea comună (atribute și metode).
o Obiectele flyweight partajează partea comună însă își gestionează partea specifică

o
Sabloane asemanatoare:

 Adapter – modifica interfața obiectului


 Decorator – adaugă dinamic funcții noi la comportamentul obiectului
 Façade – asigura o interfață simplificata
5.6.Modelul Proxy

Problema:

 Interconectarea de API-uri diferite


aflate pe aceeași mașină sau in
rețea
 Definirea unei interfețe între
framework-uri diferite

Componente:

 InterfataEntitate
o Definește interfața obiectului real la care se face conectarea
o Interfața este implementata si de proxy astfel încât să se poată conecta la obiecte

 Proxy
o Gestionează referința către obiectul real
o Implementează interfața obiectului real
o Controlează accesul la obiectul real
 Entitate
o Obiectul real către care proxy-ul are legătura

Tipuri de proxy:

 Virtual Proxies: gestionează crearea si inițializarea unor obiecte costisitoare; acestea pot fi create
doar atunci când e nevoie sau partajează o singura instanță intre mai mulți client;
 Remote Proxies: asigura o instanță virtuala locala pentru un obiect aflat la distanta – Java RMI.
 Protection Proxies: controlează accesul la metodele unui obiect sau la anumite obiecte.
 Smart References: gestionează referințele către un obiect

Sabloane asemanatoare:

 Adapter – modifică interfața obiectului


 Decorator – adaugă dinamic funcții noi la comportamentul obiectului
 Strategy (Behavioral) – modifică comportamentul obiectului
 Façade – asigura o interfață simplificată
 Composite – agregă mai multe obiecte asemănătoare pentru o gestiune unitară
6. Behavioral Design Pattern

6.1.Modelul Strategy

Problema:

 Alegerea la run-time a algoritmului/funcției care sa fie utilizata pentru procesarea unor date;
 Algoritmul se poate alege pe baza unor condiții descrise la execuție in funcție de contextul datelor
de intrare
 Clasa existenta nu trebuie sa fie modificata
 Utilizarea unei abordări tradiționale, prin includerea in clasa a tuturor metodelor posibile, duce la
ierarhii complexe ce sunt greu de gestionat. Derivarea adaugă comportament nou doar la compilare

Componente:

 IStrategy: clasa abstracta ce definește


interfața obiectelor ce pot oferi noi
funcții/algoritmi de prelucrare;
 StrategyA: definește obiecte ce furnizează
soluții pentru prelucrarea datelor;
 Obiect: gestionează o referința de tip
IStrategy către obiectul care va oferi
funcția/algoritmul;
o Gestionează datele/contextual ce
necesită prelucrare;

Avantaje:

 Alegerea metodei de prelucrare a datelor se face dinamic, la run-time


 Este permisa definirea de noi algoritmi independent de modificarea clasei ce gestioneaza datele
 Nu impune limite privind un numar maxim de functii/algoritmi ve pot fi folositi
6.2.Modelul Observer

Problema:

 Exista componente care trebuie sa fie notificate la producerea unui eveniment


 Gestiunea evenimentelor la nivel de interfață
 Componentele se abonează/înregistrează la acel eveniment – modificare de stare/acțiune
 La producerea unui eveniment pot fi notificate mai multe componente

Avantaje:

 Externalizarea/delegarea funcțiilor către componente “observator” care dau soluții la anumite


evenimente independent de proprietarul evenimentului
 Conceptul integrat în pattern-ul arhitectural Model View Controller (MVC)
 Implementează conceptul POO de loose coupling – obiectele sunt interconectate prin notificări și
nu prin instanțieri de clase și apeluri de metode

Componente:

 Observabil: clasa abstracta ce definește interfața obiectelor gestionează evenimente si care sunt
observabile;
 ObservabilConcret: definește obiecte ce permit abonarea unor observatori;
 Observator: Interfață ce definește modalitatea in care sunt notificați observatorii;
o Permite gestiunea mai multor observatori
 ConcreteDecorator: Implementează funcții concrete care sunt executate in urma notificării;

Metode de comunicare:
2 modele de notificare a observatorului la modificarea stării:

 Push – obiectul trimite toate detaliile observatorului


 Pull – obiectul doar notifică observatorul și acesta cere datele când are nevoie de el
6.3.Modelul Chain Of Responsibility

Problema:

 Tratarea unui eveniment sau a unui obiect se face diferit in funcție de starea acestuia
 Gestiunea tuturor cazurilor ar implica o structură complexă care să verifice toate cazurile particulare
 Există legături de dependență între cazurile de utilizare: execuția unui caz poate implica ignorarea
celorlalte sau tratarea următorului caz

Componente:

 Handler: clasa abstracta ce definește interfața


obiectelor ce gestionează cererea de
procesare a evenimentului;
 HandlerA: definește obiecte concrete ce
formează secvența de tratare a notificării;
 Client: Generează evenimentul sau notifica
primul obiect din secvența de obiecte;
6.4.Modelul State

Problema:

 Aplicația tratează un anumit eveniment diferit în funcție de starea unui obiect


 Numărul de stări posibile poate să crească și tratarea unitară a acestora poate să influențeze
complexitatea soluției
 Modul de tratare a acțiunii este asociat unei anumite stări și este încapsulat într-un obiect de stare

Componente:

 State: clasa abstracta ce definește interfața obiectelor ce gestionează implementarea unor


acțiuni în funcție de stare;
 StareConcretaA, StareConcretaB: definește obiecte concrete ce implementează metodele de
acțiunii aferente stării respective;
 Context: gestionează referința de tip State și folosește metodele acesteia pentru a implementa
diferite prelucrări în funcție de stare;
6.5.Modelul Command

Problema:

 Aplicația definește acțiuni parametrizabile ce pot fi executate mai târziu fără a solicita clientului
cunoașterea detaliile interne necesare execuției.
 Pentru a nu bloca clientul, se dorește ca aceste acțiuni să fie definite și trimise spre execuție fără a
mai fi gestionate de client
 Se decuplează execuția întârziată (ulterioara) a unei acțiuni de proprietar. Din punctul acestuia de
vedere, acțiunea a fost deja trimisa spre execuție.
 Concept echivalent cu macro-urile. Obiectul de tip command încapsulează toate informațiile
necesare execuției acțiunii mai târziu de către responsabil
 Clientul este decuplat de cel ce executa acțiunea

Componente:

 Comanda: Definește interfața necesară execuției acțiunii + alte detalii;


 ComandaConcreta: Extinde interfața comenzii si implementează metoda prin care este controlat
Receiver-ul: Reprezintă legătura dintre Receiver si acțiune
 Client: Creează un obiect ComandaConcreta si setează Receiver-ul acestuia;
 Invoker (ManagerComenzi): Creează comanda și cere îndeplinirea acțiunii;
 Receiver
(Executant):
Obiectul care este
responsabil cu
execuția acțiunii;

Scenariu:
ACME Inc. dezvolta o
soluție software pentru
un restaurant, astfel
încât chelnerul să poată prelua comenzile direct pe telefonul mobil. Comenzile sunt preluate de la client
și ele sunt create pe loc, fiind automat alocat bucătarul specializat pe acel fel de mâncare, ingredientele
folosite si alte cerințe speciale ale clientului. Aceste detalii sunt puse de aplicație, fără a fi necesara
intervenția chelnerului care doar selectează felul de mâncare solicitat. Comenzile sunt trimise
bucătarilor la finalizarea comenzii pentru masa respectiva, urmând să fie executate in funcție de gradul
de încărcare al fiecărui bucătar.
6.6.Modelul Template Method

Problema:

 Implementarea unui algoritm presupune o secvență predefinita si fixa de pași •


 Metoda ce definește schema algoritmului – metoda template
 Pot fi extinse/modificate metodele care implementează fiecare pas însă schema algoritmului nu
este modificabilă
 Implementează principiul Hollywood: "Don't call us, we'll call you.“
 Metodele concrete de definesc pașii algoritmului sunt apelate de metoda template

Componente:

 TemplateTestare: Clasa abstracta ce definește interfața unui obiect de tip TemplateTestare si


modalitatea în care sunt executate metodele
o Conține o metod template ce implementează șablonul de execuție a interfeței și care nu se
supradefinește
 TestareJUnit: Definește interfața obiectului într-o situație concretă
 TestareNUnit: Definește interfața obiectului într-o situație concretă
6.7.Modelul Memento

Problema:

 Aplicația trebuie sa permită salvarea stării unui obiect


 Imaginile stării obiectului pentru diferite momente sunt gestionate separat
 Obiectul își poate restaura starea pe baza unei imagini anterioare

Componente:

 Memento: Gestionează starea interna a obiectului Originator pentru un anumit moment;


o Este creat de Originator si este gestionat de Caretaker
 Originator: Obiectul a cărui stare este urmărita; Poate genera un Memento cu starea lui la
momentul respective. Poate sa își reface starea pe baza unui Memento
 ManagerStari (Caretaker): Gestionează obiectele de tip Memento fără a avea acces pe conținutul
acestora;
RECAPITULARE

Creaționale:
• Factory – creează obiecte dintr-o familie
• Builder – creează obiecte setând anumite atribute
• Singleton – creează o unică instanță

Structurale:
• Adapter – adaptează un API (o interfață) la altul
• Composite – gestionează o ierarhie de obiecte
• Decorator – atribuie la run-time funcționalitate nouă unui obiect existent
• Façade – simplifica execuția (apelarea) unui scenariu complex
• Flyweight – gestionează eficient mai multe instanțe (clone) ale unui set redus de modele

Comportamentale:
• Strategy – schimba la run-time funcția executată
• Observer – execută o acțiune când are loc un eveniment sau un observabil își schimba starea
• Chain of Responsibility – gestionează o secvență de acțiuni ce pot procesa un eveniment sau un obiect
• Command – gestionează realizarea întârziată a unei acțiuni
• Memento – gestionează stările anterioare ale unui obiect
• State – stabilește tipul acțiunii în funcție de starea obiectului
• Template – gestionează un șablon fix de acțiuni

S-ar putea să vă placă și