MokaByte
Numero 36 - Dicembre 99
|
||||
|
|
di oggetti Java |
||
|
|
|||
Una delle cose più importanti da capire quando si affronta per la prima volta un linguaggio ad oggetti è com'è fatto un oggetto: cosa rappresenta, come viene allocato in memoria e quali sono le sue relazioni con altri oggetti. E' anche importante capire la struttura di un oggetto in termini di ereditarietà, poiché gli attributi ereditati non si vedono nel sorgente di una classe, ma bisogna ricordarsi che esistono. Generalmente chi insegna linguaggi a oggetti si aiuta disegnando i cosiddetti "cerchiogrammi" (vedere figura sottostante) per rappresentare la costruzione per somme di attributi di un oggetto. Questo articolo vuol mostrare come si possa usare il linguaggio HTML in maniera efficiente ed economica (non c'è bisogno di comprare costosi debugger grafici) per rappresentare graficamente un oggetto, usando link ipertestuali per i riferimenti ad altri oggetti e mantenendo l'informazione di derivazione degli attributi (ereditarietà). |
||||||||||||||
Scopo
Benchè inizialmente questo package sia stato ideato per fare debugging di software scritto in Java, la sua utilità si è subito dimostrata anche nell'insegnamento del linguaggio stesso, infatti col package htmlstream (tale è il nome ;-) è possibile generare pagine html che rappresentano istanze di oggetti Java, come potete vedere da questo esempio. In tal modo si possono generare automaticamente rappresentazioni (in HTML) molto simili, per informazioni contenute, ai "cerchiogrammi" nominati poco sopra. Dato il suo uso
previsto (l'insegnamento), tra le nostre specifiche ci eravamo posti quella
di un uso molto semplice da parte dell'utente/sviluppatore. Infatti, per
usare il package è sufficiente includerlo nel proprio CLASSPATH
e creare un oggetto particolare (HtmlStream) a cui si forniscono le istanze
di oggetti da convertire in html, allo stesso modo con cui si serializzano
oggetti con un ObjectStream. L'oggetto HtmlStream è capace di seguire
i reference da solo, ha bisogno solo di un oggetto "radice" da cui partire.
Come detto più sopra, il package è molto semplice da usare, per "stampare" un oggetto attraverso htmlstream bisogna:
java MyClass >out.htmle poi visualizzate il file out.html aprendolo con un browser (è html molto basilare, va bene qualunque browser che supporti le tabelle). Un esempio
di codice
// NOTA: l'oggetto deve implementare HtmlizableIIl perché si debbano seguire questi passi verrà accennato nella sezione "Implementazione". In ogni caso l'utente dovrà sottostare ad un unico vincolo (non eccessivamente limitante): quello di poter stampare solo oggetti "stampabili". In questo ambiente di "htmlizzazione" un oggetto è "stampabile" se implementa l'interfaccia HtmlizableI, questo perché l'HtmlStream può lavorare solo con oggetti HtmlizableI. Un oggetto HtmlStream può essere accresciuto a posteriori, si possono cioè aggiungere (si potrebbe dire "accodare") altri oggetti successivamente: // assumete di avere ancora hStream nello scopeL'esempio precedente è la ragione dell'esistenza della classe HtmlStream, serve quando si vogliono stampare più oggetti in tempi diversi. L'uso è molto simile a quello della classe ObjectOutputStream, in effetti HtmlStream lavora concettualmente nello stesso modo. Un aiuto cognitivo nel comprendere HtmlStream è proprio la metafora della "coda di stampa" dove la fase di accodamento è separata da quella di stampa effettiva. Stampando a video (es. con System.out.println) un HtmlStream, otterrete del testo html, cosicchè redirigendo l'output del programma su un file otterrete qualcosa di simile a questa schermata (visualizzata attraverso un browser):
In questa figura vedete un'istanza di classe MyClass "stampata" come pagina html, ogni attributo di tipo "reference" (puntatore) viene rappresentato come collegamento ipertestuale che, se "cliccato" (cioè seguìto), vi porta al punto in cui si trova la "htmlizzazione" dell'oggetto puntato (viene realizzato attraverso ancore html interne alla pagina).
Formato
Questa rappresentazione dovrebbe essere abbastanza familiare a chi è abituato ai simboli usati in UML, anche se in questo caso ogni istanza si porta dietro tutti gli attributi (cioè compresi quelli ereditati) invece di avere una rappresentazione esterna (freccia che punta alla classe estesa). L'esempio riportato si riferisce a istanze create a partire dal seguente (parziale) diagramma delle classi UML:
A runtime tale schema genererà oggetti rappresentati col meccanismo delle "TABLE in TABLE" tipo questo:
Come rendere
gli ogetti "htmlizzabili"?
Implementazione
Il problema principale
che va affrontato durante la conversione in html è quando si ha
a che fare con un oggetto che punta ad un altro oggetto che a loro volta
punta al primo (ad es. una lista circolare). Queste sono situazioni molto
frequenti nei programmi, tanto è vero che in genere si parla di
grafi di oggetti, non di alberi. Se il processo di conversione viene
fatto in automatico, intendendo con ciò dire che ogni reference
viene seguito automaticamente, è necessario implementare un meccanismo
per evitare cicli infiniti.
for every attribute of this instanceIn realtà questa sequenza viene reiterata ad ogni livello gerarchico, dalla classe più bassa e risalendo fino a DefaultHtmlizable stessa. In questo modo si ottiene la linearizzazione iterativa del grafo di oggetti. Concludendo...
I risultati di questo lavoro sono stati presentati ad alcune conferenze dedicate all'insegnamento... data la nostra cronica mancanza di tempo, attualmente non riusciamo a sviluppare ulteriormente il package... se qualche lettore è interessato all'argomento lo invitiamo a contattarci per un'eventuale collaborazione ;-) |
||||||||||||||
|
||||||||||||||
|
||||||||||||||
MokaByte ricerca nuovi collaboratori Chi volesse mettersi in contatto con noi può farlo scrivendo a mokainfo@mokabyte.it |
||||||||||||||
|