ANALISI DEL FUNZIONAMENTO DEL PLUG-IN DI ECLIPSE “MERLIN GENERATOR” • Corso: • Studente: • N.mat: Ingegneria del software A Nigro Carlo 145559 Il pacchetto merlin generator contiene al suo interno due stumenti per creare e gestire diagrammi di flusso (o uml) all’interno di eclipse: EMF (Eclipse modeling framework) e GEF (Graphical Editing Framework). Essi offrono all’utente un’interfaccia abbastanza semplice, composta da un editor grafico e da una struttura ad albero che viene creata a partire dal file che si ottiene salvando il diagramma. Lo studio è stato mirato al test delle seguenti caratteristiche: 1. 2. 3. 4. 5. Variazione dell’aspetto grafico dei diagrammi (frecce – contenitori di classe) Effettuare operazioni di taglia/incolla tra vari diagrammi Definizione di sotto-diagrammi da collegare tra loro Generazione di codice java a partire dai diagrammi Generazione di diagrammi a partire dal codice java 1 La creazione di una classe è un’operazione semplice, basta infatti premere il bottone indicato in figura e cliccare con il mouse sulla posizione in cui si vuole posizionare. Appare quindi una finestra di dialogo che richiede l’inserimento di un nome e di specificare se si vuole creare una classe astratta o un’interfaccia. Le operazioni di aggiustamento del riquadro così ottenuto sono paragonabili alle funzionalità base di un editor grafico qualunque. E’ infatti possibile spostare uno o più oggetti di questo tipo con il mouse (una volta selezionati insieme) così come si possono ingrandire a proprio piacimento. I vari blocchi possono essere collegati tra loro mediante tre tipi di frecce: • Associative Æ definiscono il tipo di cardinalità che esiste tra due classi. • Generali Æ collegamento di tipo standard (utile a fini visuali). • Di dipendenza Æ indicano appunto la dipendenza di una classe dall’altra. E’ possibile scegliere tra due tipi di algoritmi di collegamento: • Standard Æ collegamento lineare • Manhattan Æ collegamento angolare Pur traslando un blocco collegato ad un altro, la funzione di ancoraggio lascia inalterati i collegamenti, spostandoli eventualmente attorno ad essi. Un effetto spiacevole è però dato quando si verifica una sovrapposizione. Il problema potrebbe essere risolto con lo studio di un algoritmo che consideri la presenza di ostacoli sul cammino di una freccia. Non è possibile inoltre cambiare la forma né i colori della stessa, cosa che farebbe comodo nella stampa su carta di un diagramma molto complesso per capire a colpo d’occhio le varie relazioni. La figura seguente mostra come vengano visualizzati metodi e proprietà di una classe all’interno di un blocco ed il layout di una semplice struttura: Grazie a delle linee guida è molto semplice allineare correttamente i blocchi tra di loro. Esse vengono mostrate all’atto di trascinare un elemento all’interno dell’editor. Come per le frecce non è possibile cambiare l’aspetto dei blocchi. Come si può notare infatti, nonostante la super-classe ‘Animali’ sia stata definita come astratta e le altre no, non esistono elementi visuali che ne permettano l’identificazione, a parte le frecce che puntano veso di essa. 2 Seppur semplice l’immissione dei membri di ogni classe (cliccando con il tasto destro del mouse e selezionando ‘new Æ Attribute || Method’) non è ausiliata da strumenti di taglia/copia/incolla, che nel caso di creazione di una classe astratta con molte sottoclassi derivate (vedi figura precedente), sarebbe molto di aiuto in termini di velocità. I vari elementi dell’editor inoltre non sono protetti da cancellazione accidentale. All’atto dell’eliminazione, tutto ciò su cui si può contare è una finestra di dialogo che avverte di questa mancanza. 3 Una funzionalità molto utile è quella di poter definire dei sotto-diagrammi e collegarli con il resto della struttura o con altri sotto-diagrammi. Questo tipo di oggetto si ottiene nell’editor cliccando il pulsante ‘Create a package’. Tale strumento presenta notevoli vantaggi poiché permette di sintetizzare una struttura che altrimenti sarebbe troppo estesa da presentare su un’unica pagina. Si pensi al poter raggruppare al suo interno la sottoclasse ‘Animali domestici’ che a sua volta potrebbe contenere le sottoclassi erbivori ed onnivori che contengono a loro volta tutti i tipi di animali di quel particolare tipo. Cliccando con il tasto destro del mouse su di esso e sulla voce ‘Open diagram’, viene creata una nuova area di disegno in cui è possibile creare un nuovo diagramma. Si sono però verificati tre problemi alquanto rilevanti: 1. Come si vede nella figura sopra, è possibile soltanto mettere al suo interno, trascinandole dentro, interi blocchi di classi con tutta la lista di metodi e proprietà e non una semplice intestazione per ognuna in modo da risparmiare spazio. 2. Non è possibile salvarne il contenuto, una volta che si è disegnato nell’editor ad esso dedicato con il tasto save di Eclipse e nella zona ‘Error Log’ appaiono gli errore ‘java.lang.NullPointerException’ e ‘Unhandled event loop exception’. Provando a chiudere il diagramma e rispondendo ‘Si’ alla richiesta della finestra di dialogo di salvare, sembra che tutto vada a posto. Provando però ad aprire il file salvato compare un altro errore: ‘Unable to create this part due to an internal error. Reason for the failure: An unexpected exception was thrown.’. 3. Quando si va a creare una classe, il nome della stessa non compare. Quando si vanno a creare metodi e proprietà della stessa classe il comportamento è il medesimo, ma stavolta compare il nome dell’elemento creato in precedenza. E’ come se l’oggetto stringa che riguarda le etichette rimanesse in coda invece di essere visualizzato e venga inserito al suo posto quando invece dovrebbe essere istanziato il successivo. L’esempio seguente chiarisce bene tale concetto. 4 Uno strumento molto utile è il ‘code generator’ che permette di generare automaticamente del codice java a partire dal diagramma uml che si è creato graficamente. Per fare ciò è necessario creare un modello emf ad albero cliccando su ‘File Æ New Æ Other... ÆEclipse Modeling Framework ÆEMF Model’. Dopo aver scelto il nome del file che verrà creato, si seleziona ‘EMF core model’ e si sceglie il file .ecore generato al momento della creazione del diagramma. Una volta aperto, il modello mostrerà la struttura ad albero delle classi, mostrando metodi, proprietà e dipendenze (figura sotto Æ destra). Facendo click con il tasto destro del mouse in un punto qualunque dell’area attiva del file .genmodel, comparirà un menù a tendina dal quale è possibile scegliere l’opzione ‘Generate Model Code’ che genera il codice in java ed aggiunge i files al progetto come si può vedere in figura a sinistra. Qui di seguito allego il codice dei files animali.java e leone.java a titolo dimostrativo: animali.java package workflow; import org.eclipse.emf.ecore.EObject; /** * @author Carlo Nigro * @model abstract="true" * @generated */ public interface Animali extends EObject { /** * Returns the value of the '<em><b>Verso</b></em>' attribute. <!-- beginuser-doc --> <p> If the meaning of the '<em>Verso</em>' attribute isn't clear, there really should be more of a description here... </p> <!-- end-user-doc --> * @return the value of the '<em>Verso</em>' attribute. * @see #setVerso(String) * @see workflow.WorkflowPackage#getAnimali_Verso() * @uml.property name="verso" * @model * @generated */ String getVerso(); /** * Sets the value of the ' {@link workflow.Animali#getVerso <em>Verso</em>} ' attribute. <!-- begin-user-doc --> <!-- end-user-doc --> * @param value the new value of the '<em>Verso</em>' attribute. * @see #getVerso() * @uml.property name="verso" * @generated */ void setVerso(String value); /** * <!-- begin-user-doc --> * <!-- end-user-doc --> * @model * @generated */ String ritornaVerso(); } // Animali Leone.java package workflow; /** * @author Carlo Nigro * @models * @generated */ public interface Leone extends Animali { /** * Returns the value of the '<em><b>Verso</b></em>' attribute. <!-- beginuser-doc --> <p> If the meaning of the '<em>Verso</em>' attribute isn't clear, there really should be more of a description here... </p> <!-- end-user-doc --> * @return the value of the '<em>Verso</em>' attribute. * @see #setVerso(String) * @see workflow.WorkflowPackage#getLeone_Verso() * @uml.property name="verso" * @model * @generated */ String getVerso(); /** * Sets the value of the ' {@link workflow.Leone#getVerso <em>Verso</em>} ' attribute. <!-- begin-user-doc --> <!-- end-user-doc --> * @param value the new value of the '<em>Verso</em>' attribute. * @see #getVerso() * @uml.property name="verso" * @generated */ void setVerso(String value); /** * Returns the value of the '<em><b>Preda</b></em>' attribute. <!-- beginuser-doc --> <p> If the meaning of the '<em>Preda</em>' attribute isn't clear, there really should be more of a description here... </p> <!-- end-user-doc --> * @return the value of the '<em>Preda</em>' attribute. * @see #setPreda(String) * @see workflow.WorkflowPackage#getLeone_Preda() * @uml.property name="preda" * @model * @generated */ String getPreda(); /** * Sets the value of the ' {@link workflow.Leone#getPreda <em>Preda</em>} ' attribute. <!-- begin-user-doc --> <!-- end-user-doc --> * @param value the new value of the '<em>Preda</em>' attribute. * @see #getPreda() * @uml.property name="preda" * @generated */ void setPreda(String value); /** * <!-- begin-user-doc --> * <!-- end-user-doc --> * @model * @generated */ String ritornaVerso(); /** * <!-- begin-user-doc --> * <!-- end-user-doc --> * @model * @generated */ String ritornaPreda(); } // Leone I files come si può notare contengono tutto quanto sia utile all’implementazione delle classi, compresa l’aggiunta di metodi getter e setter per le variabili dichiarate private. Sono inoltre presenti numerose linee di commento utili per creare documentazione. In questa sezione non sono stati riscontrati problemi. 5 Una delle limitazioni di Merlin Generator è non poter ricavare diagrammi a partire da codice java, cosa che invece si ottiene con il plug-in UML. Essi si ottengono cliccando su ‘Open UML Æ Class Diagram Editor’ dal menù a tendina che compare nella sezione ‘Package Explorer’. Compare un finestra di dialogo che permette di selezionare i files da trasformare in diagramma. Non compaiono però come si può vedere le frecce che dovrebbero collegare i vari diagrammi a seconda della dipendenza delle classi derivate dalla classe base. Di contro è possibile andare a modificare a proprio piacimento il codice java dei files e il diagramma si autoaggiorna senza dover agire manualmente sui controlli New Æ Attribute || Method. A differenza dell’editor ottenuto con EMF, questo editor è un po’ più completo, infatti è possibile oltre che immettere metodi e proprietà della classe all’interno della classe, anche implementare iterativamente i metodi senza dover agire direttamente sul file. Inoltre l’aspetto grafico è lievemente migliore ed evidenzia meglio le varie componenti oltre che segnalare eventuali problemi che si avrebbero in compilazione, come si può vedere dal triangolino giallo vicino al titolo della classe ‘Territorio’.