Differences

This shows you the differences between two versions of the page.

Link to this comparison view

poo-ca-cd:laboratoare:visitor [2024/11/10 17:35]
silvia_elena.nistor [Exerciţii]
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.
poo-ca-cd/laboratoare/visitor.1731252900.txt.gz · Last modified: 2024/11/10 17:35 by silvia_elena.nistor
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0