| | 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. |