UNIVERSITÀ DEGLI STUDI DI MILANO BICOCCA
Corso di Laurea Magistrale in Informatica
Corso di Evoluzione Software e Reverse Engineering
Anno Accademico 2008/2009
Design Pattern Detection Tool
Pinot
Verifica Manuale Istanze di Design
Pattern rilevate e Raffinamento
Carella Carmine
Falco Giuseppe
Faustinoni Fabrizio
Passoni Alberto
Risultati Pinot
2
Risultati verifica manuale e
raffinamento
Tabella di confronto dei risultati:
# Istanze rilevate
Verifica manuale
Raffinamento
Adapter
5
5
4
Composite
4
0
0
Visitor
1
(1)
0
Template Method
2
2
1
NOTE:
•
In verifica manuale il numero rappresenta le istanze che sono effettivamente istanze di quel DP.
•
In raffinamento è indicato il numero di istanze per le quali il raffinamento ha avuto esito positivo.
3
Design Pattern Adapter - Descrizione
Struttura del Pattern – Object Adapter
Requisiti:
1.
La classe Adapter estende
o implementa la classe
Target.
2.
L’Adapter ha al suo interno
un’istanza della classe
Adaptee.
3.
Alcuni metodi dell’Adapter
fanno invocazioni ai metodi
dell’Adaptee attraverso
l’istanza interna
dell’Adapter.
4.
Tali metodi dovranno
essere una ridefinizione dei
metodi di Target. Questi
metodi garantiscono
l’adattamento dell’Adaptee
con la nuova interfaccia.
4
Adapter – Istanza 1
Verifica Manuale (1)
• Risultati Pinot
Target
Adapter
Adaptee
CreationTool
TextAreaTool
FloatingTextArea
AbstractTool
Tool
• CreationTool: tool per creare nuove figure;
• TextAreaTool: crea figure che sono aree di testo (eventi
mouse);
•
FloatingTextArea: editor di testo;
5
Adapter – Istanza 1
Verifica Manuale (2)
• Relazioni tra le classi
6
Adapter – Istanza 1
Verifica Manuale (3)
• Analizziamo il codice delle classi:
–
TextAreaTool, estende CreationTool.
CreationTool estende AbstractTool.
AbstractTool implementa l’interfaccia Tool.
–
TextAreaTool, ha un’istanza della classe Adaptee. Quindi
la soluzione adottata per il pattern è l’Object Adapter.
7
Adapter – Istanza 1
Verifica Manuale (4)
• Analizziamo il codice delle classi:
–
TextAreaTool, ha metodi che fanno invocazioni ai metodi
dell’oggetto fTextField;
•
•
•
protected beginEdit: inizia l’editing di una figura di testo; quindi
istanzia fTextField per creare un nuovo editor e richiama i metodi
createOverlay e setBounds di FloatingTextArea.
protected endEdit: termina l’editing di una figura di testo,
mettendo l’oggetto fTextField=null e richiama il metodo
endOverlay.
public mouseDown e public mouseUp: eventi di pressione del
tasto del mouse e rilascio su un area editabile, quindi richiamano
beginEdit.
8
Adapter – Istanza 1
Verifica Manuale (5)
• Analizziamo il codice delle classi:
–
TextAreaTool, ha metodi che fanno invocazioni ai metodi
dell’oggetto fTextField;
•
public deactivate: disattiva il tool TextAreaTool, chiude l’editor
richiamando endEdit.
– I metodi mouseDown, mouseUp e deactivate
sono una ridefinizione dei metodi di CreationTool
che sono anche metodi dell’interfaccia Tool.
• L’istanza analizzata è effettivamente un
design pattern Adapter.
9
Adapter – Istanza 1
Raffinamento (1)
• Risultato BED Graph Visualizer
Istanza Riconosciuta
10
Adapter – Istanza 2
Verifica Manuale (1)
• Risultati Pinot
Target
Adapter
Adaptee
ResourceDisposabilityStrategy
ETSLADisposalStrategy
DisposalThread
• ResourceDisposabilityStrategy : interfaccia che
definisce le strategie di eliminazione delle risorse;
• ETSLADisposalStrategy : implementa una strategia di
rilascio delle risorse;
• DisposalThread: thread per la strategia
ETSLADisposalStrategy, richiamandola periodicamente. Essa
estende la classe Thread ridefinendo il metodo run.
11
Adapter – Istanza 2
Verifica Manuale (2)
• Relazioni tra le classi
12
Adapter – Istanza 2
Verifica Manuale (3)
• Analizziamo il codice delle classi:
–
–
ETSLADisposalStrategy, implementa la classe indicata
come target, ResourceDisposabilityStrategy, la quale è
l’interfaccia richiesta.
ETSLADisposalStrategy, ha un’istanza della classe
Adaptee. Quindi la soluzione adottata per il pattern è
l’Object Adapter.
13
Adapter – Istanza 2
Verifica Manuale (4)
• Analizziamo il codice delle classi:
–
ETSLADisposalStrategy, ha metodi che fanno invocazioni
ai metodi dell’oggetto disposalThread;
• protected initDisposalThread: inizializza il thread se non è stato
già fatto. Questo metodo è chiamato dal costruttore di
ETSLADisposalStrategy, quindi la creazione dell’adapter implica la
creazione di un oggetto della classe adaptee.
• public startDisposing: attiva la strategia di rilascio delle risorse.
Richiama su disposalThread il metodo start.
• public stopDisposing: disattiva la strategia e ferma il rilascio delle
risorse; richiama su disposalThread il metodo join passando un
parametro che rappresenta i millisecondi di attesa prima che il
thread venga ucciso.
14
Adapter – Istanza 2
Verifica Manuale (5)
• Analizziamo il codice delle classi:
–
ETSLADisposalStrategy, ha metodi che fanno invocazioni
ai metodi dell’oggetto disposalThread;
• public setPeriodicity: setta la periodicità con la quale il thread
(DiposalThread) chiamerà la strategia di rilascio delle risorse
(ETSLADisposalStrategy).
– I metodi startDisposing e stopDisposing sono una
ridefinizione dei metodi di
ResourceDisposabilityStrategy
• L’istanza analizzata è effettivamente un
design pattern Adapter.
15
Adapter – Istanza 2
Verifica Manuale (6)
• Note
– Sia l’adapter che l’adaptee sono definiti come classi all’interno di uno
stesso file ETSLADisposalStrategy.java.
16
Adapter – Istanza 2
Raffinamento (1)
• Risultato BED Graph Visualizer
Istanza Riconosciuta
17
Adapter – Istanza 3
Verifica Manuale
• Risultati Pinot
Target
Adapter
Adaptee
AbstractTool
PolygonTool
PolygonFigure
Tool
•
•
•
•
AbstracTool: classe astratta che implementa Tool.
Tool: Interfaccia che definisce operazioni di disegno.
PolygonTool: classe che rappresenta un poligono.
PolygonFigure: estende AbstracTool, disegna poligoni.
18
Adapter – Istanza 3
RELAZIONE TRA LE CLASSI:
19
Adapter – Istanza 3
Analizziamo il codice delle classi
• ADAPTER CLASS:
1. La classe indicata come adapter, PolygonTool estende la classe
astratta indicata come Target, AbstractTool la quale implementa
l’interfaccia Tool.
20
Adapter – Istanza 3
2. PolygonTool contiene l’attributo fPolygon di tipo PolygonFigure (
classe adaptee)
 Object Adapter.
3. I metodi deactivate, mouseDown, mouseMove, sono ridefinizione dei
metodi della Classe Target i quali richiamo i metodi della classe
adaptee (addPoint, smoothPoints, size, setPointAt).
Conclusione: Pattern verificato.
21
Adapter – Istanza 3
• Raffinamento:
Cocnlusione: Istanza riconosciuta.
22
Adapter – Istanza 4
Verifica Manuale
• Risultati Pinot
Target
Adapter
Adaptee
MDI_DrawApplication
JavaDrawApp
Animator
DrawApplication
• MDI_DrawApplication: classe che facilita la
comunicazione tra gli oggetti window.
• DrawApplication: Definisce metodi standard per
disegnare editors ( implementa DrawingEditor).
• JavaDrawApp: Classe che estende MDI_DrawApplication.
• Animator: Implementa un Thread.
23
Adapter – Istanza 4
RELAZIONE TRA LE CLASSI:
24
Adapter – Istanza 4
Analizziamo il codice delle classi
• ADAPTER CLASS:
1. La classe indicata come adapter, JavaDrawApp estende la classe astratta
indicata come Target, MDI_DrawApplication la quale estende la classe
DrawApplication che a sua volta implementa una serie di interfacce.
25
Adapter – Istanza 4
2. JavaDrawApp contiene l’attributo fAnimator di tipo Animator ( classe
adaptee)
 Object Adapter.
3. I metodi: startAnimation e endAnimation richiamano i metodi (start,
end) della classe adaptee attraverso l’oggetto fAnimator .
Conclusione: Pattern verificato.
26
Adapter – Istanza 4
• Raffinamento:
Conclusione: Istanza riconosciuta.
27
Adapter – Istanza 5
Risultati Pinot:
Target
Adapter
Adaptee
DrawApplet
JavaDrawApplet
Animator
• DrawApplet:
creare l’applet di presentazione (menù,
button, font ecc…);
• JavaDrawApplet:
estende DrawApplet e ridefinisce
metodi di DrawApplet e di Animator;
• Animator:
start-stop del thread di creazione e
visualizzazione interfaccia (estende Thread).
28
Adapter – Istanza 5
Verifica Manuale(1)
• Target - DrawApplet
29
Adapter – Istanza 5
Verifica Manuale(2)
• Adapter - JavaDrawApplet
30
Adapter – Istanza 5
Verifica Manuale(3)
• Adapter – JavaDrawApplet
adaptee.SpecificRequest()
31
Adapter – Istanza 5
Verifica Manuale(4)
• Adaptee - Animator
Conclusione:
IDENTIFICATO DESIGN PATTERN ADAPTER
MEDIANTE VERIFICA MANUALE
32
Adapter – Istanza 5
Raffinamento
• Risultato prodotto dal tool:
ADAPTER METHOD NON IDENTIFICATO: istanza non identificata
33
Design Pattern Composite Descrizione
Struttura del Pattern
34
Composite – Istanza 1 e 2
Verifica Manuale (1)
• Risultati Pinot
Component
Composite
Leaf
Istanza Composite
CompositeFigure
PertFigure
/
fPreTasks (istanza 1)
fPostTasks (istanza 2)
35
Composite – Istanza 1 e 2
Verifica Manuale (2)
• Relazioni tra le classi
36
Composite – Istanza 1 e 2
Verifica Manuale (3)
• CompositeFigure è una classe astratta che è
estesa da PertFigure.
• PertFigure ha al suo interno una lista di nome
fPreTasks (fPostTasks): contenitore di
componenti .
37
Composite – Istanza 1 e 2
Verifica Manuale (4)
• PertFigure, ha 4 metodi di gestione degli
oggetti composti: addPreTask/addPostTask e
removePreTask/removePostTask che
lavorano sulle liste fPreTasks e fPostTasks.
38
Composite – Istanza 1 e 2
Verifica Manuale (5)
•
CompositeFigure definisce alcuni metodi che vengono ridefiniti da PertFigure, MA tali metodi
non sono quelli relativi alla gestione degli oggetti composti.
39
Composite – Istanza 1 e 2
Verifica Manuale (6)
• L'istanza analizzata è un composite pattern
non al 100%, la sua implementazione non
riflette la struttura tipica del pattern per i
seguenti motivi:
– non sono state rilevate classi foglia;
– la relazione tra component e composite è ambigua: i metodi di
gestione dell'oggetto composto (addPreTask/addPostTask e
removePreTask/removePostTask) non prendono in input un
component ma il composite stesso ed inoltre tali metodi non hanno lo
stesso naming dei metodi del component, quindi non vengono
ridefiniti e sono quindi diversi dai metodi add e remove di
CompositeFigure.
40
Composite – Istanza 1 e 2
Raffinamento (1)
• Risultato BED Graph Visualizer
Istanze NON Riconosciute
41
Composite – Istanza 3
Verifica Manuale
• Risultati Pinot
Component
Composite
Storable
NodeFigure
Leaf
/
• Storable: Interfaccia candidata come Component Class.
• NodeFigure: classe che estende TextFigure e viene
identificata come la composite class del pattern.
• fConnectors: Lista di oggetti di tipo LocalConnector
presente in NodeFigure.
42
Composite – Istanza 3
RELAZIONE TRA LE CLASSI:
43
Composite – Istanza 3
Analizziamo il codice delle classi
• COMPONENT CLASS:
– Storable, espone due metodi read e write i quali, stando alla
definizione del pattern, dovrebbero essere richiamati per aggiungere,
rimuovere le componenti e quindi avere come parametro la
componente stessa ( requisito non soddisfatto ).
• COMPOSITE CLASS:
– Implementa indirettamente i metodi dell’interfaccia component.
– Presenta una lista (fConnectors), la quale contiene le componenti che
verranno aggiunte:
44
Composite – Istanza 3
- Gli elementi che vengono aggiunti alla lista,
implementano indirettamente l’interfaccia Component.
- I metodi che permettono l’aggiunta o la rimozione di una
componente dovrebbero essere i metodi (read e
write)che espone l’interfaccia component (Storable).
( requisito non soddisfatto ).
Conclusione: Pattern non verificato.
45
Composite – Istanza 3
• Raffinamento:
Conclusione: Istanza non riconosciuta.
46
Composite – Istanza 4
• Risultati Pinot :
Component
Composite
Storable
ContentProducerRegistry
Leaf
-
• Storable: la classe è un’interfaccia
• ContentProducerRegistry: la classe funge da
repository per i ContentProducer in modo gerarchico
per facilitare la ricerca
• fContentProducers: lista che contiene oggetti di
tipo ContentProducer
47
Composite – Istanza 4
• Verifica manuale
• La classe Storable è il Component e contiene i
seguenti metodi i quali devono avere in input
un oggetto di tipo Component
48
Composite – Istanza 4
• La classe ContentProducerRegistry
implementa i metodi read() e write(), ma
come nel component non ricevono in input
degli oggetti di tipo component.
• Come Leaf è stata individuata la classe
Layouter che non implementa i metodi read()
e write()
49
Composite – Istanza 4
Conclusioni : istanza non verificata
L’istanza non può essere considerata un Design Pattern
Composite perché sia il component che il composite nei
metodi read e write non hanno come input un oggetto di tipo
Storable, ma oggetti di tipo diverso.
50
Composite – Istanza 4
• Raffinamento:
Conclusioni: istanza non verificata
51
Design Pattern Visitor - Descrizione
Requisiti:
1.
La classe Visitor specifica le operazioni
di visita del Concrete Element
2.
Il Concrete Visitor implementa le
operazioni di visita
3.
La classe Element dichiara il metodo
accept
4.
La classe Concrete Element
implementa la classe Element
52
Visitor – Istanza 1
• Risultati Pinot
Visitor
Concrete Element
Storable
StorableOutput
Concrete Visitor
-
Element
-
• Storable: la classe è un’interfaccia
• StorableOutput: la classe viene usata per stampare
oggetti di tipo Storable
53
Visitor – Istanza 1
• Validazione Manuale
• Storable: la classe essendo il Visitor deve contenere
il metodo Visit
54
Visitor – Istanza 1
• Validazione Manuale
• Storable: la classe essendo il Visitor deve contenere
il metodo Visit
55
Visitor – Istanza 1
• StorableOutput: la classe deve implementare
l’Accept
56
Visitor – Istanza 1
• Pinot non ha rilevato né l’Element né il
Concrete Visitor, per cui si è dovuto andarli a
trovare nel codice
• Come Concrete Visitor è stata scelta la classe
ContentProducerRegistry, che re-implementa il
metodo write()
• Mentre per l’Element si è scelta la classe Object da
cui deriva StorableOutput
Conclusioni: istanza verificata al 70%
57
Visitor – Istanza 1
• Raffinamento:
Regola di raffinamento
Conclusione: istanza non verificata
58
Design Pattern Template Method Descrizione
Requisiti:
1.
La classe AbstractClass deve contenere
il template Method, il quale deve
invocare al suo interno i metodi primitivi.
2.
La Concrete Class deve implementare i
metodi primitivi dell’Abstract Class
59
Template Method – Istanza 1
• Risultati Pinot
Abstract Class
Concrete Class
ChangeConnectionHandle
ChangeConnectionStartHandle
• ChangeConnectionHandle: la classe viene usata
per cambiare i parametri delle connessioni
• ChangeStartConnectionHandle: la classe viene
usata per far ripartire le connessioni
60
Template Method – Istanza 1
• Validazione Manuale:
L’Abstract Class deve contenere Template e Primitive method
61
Template Method – Istanza 1
• La Concrete Class deve implementare i metodi primitivi:
Conclusione: istanza verificata
62
Template Method – Istanza 1
• Raffinamento:
Regola di raffinamento
Conclusione: istanza verificata
63
Template – Istanza 2
Risultati Pinot:
Template class
Template method
Primitive method
UndoActivity
swapConnectors
replaceConnectors
• UndoActivity: classe astratta che estende UndoableAdapter
(capire se un’attività può essere rifatta oppure no);
• swapConnectors: metodo che si occupa di dichiarare un
oggetto FigureEnumerator e creare le connessioni tra le varie
figure;
• replaceConnectors: metodo astratto di UndoActivity
implementato nella ChangeConnectionEndHendle (concrete
class)
64
Template – Istanza 2
Verifica Manuale(1)
• Template class - UndoActivity
SPECIFICA OPERAZIONI PRIMITIVE ASTRATTE
IMPLEMENTA IL TEMPLATE METHOD (invocazione delle operazioni
primitive dichiarate nell’abstract class)
65
Template – Istanza 2
Verifica Manuale(1)
• Concrete class - UndoActivity
IMPLEMENTA LE OPERAZIONI PRIMITIVE
Conclusione:
IDENTIFICATO DESIGN PATTERN TEMPLATE
METHOD MEDIANTE VERIFICA MANUALE
66
Template – Istanza 2
Raffinamento
• Risultato prodotto dal tool:
Abstract class NON rilevata (è una sottoclasse di
ChangeConnectionHendle): istanza non identificata
67
Scarica

Design Pattern Detection Tool Pinot Verifica