This shows you the differences between two versions of the page.
|
poo-ca-cd:laboratoare:design-patterns-part-two [2025/12/03 02:41] florian_luis.micu [Dezavantaje] |
poo-ca-cd:laboratoare:design-patterns-part-two [2025/12/03 02:54] (current) florian_luis.micu [Exemplu complet varianta simplă] |
||
|---|---|---|---|
| Line 20: | Line 20: | ||
| - | ======Builder====== | + | ======👷 Builder====== |
| **Builder** este un **creational design pattern** folosit când ai obiecte complexe, cu **multe câmpuri opționale** sau **pași de inițializare diferiți**. El separă construcția obiectului de reprezentarea lui, astfel încât același proces de construire poate genera obiecte diferite. | **Builder** este un **creational design pattern** folosit când ai obiecte complexe, cu **multe câmpuri opționale** sau **pași de inițializare diferiți**. El separă construcția obiectului de reprezentarea lui, astfel încât același proces de construire poate genera obiecte diferite. | ||
| Line 293: | Line 293: | ||
| =====Exemplu complet varianta simplă===== | =====Exemplu complet varianta simplă===== | ||
| - | Există o variantă mai simplă a acestui pattern care folosește o clasă internă și pe care o veți folosi mai des în proiectele voastre: | + | Există o variantă **mai simplă** a acestui pattern care folosește o clasă internă și pe care o veți folosi mai des în proiectele voastre: |
| <code java> | <code java> | ||
| Line 365: | Line 365: | ||
| <note tip> | <note tip> | ||
| - | Este **mult mai ușor să scrieți** și, mai important, **să citiți** acest cod. La fel ca în cazul constructorului, putem verifica parametrii trecuți pentru orice încălcare, cel mai adesea în cadrul metodei ''build()'' sau a metodei setter, și putem arunca ''IllegalStateException'' dacă există încălcări înainte de a crea o instanță a clasei. | + | * Este **mult mai ușor să scrieți** și, mai important, **să citiți** acest cod. La fel ca în cazul constructorului, putem verifica parametrii trecuți pentru orice încălcare, cel mai adesea în cadrul metodei ''build()'' sau a metodei setter, și putem arunca ''IllegalStateException'' dacă există încălcări înainte de a crea o instanță a clasei. |
| + | * Vă încurajăm să **folosiți această versiune a pattern-ului Builder** și să recurgeți la varianta mai complexă doar dacă aveți nevoie de mai mulți Builderi specifici. | ||
| </note> | </note> | ||
| Line 389: | Line 390: | ||
| </code> | </code> | ||
| </note> | </note> | ||
| - | ======Observer====== | + | ======👀 Observer====== |
| Observer este un **behavioral design pattern** folosit atunci când ai un obiect (denumit Subject) care trebuie să **notifice** automat alte obiecte (Observeri) atunci când starea sa internă se schimbă, practic definând o relație **1:N**. | Observer este un **behavioral design pattern** folosit atunci când ai un obiect (denumit Subject) care trebuie să **notifice** automat alte obiecte (Observeri) atunci când starea sa internă se schimbă, practic definând o relație **1:N**. | ||
| Line 582: | Line 583: | ||
| * În locul listei simple de observatori, în proiecte moderne se folosesc **API-uri reactive**: **java.util.concurrent.Flow** sau **RxJava** / **Project Reactor**, care permit **backpressure** și **stream-uri de evenimente mai complexe**. | * În locul listei simple de observatori, în proiecte moderne se folosesc **API-uri reactive**: **java.util.concurrent.Flow** sau **RxJava** / **Project Reactor**, care permit **backpressure** și **stream-uri de evenimente mai complexe**. | ||
| </note> | </note> | ||
| - | ======Strategy====== | + | ======🎲 Strategy====== |
| Strategy este un **behavioral design pattern** care permite definirea unei **familii de algoritmi**, fiind **încapsulați** și **interschimbabili**. Strategy permite schimbarea comportamentului unui obiect în timpul execuției fără a modifica codul clientului care îl folosește. | Strategy este un **behavioral design pattern** care permite definirea unei **familii de algoritmi**, fiind **încapsulați** și **interschimbabili**. Strategy permite schimbarea comportamentului unui obiect în timpul execuției fără a modifica codul clientului care îl folosește. | ||
| Line 756: | Line 757: | ||
| În aplicații **Spring** sau **Quarkus**, Strategy este folosit în **bean-uri**, pentru a schimba comportamentul fără a modifica clientul. | În aplicații **Spring** sau **Quarkus**, Strategy este folosit în **bean-uri**, pentru a schimba comportamentul fără a modifica clientul. | ||
| </note> | </note> | ||
| - | ======Command====== | + | ======🎮 Command====== |
| Command este un **behavioral design pattern** folosit pentru a **încapsula o solicitare** sau o **acțiune** ca un obiect. Acest pattern permite **parametrizarea** obiectelor cu diferite acțiuni, **stocarea** cererilor și **posibilitatea de a le executa mai târziu**, inclusiv să le **anulezi** sau să le **refaci**. | Command este un **behavioral design pattern** folosit pentru a **încapsula o solicitare** sau o **acțiune** ca un obiect. Acest pattern permite **parametrizarea** obiectelor cu diferite acțiuni, **stocarea** cererilor și **posibilitatea de a le executa mai târziu**, inclusiv să le **anulezi** sau să le **refaci**. | ||
| Line 987: | Line 988: | ||
| Pattern-ul Command este foarte folosit în aplicații enterprise moderne cu **RabbitMQ**, **Kafka** sau **task queues**, unde „comanda” devine un mesaj. | Pattern-ul Command este foarte folosit în aplicații enterprise moderne cu **RabbitMQ**, **Kafka** sau **task queues**, unde „comanda” devine un mesaj. | ||
| </note> | </note> | ||
| - | ======Tips & Tricks Design Patterns====== | + | ======🪄 Tips & Tricks Design Patterns====== |
| =====Comparare între Design Patterns===== | =====Comparare între Design Patterns===== | ||
| Line 1058: | Line 1059: | ||
| <note tip> | <note tip> | ||
| Putem reduce și mai mult comparația celor 3 pattern-uri astfel: | Putem reduce și mai mult comparația celor 3 pattern-uri astfel: | ||
| - | * Relație 1:N - Strategy - Un obiect (1) poate avea mai multe prețuri (N). | + | * **Relație 1:N** - **Strategy** - Un obiect (1) poate avea mai multe prețuri (N). |
| - | * Relație N:N - Visitor - Mai multe tiprui de noduri (N) pot avea mai mulți algoritmi de exportare (N). | + | * **Relație N:N** - **Visitor** - Mai multe tiprui de noduri (N) pot avea mai mulți algoritmi de exportare (N). |
| - | * Operații care necesită istoric (undo/redo/do) - Command - Pictează o formă (do), apasă CTRL + Z (undo), apasă SHIFT + CTRL + Z (redo). | + | * **Operații care necesită istoric** (undo/redo/do) - **Command** - Pictează o formă (do), apasă CTRL + Z (undo), apasă SHIFT + CTRL + Z (redo). |
| </note> | </note> | ||
| Line 1072: | Line 1073: | ||
| <note important> | <note important> | ||
| - | Deși este recomandat să combinați aceste pattern-uri este foarte important să nu creați un sistem mult prea complex pentru nevoia aplicației voastre. Folosind ideologia //"Sometimes less is more"// vă recomandăm să nu optimizați prematur proiectele voastre și să țineți cont de principiul [[https://codesignal.com/learn/courses/applying-clean-code-principles/lessons/kiss-keep-it-simple-stupid-strategies|KISS]]. | + | Deși este recomandat să combinați aceste pattern-uri este foarte important **să nu creați un sistem mult prea complex** pentru nevoia aplicației voastre. Folosind ideologia //"Sometimes less is more"// vă recomandăm să nu optimizați prematur proiectele voastre și să țineți cont de principiul [[https://codesignal.com/learn/courses/applying-clean-code-principles/lessons/kiss-keep-it-simple-stupid-strategies|KISS]]. |
| </note> | </note> | ||
| <note tip> | <note tip> | ||
| - | Pentru a vedea mai multe Design Patterns și pentru a le compara vă recomandăm să studiați catalogul de pe [[https://refactoring.guru/design-patterns/catalog|Refactoring Guru]]. | + | Pentru a vedea mai multe Design Patterns și pentru a le compara vă recomandăm să **studiați** catalogul de pe [[https://refactoring.guru/design-patterns/catalog|Refactoring Guru]]. |
| </note> | </note> | ||
| Line 1088: | Line 1089: | ||
| <note important> | <note important> | ||
| - | În cadrul acestui laborator, exercițiile valorează în total **18p**. Pentru primirea punctajului maxim pe acest laborator, trebuie să acumulați 10p din rezolvarea exercițiilor, orice depășește 10p fiind contorizat ca și bonus. | + | În cadrul acestui laborator, exercițiile valorează în total **18p**. Pentru primirea punctajului maxim pe acest laborator, **trebuie să acumulați 10p** din rezolvarea exercițiilor, orice depășește 10p **nu va fi contorizat ca bonus**. |
| </note> | </note> | ||