User Tools

Site Tools


Problem constructing authldap
laboratoare:tutorial-doubledispatch
Differences

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

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
laboratoare:tutorial-doubledispatch [2014/10/27 15:57]
Daniel Ciocirlan
laboratoare:tutorial-doubledispatch [2014/11/03 10:53] (current)
Daniel Ciocirlan
Line 61: Line 61:
 ===Double Dispatch=== ===Double Dispatch===
  
-Să ne uităm încă o dată la soluția precedentă. Observăm că obiectele ''​A''​ "​acționează"​ asupra obiectelor ''​B'',​ fără ca obiectele ''​B''​ să aibă nicio "​implicare"​. Obiectele ''​B''​ sunt doar pasate ca parametri la metodele obiectelor ''​A''​ iar fiecare obiect ''​A''​ procesează,​ în mod polimorfic ​(**TODO link**), parametrul după implementarea proprie:+Să ne uităm încă o dată la soluția precedentă. Observăm că obiectele ''​A''​ "​acționează"​ asupra obiectelor ''​B'',​ fără ca obiectele ''​B''​ să aibă nicio "​implicare"​. Obiectele ''​B''​ sunt doar pasate ca parametri la metodele obiectelor ''​A''​ iar fiecare obiect ''​A''​ procesează,​ în mod [[http://​en.wikipedia.org/​wiki/​Polymorphism_(computer_science)#​Subtyping|polimorfic]], parametrul după implementarea proprie:
  
 <code java> <code java>
Line 76: Line 76:
  void accept(A a) {  void accept(A a) {
  a.interactWith(this);​  a.interactWith(this);​
- } 
-  
- @Override 
- public String toString() { 
- return "​B";​ 
  }  }
 } }
Line 87: Line 82:
  void accept(A a) {  void accept(A a) {
  a.interactWith(this);​  a.interactWith(this);​
- } 
-  
- public String toString() { 
- return "​B1";​ 
  }  }
 } }
Line 97: Line 88:
  void accept(A a) {  void accept(A a) {
  a.interactWith(this);​  a.interactWith(this);​
- } 
-  
- @Override 
- public String toString() { 
- return "​B2";​ 
  }  }
 } }
Line 114: Line 100:
 </​code>​ </​code>​
  
-**Întrebarea 1:** Ar avea, oare, același efect? De ce? Încercați!+**Întrebarea 1:** Ar avea, oare, același efect ca mai devreme? De ce? Încercați!
  
 Schimbarea mai mare intervine la clasele ''​A''​. Să spargem implementarea ''​interactWith(B b)'',​ mutând codul din fiecare bloc ''​instanceof''​ în metode separate, ca în exemplul următor: Schimbarea mai mare intervine la clasele ''​A''​. Să spargem implementarea ''​interactWith(B b)'',​ mutând codul din fiecare bloc ''​instanceof''​ în metode separate, ca în exemplul următor:
Line 141: Line 127:
 Ne folosim, astfel, de tipurile concrete ale obiectelor care interacționează,​ **fără să testăm efectiv tipurile adevărate** în cod. Astfel, gândind în perspectivă,​ să răspundem la aceleași întrebări:​ Ne folosim, astfel, de tipurile concrete ale obiectelor care interacționează,​ **fără să testăm efectiv tipurile adevărate** în cod. Astfel, gândind în perspectivă,​ să răspundem la aceleași întrebări:​
  
-  * Dacă adăugăm o nouă clasă în ierarhia ''​A'',​ atunci ea trebuie să suprascrie toate metodele ''​interactWith''​. Oricum va trebui să implementeze operațiile diferite pentru fiecare ''​B''​ în parte, iar modularizarea este un plus.+  * Dacă adăugăm o nouă clasă în ierarhia ''​A'',​ atunci ea trebuie să suprascrie toate metodele ''​interactWith''​. Oricum va trebui să implementeze operațiile diferite pentru fiecare ''​B''​ în parte, iar **modularizarea este un plus**.
   * Dacă adăugăm o nouă clasă în ierarhia ''​B''​ (fie ea ''​B3''​),​ trebuie să suprascrie metoda ''​accept(A a)'',​ a cărei implementare va fi o singură linie: ''​a.interactWith(this)''​ => trebuie ca fiecare clasă ''​A''​ să aibă o nouă metodă ''​interactWith(B3 b)''​.   * Dacă adăugăm o nouă clasă în ierarhia ''​B''​ (fie ea ''​B3''​),​ trebuie să suprascrie metoda ''​accept(A a)'',​ a cărei implementare va fi o singură linie: ''​a.interactWith(this)''​ => trebuie ca fiecare clasă ''​A''​ să aibă o nouă metodă ''​interactWith(B3 b)''​.
-  * Cum arată codul pentru ierarhii mai mari? Structurat și organizat:+  * Cum arată codul pentru ierarhii mai mari? **Structurat și organizat**:
     * fiecare clasă ''​A''​ are propriile implementări de interacțiuni,​ pe care, la nevoie, le putem modifica imediat, punctual, fără să căutăm în ''​instanceof''​-uri     * fiecare clasă ''​A''​ are propriile implementări de interacțiuni,​ pe care, la nevoie, le putem modifica imediat, punctual, fără să căutăm în ''​instanceof''​-uri
-    * nu mai facem absolut niciun test de tip concret pentru obiectele care interacționează;​ un mare beneficiu din punctul de vedere al extensibilității+    * nu mai facem **absolut niciun test de tip concret** pentru obiectele care interacționează;​ un mare beneficiu din punctul de vedere al extensibilității
  
-De ce se numește acest mecanism double dispatch? //​Dispatch//​ este termenul folosit atunci când gândim ca mașina virtuală Java și ne referim la metoda //​concretă//​ care se apelează la un moment dat. //Double// pentru că interacțiunea observăm că funcționează în ambele sensuri: ''​B''​-urile cheamă ​metodela ​proprie, concretă de ''​accept'',​ care apelează metoda concretă ​de interacțiune ​din clasa ''​A''​.+De ce se numește acest mecanism double dispatch? //​Dispatch//​ este termenul folosit atunci când gândim ca mașina virtuală Java și ne referim la metoda //​concretă//​ care se apelează la un moment dat. //Double// pentru că interacțiunea observăm că funcționează în ambele sensuri: ''​B''​-urile cheamă ​metoda ​proprie, concretă de ''​accept'',​ care apelează metoda concretă ​''​interactWith'' ​din clasa ''​A''​.
laboratoare/tutorial-doubledispatch.1414418251.txt.gz · Last modified: 2014/10/27 15:57 by Daniel Ciocirlan