| 64 | |
| 65 | === Il modello === |
| 66 | |
| 67 | 200606??-???? [[BR]] |
| 68 | `Branch`: diventeranno figlie delle `Expression`? |
| 69 | |
| 70 | 20060820-1238 [SoujaK] [[BR]] |
| 71 | Natura del modello: la struttura solitamente pensata come un albero di |
| 72 | espressioni e' rappresentata grazie a campi interni degli oggetti che compongono |
| 73 | l'aggregato. Si tratta di `List` o `ArrayList` nel caso di nodi non terminali, |
| 74 | altrimenti tipi specifici (bool, String, int) a seconda del caso. Il problema |
| 75 | che sorge e' come riuscire a far attraversare un aggregato cosi' eterogeneo da |
| 76 | un Iterator. [[BR]] |
| 77 | Forse potrebbe avere senso fare come e' stato fatto per Variante 1, cioe' |
| 78 | far diventare i campi interni degli `SchemeValue`. Si tenga pero' presente che lo |
| 79 | SchemeValue e', di per se', gia' un prodotto della valutazione |
| 80 | |
| 81 | === API di manipolazione generica === |
77 | | 20060820-1238 [SoujaK] [[BR]] |
78 | | Natura del modello: la struttura solitamente pensata come un albero di |
79 | | espressioni e' rappresentata grazie a campi interni degli oggetti che compongono |
80 | | l'aggregato. Si tratta di `List` o `ArrayList` nel caso di nodi non terminali, |
81 | | altrimenti tipi specifici (bool, String, int) a seconda del caso. Il problema |
82 | | che sorge e' come riuscire a far attraversare un aggregato cosi' eterogeneo da |
83 | | un Visitor o da un Iterator. [[BR]] |
84 | | '' Forse potrebbe avere senso fare come e' stato fatto per Variante 1, cioe' |
85 | | far diventare i campi interni degli !SchemeValue. '' |
| 97 | === API di manipolazione specifica === |
114 | | * Gli iterator sono da intendersi come esterni. |
115 | | * I nostri due visitor (!PrettyPrintVisitor e !InterpreterVisitor) conoscono |
116 | | direttamente la natura dell'albero di espressioni su cui lavorano. Al cliente |
117 | | e' chiaramente lasciata la possibilita' di usare un iterator. |
118 | | * Le Expression$NAME vanno arricchite con API di manipolazione specifica (i.e. |
119 | | `getter` e `setter`) per permettere all'iteratore di accedere in maniera |
120 | | indiretta ai campi di istanza. |
121 | | |
| 125 | 20060821-1316 [SoujaK] [[BR]] |
| 126 | Nell'implementazione dell'interfaccia del `Visitor` ho preferito usare nomi |
| 127 | diversi per i vari metodi (`visitA()`, `visitB()` ...), piuttosto che un unico |
| 128 | metodo `visit()` sovraccaricato. La chiarezza del codice aumenta. [[BR]] |
| 129 | 20060827-1326 [SoujaK] [[BR]] |
| 130 | Cosi' facendo ci si gioca la possibilita' di trattare genericamente con delle |
| 131 | Expression. Nell'implementazione delle operazioni polimorfe questa diventa quasi |
| 132 | una necessita' poiche' costringerebbe a controllare la classe di appartenenza |
| 133 | dell'oggetto che vogliamo visitare: si parla di if-else in cascata. Per venire a |
| 134 | capo della cosa il dott. Solmi aggiunge ai suoi costrutti un metodo ''ad-hoc'' |
| 135 | che permette di identificare il costrutto, mettendolo in corrispondenza con una |
| 136 | enumerazione. |
| 137 | |
| 138 | 20060826-2018 [SoujaK] [[BR]] |
| 139 | Sto iniziando l'implementazione del `VisitorInterpreter`: non devono forse |
| 140 | riuscire ad attraversare qualsiasi componente del modello, compresi gli stessi |
| 141 | Value e le Definition, dal momento che si riferisce alle operazioni sul modello |
| 142 | come '''polimorfe'''? |
| 143 | |
| 144 | 20060827-1744 [SoujaK] [[BR]] |
| 145 | Come si gestisce il passaggio delle informazioni indispensabili al processo di |
| 146 | valutazione, in relazione al pattern `Visitor`? |
| 147 | Il modo piu' immediato e' inserire, dove necessario, un Environment fra i |
| 148 | parametri di ingresso e un Value fra quelli di uscita nei metodi accept() e |
| 149 | visit(). Cosi' si diminuisce l'omogeneita' delle varie Expression e si sporca |
| 150 | l'interfaccia classica di questo pattern. |
| 151 | |
| 152 | 20060827-1905 [SoujaK] [[BR]] |
| 153 | La soluzione per cui ho optato e' quella di utilizare campi interni al visitor. |
| 154 | Aggiungere ai `Visitor` uno stato interno e' una pratica piuttosto diffusa che |
| 155 | non intacca l'eleganza del pattern, pur aumentandone le potenzialita': |
| 156 | * nel caso della prettyPrint potrebbe essere lo stato potrebbe essere sfruttato |
| 157 | come contatore dei livelli di indentazione; |
| 158 | * l'`Interpreter` invece potrebbe mantenere uno stack di `Value` e uno di |
| 159 | `Environment`. |
| 160 | |
| 161 | === Varie === |
| 162 | 200606??-???? [[BR]] |
| 163 | Gli iterator sono da intendersi come esterni. |