Composite



Scaricare 0.68 Mb.
Pagina4/7
03.04.2019
Dimensione del file0.68 Mb.
1   2   3   4   5   6   7

3. Template Method

Esistono algoritmi che, pur svolgendo funzioni diverse, hanno la stessa struttura.





Figura 19 - diag19.wmf


Il pattern Template Method definisce lo scheletro per un algoritmo composto da più passi e rimanda la specificazione dei passi alle sottoclassi.

Il Template Method è un pattern di tipo comportamentale (behavioral pattern).


Esempio:
Consideriamo il menu File di una qualsiasi finestra di Windows:

Figura 20 - diag20.gif


Indipendentemente dall’applicazione che usa la finestra, ci aspettiamo che:

  • cliccando su Apri compaia una finestra di dialogo che permetta di selezionare il file da aprire;

  • cliccando su Salva con nome appaia una finestra per poter scegliere il nome del file da salvare;

eccetera.
Per esempio l’algoritmo che viene comunque eseguito quando si clicca sulla Apri di qualsiasi menu File di qualunque finestra di Windows, indipendentemente dall’applicazione, è il seguente:

Figura 21 - diag21.wmf


Ciò che cambia in modo dipendente dall’applicazione è la natura delle operazioni da fare, cioè la specificazione dei passi dell’algoritmo. Per esempio i passi necessari per aprire un’immagine non sono gli stessi che occorrono per aprire un file di testo.
Una possibile struttura è la seguente:

Figura 22 - diag22.gif


in cui:
- OpenDoc() è il Template Method, cioè l’algoritmo ( sequenza di passi ), implementato nella

classe parent, che richiama le altre operazioni ( dette hook functions ) implementate nelle

sottoclassi;
- CheckDoc(), AllocDoc(), ReadDoc() sono le hook functions, cioè ganci astratti (quindi non

implementati nella classe parent) specificati nelle sottoclassi.


Il tipo di eredità utilizzato è quella per specificazione (specializzazione), nel senso che la classe parent viene specializzata dalle sottoclassi senza aggiunta di nuove primitive.

Con questa organizzazione l’inserimento di nuovi tipi di gestori di documenti (DocManager) non comporta la riprogettazione del modello in quanto è sufficiente aggiungere una sottoclasse che specifichi gli step dipendenti dall’applicazione che viene aggiunta.


In fase di progetto esistono due possibili alternative:


  1. delegare totalmente alle sottoclassi l’implementazione dei passi dell’algoritmo di Template (come nell’esempio visto);

  2. implementare nella classe parent un insieme minimo di funzionalità (di default).

Nel primo caso la classe parent è astratta e diventa obbligatorio specificare i passi dell’algoritmo nelle sottoclassi.

Nel secondo caso viene prevista un’implementazione di default dei passi dell’algoritmo in modo tale da rendere il programma funzionante anche in corrispondenza di una situazione non prevista a priori.
Abbiamo quindi due possibili modelli di Template Method:

1.

Figura 23 - diag23.gif

2.

Figura 24 - diag24.gif
Un esempio di minimal behaviour per DocManager potrebbe essere:
{ if File exists

if File_Size too large



if File_Type mismatches



}
La struttura generica del pattern Template Method a cui facciamo riferimento è la seguente:

Figura 25 - diag25.gif


NB: L’uso del pattern Template Method ha senso quando l’algoritmo generale è più oneroso di quanto non lo siano le specializzazioni dei suoi passi.
Esercizio:
A)

 Si deve modellare un sistema automatico per lo studio di funzioni del tipo


f ( x ) : R  R
[ in stile analisi ].
 Le f ( x ) sono appartenenti a tipologie note a priori e parametrizzate da parametri in R .
 Per ogni f ( x ) deve essere effettuato uno studio comprendente
- dominio

- codominio

- discontinuità (tipo ed eventuale eliminazione)

- equazioni degli asintoti

- minimi e massimi (assoluti e relativi)

ecc.  ecc. 


B)

 Date f ( x ) e g ( x ) qualsiasi, il software deve poter studiare f [ g(x) ] come detto sopra.


Nota : Concentrarsi sugli aspetti di design del problema, non interessarsi degli aspetti di

programmazione ( o di analisi matematica ).


C)

 Estendere il modello al caso f ( x ) : Rn  R .


Soluzione:
Le funzioni che prendiamo in considerazione sono ad esempio:

a x 2 + b x + c a = 0 d = 1 x

g ( x ) =  b = 1 e = 0  g ( x ) =

d x 2 + e x + f c = 0 f = 3 x 2 + 3

h ( x ) = a ln ( bx )  a = 1 b = 2  h ( x ) = ln ( 2x )

Lo studio di una funzione è un problema ampiamente trattato e codificato. Possiamo quindi supporre di avere a disposizione un modulo software che, data una funzione, ne estragga le informazioni richieste dal testo (dominio, codominio, ecc. ) restituendole al chiamante.

Supponiamo inoltre che siano noti e già gestiti:

- parametri

- funzioni

- unione di intervalli.


Il diagramma a istanze diventa molto semplice:


Figura 26 - diag26.wmf


Il solo modulo da analizzare è Analisi I .

Esistono due soluzioni possibili, a seconda del tipo di approccio considerato.


Approccio simbolico

Si basa sulla considerazione del fatto che l’esistenza di una frazione, di una radice quadrata, di un logaritmo o altro, nella funzione, non è nota a priori. Quindi, sebbene l’algoritmo usato per studiare una funzione sia lo stesso per tutti i tipi di funzione (cioè i passi sono: determinazione del dominio; determinazione del codominio; studio delle discontinuità; eccetera), la specificazione dei singoli passi dipende dalla funzione. Per esempio per determinare il dominio di una frazione bisogna considerare gli zeri del denominatore; per determinare il dominio di una funzione contenente una radice quadrata bisogna imporre che l’argomento sia maggiore o uguale a zero; per determinare il dominio di una funzione logaritmica bisogna imporre che l’argomento sia strettamente maggiore di zero; e così via.

Nella classe parent, quindi, ci sarà un’operazione Dominio() che restituisce il dominio della funzione (posto per default uguale ad R ) .

Figura 27 - diag27.gif


Con questo approccio a livello delle sottoclassi non è necessario introdurre il valore della funzione perché l’approccio è simbolico.

D’altra parte una soluzione come questa non è in grado di trattare le funzioni composte così come è richiesto al punto B) del testo dell’esercizio.


Approccio numerico

Con questo approccio la struttura della soluzione sarà simile alla precedente, con alcune modifiche:



Figura 28 - diag28.gif


In questo caso sarà necessario introdurre il valore della funzione func ( x , P ) in cui x è la variabile e P è un vettore di parametri.

Per esempio Effe potrebbe essere una f ( x ) = a + b x + c x 2 ; Gi potrebbe essere una g ( x ) logaritmica ; Acca potrebbe essere una funzione h ( x ) con una radice quadrata ; eccetera.


Con questo approccio vanno gestite a livello di linguaggio le eccezioni come, ad esempio, l’overflow.




Condividi con i tuoi amici:
1   2   3   4   5   6   7


©astratto.info 2017
invia messaggio

    Pagina principale