Changes between Version 11 and Version 12 of Variante2


Ignore:
Timestamp:
Aug 27, 2006, 9:15:05 PM (18 years ago)
Author:
soujak
Comment:

Aggiornamento da changeset:22

Legend:

Unmodified
Added
Removed
Modified
  • Variante2

    v11 v12  
    66
    77Questo documento e' presente in duplice copia: fra i sorgenti in modo da essere
    8 facilmente editabile e leggibile in fase di sviluppo, e sul wiki
    9 [src:/branches/var2/doc/Appunti] e nel wiki [wiki:Variante2] per aumentarne la
     8facilmente editabile e leggibile in fase di sviluppo, e sul [wiki:Variante2 wiki]
     9e fra i [source:branches/var2/doc/Appunti sorgenti] per aumentarne la
    1010facilita' di utilizzo. Dal momento che i commenti sul wiki possono essere
    1111lasciati anche da chi non segue direttamente lo sviluppo, l'utilizzo del file
     
    5959   cosa a bassa priorita'.''
    6060
     61
     62
    6163== Diaro di bordo: dubbi, problemi e conseguenti scelte ==
     64
     65=== Il modello ===
     66
     67200606??-???? [[BR]]
     68`Branch`: diventeranno figlie delle `Expression`?
     69
     7020060820-1238 [SoujaK] [[BR]]
     71Natura del modello: la struttura solitamente pensata come un albero di
     72espressioni e' rappresentata grazie a campi interni degli oggetti che compongono
     73l'aggregato. Si tratta di `List` o `ArrayList` nel caso di nodi non terminali,
     74altrimenti tipi specifici (bool, String, int) a seconda del caso. Il problema
     75che sorge e' come riuscire a far attraversare un aggregato cosi' eterogeneo da
     76un Iterator. [[BR]]
     77Forse potrebbe avere senso fare come e' stato fatto per Variante 1, cioe'
     78far diventare i campi interni degli `SchemeValue`. Si tenga pero' presente che lo
     79SchemeValue e', di per se', gia' un prodotto della valutazione
     80
     81=== API di manipolazione generica ===
    6282
    638320060725-1758 [gnappo] [[BR]]
     
    7595sollevamento di un eccezione).
    7696
    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 ===
    8698
    879920060820-1332 [SoujaK] [[BR]]
     
    90102effettuate all'esterno di esso. Affinche' i `Visitor` riescano nel loro intento
    91103hanno ovviamente bisogno di conoscere l'oggetto che intendono visitare.
     104
     105=== Visitor ===
    92106
    9310720060820-1817 [SoujaK] [[BR]]
     
    108122visita, dal momento che la sua implementazione risiede, in tutte le sue
    109123componenti, proprio fra i metodi di visita degli oggetti. [[BR]]
    110 Faro' cosi'.
    111  
    112 === Appunti vari ===
    113124
    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  
     12520060821-1316 [SoujaK] [[BR]]
     126Nell'implementazione dell'interfaccia del `Visitor` ho preferito usare nomi
     127diversi per i vari metodi (`visitA()`, `visitB()` ...), piuttosto che un unico
     128metodo `visit()` sovraccaricato. La chiarezza del codice aumenta. [[BR]]
     12920060827-1326 [SoujaK] [[BR]]
     130Cosi' facendo ci si gioca la possibilita' di trattare genericamente con delle
     131Expression. Nell'implementazione delle operazioni polimorfe questa diventa quasi
     132una necessita' poiche' costringerebbe a controllare la classe di appartenenza
     133dell'oggetto che vogliamo visitare: si parla di if-else in cascata. Per venire a
     134capo della cosa il dott. Solmi aggiunge ai suoi costrutti un metodo ''ad-hoc''
     135che permette di identificare il costrutto, mettendolo in corrispondenza con una
     136enumerazione.
     137
     13820060826-2018 [SoujaK] [[BR]]
     139Sto iniziando l'implementazione del `VisitorInterpreter`: non devono forse
     140riuscire ad attraversare qualsiasi componente del modello, compresi gli stessi
     141Value e le Definition, dal momento che si riferisce alle operazioni sul modello
     142come '''polimorfe'''?
     143
     14420060827-1744 [SoujaK] [[BR]]
     145Come si gestisce il passaggio delle informazioni indispensabili al processo di
     146valutazione, in relazione al pattern `Visitor`?
     147Il modo piu' immediato e' inserire, dove necessario, un Environment fra i
     148parametri di ingresso e un Value fra quelli di uscita nei metodi accept() e
     149visit(). Cosi' si diminuisce l'omogeneita' delle varie Expression e si sporca
     150l'interfaccia classica di questo pattern.
     151
     15220060827-1905 [SoujaK] [[BR]]
     153La soluzione per cui ho optato e' quella di utilizare campi interni al visitor.
     154Aggiungere ai `Visitor` uno stato interno e' una pratica piuttosto diffusa che
     155non 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 ===
     162200606??-???? [[BR]]
     163Gli iterator sono da intendersi come esterni.
    122164
    123165
    124 == Operazioni aggiunte ==
     166
     167
     168== Operazioni aggiunte - `contrib` ==
     169
    125170Questo e' il posto in cui rendere note le proprie scelte.
    126171