RELAZIONE DI FUNZIONAMENTO DEL PLUG

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