This shows you the differences between two versions of the page.
poo-ca-cd:laboratoare:visitor [2024/11/10 17:33] silvia_elena.nistor |
poo-ca-cd:laboratoare:visitor [2024/11/13 09:56] (current) silvia_elena.nistor [Exerciţii] |
||
---|---|---|---|
Line 1: | Line 1: | ||
- | ===== Laboratorul 7: Visitor pattern ===== | + | ===== Laboratorul 6: Visitor pattern ===== |
**Video introductiv:** [[https://www.youtube.com/watch?v=_mfLYYInv6c| link ]] | **Video introductiv:** [[https://www.youtube.com/watch?v=_mfLYYInv6c| link ]] | ||
Line 117: | Line 117: | ||
Ne interesează să interogăm toţi angajaţii noştri asupra //venitului lor total//. Observăm că: | Ne interesează să interogăm toţi angajaţii noştri asupra //venitului lor total//. Observăm că: | ||
- | * anagajaţii obişnuiţi au salariul ca unic venit | + | * angajaţii obişnuiţi au salariul ca unic venit |
* şefii posedă, pe lângă salariu, un posibil bonus | * şefii posedă, pe lângă salariu, un posibil bonus | ||
- | Varianta la îndemână ar fi să definim, în fiecare din cele doua clase, câte o metodă, //getTotalRevenue()//, care întoarce salariul pentru angajaţi, respectiv suma dintre salariu şi bonus pentru şefi: | + | Varianta la îndemână ar fi să definim în fiecare din cele doua clase, câte o metodă, //getTotalRevenue()//, care întoarce salariul pentru angajaţi, respectiv suma dintre salariu şi bonus pentru şefi: |
<code java> | <code java> | ||
Line 198: | Line 198: | ||
Secvenţele de cod de mai sus definesc: | Secvenţele de cod de mai sus definesc: | ||
- | * o interfaţă, **Visitor**, ce reprezintă un //algoritm// oarecare, ce va putea vizita orice clasă. Observaţi definirea câte //unei metode visit(...)// pentru //fiecare clasă ce va putea fi vizitată// | + | * o interfaţă, **Visitor**, ce reprezintă un //algoritm// oarecare, ce va putea vizita orice clasă. Observaţi definirea câte //unei metode visit(...)// pentru //fiecare clasă ce va putea fi vizitată//. |
* o interfaţă, **Visitable**, a carei metodă ''accept(Visitor)'' permite rularea unui algoritm pe structura curentă. | * o interfaţă, **Visitable**, a carei metodă ''accept(Visitor)'' permite rularea unui algoritm pe structura curentă. | ||
* implementări ale metodei ''accept(Visitor)'', în cele două clase, care, pur şi simplu, solicită vizitarea instanţei curente de către vizitator. | * implementări ale metodei ''accept(Visitor)'', în cele două clase, care, pur şi simplu, solicită vizitarea instanţei curente de către vizitator. | ||
- | * o implementare a unei operații aplicabilă pe obiectele de tip Visitable | + | * o implementare a unei operații aplicabilă pe obiectele de tip Visitable. |
În exemplul de mai sus, putem identifica : | În exemplul de mai sus, putem identifica : | ||
Line 209: | Line 209: | ||
=== Double-dispatch === | === Double-dispatch === | ||
- | Mecanismul din spatele pattern-ului Visitor poartă numele de **double-dispatch**. Acesta este un concept raspândit, şi se referă la faptul că metoda apelată este determinată la //runtime// de doi factori. În exemplul Employee-Manager, efectul vizitarii, solicitate prin apelul ''e.accept(v)'', depinde de: | + | Mecanismul din spatele pattern-ului Visitor poartă numele de **double-dispatch**. Acesta este un concept răspândit, şi se referă la faptul că metoda apelată este determinată la //runtime// de doi factori. În exemplul Employee-Manager, efectul vizitării, solicitate prin apelul ''e.accept(v)'', depinde de: |
* tipul elementului vizitat, ''e'' (//Employee// sau //Manager//), pe care se invocă metoda | * tipul elementului vizitat, ''e'' (//Employee// sau //Manager//), pe care se invocă metoda | ||
* tipul vizitatorului, ''v'' (//RevenueVisitor//), care conţine implementările metodelor //visit// | * tipul vizitatorului, ''v'' (//RevenueVisitor//), care conţine implementările metodelor //visit// | ||
Line 260: | Line 260: | ||
==== Exerciţii ==== | ==== Exerciţii ==== | ||
- | Dorim să prelucrăm forme geometrice, pe care să le afișăm în diverse formate: text și JSON [https://datatracker.ietf.org/doc/html/rfc8259]. Pentru un design decuplat între formele prelucrate și tipurile de formate dorite, implementați conversia folosind patternul Visitor. | + | Dorim să prelucrăm forme geometrice, pe care să le afișăm în diverse formate: text și JSON https://datatracker.ietf.org/doc/html/rfc8259. Pentru un design decuplat între formele prelucrate și tipurile de formate dorite, implementați conversia folosind patternul Visitor. |
Problema de pe DevMind va avea două task-uri, corespunzătoare celor două tipuri de Visitor. Pentru simplitatea implementării acestor Visitors, vă sugerăm să urmăriți TODO-urile din schelet. | Problema de pe DevMind va avea două task-uri, corespunzătoare celor două tipuri de Visitor. Pentru simplitatea implementării acestor Visitors, vă sugerăm să urmăriți TODO-urile din schelet. | ||
- | * Vom avea trei tipuri de forme geometrice care implementează interfața comună "**Shape**": **Dot**, **Circle**, **Triangle**. Aceste tipuri de forme vor accepta obiecte Visitor pentru a putea permite afișarea lor în cele două formate. | + | * Vom avea trei tipuri de forme geometrice care implementează interfața comună "**Shape**": **Dot**, **Circle**, **Rectangle**. Aceste tipuri de forme vor accepta obiecte Visitor pentru a putea permite afișarea lor în cele două formate. |
* Vom avea două tipuri de Visitor care implementează interfața comună "**Visitor**": **TextVisitor** și **JsonVisitor**. Fiecare Visitor va implementa metoda visit(), care va aplica modalitatea de afișare specifică pe obiectul primit ca parametru. | * Vom avea două tipuri de Visitor care implementează interfața comună "**Visitor**": **TextVisitor** și **JsonVisitor**. Fiecare Visitor va implementa metoda visit(), care va aplica modalitatea de afișare specifică pe obiectul primit ca parametru. | ||
* Scheletul conține în fiecare clasă copil a tipului Shape, câmpuri specifice formei geometrice. Pentru acestea, va trebui să creați getters și setters. | * Scheletul conține în fiecare clasă copil a tipului Shape, câmpuri specifice formei geometrice. Pentru acestea, va trebui să creați getters și setters. | ||
Line 274: | Line 274: | ||
Exemplu de format text | Exemplu de format text | ||
- | { | + | Circle - radius = 30 |
- | Circle - radius = 30 | + | |
- | } | + | |