COMET
Detailed Software Design
Detailed Software Design
1) Progettazione di Task compositi
1.1) Task e Classi: mutue relazioni e singole
responsabilità
1.2) Criteri di progettazione per Task e Oggetti
2) Accesso alle classi
2.1) Tecniche di sincronizzazione
Detailed Software Design
3) Comunicazioni Inter-Task
3.1) Connettori per la comunicazione
3.2) Task cooperanti con connettori
4) Sequenzialità logica degli eventi
4.1) Esempio
Detailed Software Design
Dove si colloca in COMET ?
 Nella fase di Design Modeling
Quali sono gli obiettivi ?
 Definire le componenti interne dei Task
 Definire il comportamento dei Task
 Come comunicano
 Come si comportano rispetto agli eventi
1) Progettazione di Task
compositi
Definizione:
Un Task Composito è un Task che
incapsula gli oggetti annidati che contiene
Tutte le funzionalità del Task sono fornite
dagli oggetti che contiene
Ogni Task composito ha un
oggetto coordinatore
1.1) Relazioni e Responsabiltà
RELAZIONI
L’Oggetto Attivo (Task) è attivato da un evento;
poi invoca un’operazione fornita da un Oggetto
Passivo
 Classi annidate
 Classi esterne
 Modularità e Riuso separando i concetti
di COME e QUANDO
1.1) Relazioni e Responsabiltà
RESPONSABILITÀ
Task: Controllo, sequenzialità e comunicazione
Classi: Dettagli strutturali
La divisione delle responsabilità è un esempio di
separazione dei compiti (concerns)
1.1) Relazioni e Responsabiltà
Esempio
Un Task di interfaccia di dispositivo di I/O
contiene un oggetto interfaccia di dispositivo
L’oggetto incoropora i dettagli di come leggere
o scrivere sul dipositivo (reale)
Il Task affronta il problema di quando e come
il dispositivo è attivato e gestisce le
comunicazioni con gli altri oggetti (attivi o
passivi)
1.2) Criteri di progettazione
 Temporal clustering
 Task attivati nello stesso momento
evento temporale)
(stesso
 Control clustering
 Task attivati dallo stesso evento (asincrono)
1.2) Criteri di progettazione
Esempio di Temporal Clustering
«external input
device» : Engine
«external input
device» : Brake
Engine
Input
Brake
Input
«Input device
Interface» :
EngineInterface
Engine On,
Engine Off
Brake Pressed,
Brake Released
«Input device
Interface» :
BrakeInterface
1.2) Criteri di progettazione
Esempio di Temporal Clustering (continua)
«external timer»
: DigitalClock
timer
Event
«passive input
device» : Engine
read (out
engineInput)
«Input device Interface»
: AutoSensors
«passive input
device» : Brake
read (out
brakeInput)
engineOn,
engineOff,
Brake Pressed,
Brake Released
1.2) Criteri di progettazione
Esempio di Control Clustering
«output device
interface»
:Receipt
PrinterInterface
5: Print
Receipt
6: Printer
Output
1: Withdrawal OK
7: Receipt Printed
«state dependent control»
:ATMControl
8: Eject
2: Dispense Cash
4: Cash
Dispensed
«output device
interface»
:Cash
DispenserInterface
3: Dispenser
Output
1.2) Criteri di progettazione
Esempio di Control Clustering (continua)
1: ATMControl
Request
8: Eject
6: printedOutput
«control clustering»
:ATM Controller
3: DispenserOutput
2) Accesso alle Classi
 Quanti Task accedono ad una classe ?
 Quali sono le strutture dati accedute ?
 Quali operazioni utilizza un Task ?
Nel caso di più Task si deve:
 Sincronizzare l’accesso ai dati
 Stabilire il tipo di sincronizzazione
 Adottare un algoritmo di sincronizzazione
2.1) Tecniche di Sincronizzazione
Scelte Possibili
 Mutua Esclusione
 Lettori e Scrittori Multipli
 Con Monitor
 Senza “Writer Starvation”
Esempi
3) Comunicazioni
Inter-Task
Si possono avere
 Servizi forniti dal Kernel sottostante
 Meccanismi offerti dal Linguaggio di
programmazione utilizzato
Tipi di comunicazione
 Messaggi accoppiati debolmente
 Messaggi accoppiati fortemente
 Con risposta
 Senza risposta
3.1) Connettori
 Le classi connettori incapsulano i dettagli
della comunicazione inter-Task
 Ogni connettore è progettato come monitor
 Utilizzo di Condizioni di Sincronizzazione
3.2) Task cooperanti
Esempio 1
Coda di messaggi per messaggi accoppiati
debolmente
aProducerTask
aConsumerTask
Send
(in message)
Receive
(out message)
«connector»
aMessageQueue
Vedi
Pseudocodice
3.2) Task cooperanti
Esempio 2
Buffer di messaggi per messaggi accoppiati
fortemente senza risposta
aProducerTask
aConsumerTask
Send
(in message)
Receive
(out message)
«connector»
aTightlyCoupled
MessageBuffer
Vedi
Pseudocodice
3.2) Task cooperanti
Esempio 3
Buffer di messaggi per messaggi accoppiati
fortemente con risposta
aProducerTask
aConsumerTask
Send
(in message)
Receive
(out message)
«connector»
aMessage
Buffer&Response
Vedi
Pseudocodice
3.2) Task cooperanti
Esempio 4
Gruppi di Task cooperanti comunicanti attraverso
oggetti connettori
Gli oggetti connettori incapsulano i meccanismi
per una comunicazione sincrona
3.2) Task cooperanti
Esempio 4 (continua)
«asynchronous I/O
device interface»
:CardReader
Interface
«user interface»
:Operator
Interface
receive (out
cardreaderMsg)
send (in
ATMControl
Request)
send (in
ATMControlRequest)
«connector»
CardReader
MessageBuffer
Send (in
ATMTransaction, out
bankResponse)
«connector»
ATMControl
MessageQ
send (in
ATMControl
Request)
«user interface»
:Customer
Interface
receive (out
displayPrompt)
send (in
cardreader Msg)
«connector»
:bankServer Proxy
«connector»
promptMessage
Queue
receive (out
ATMControl
Request)
«control clustering»
:ATMController
send (in
displayPrompt)
4) Sequenzialità logica
degli eventi
Si descrivono
 Le risposte di un Task a messaggi o eventi
 L’output per ogni input
Nei Task compositi l’oggetto coordinatore riceve
i messaggi in input e invoca le operazioni degli altri
oggetti annidati
4) Sequenzialità logica
degli eventi
4.1) Esempio
Descrizione dell’operazione send
loop
Prepare message containing message name (type) and
optional message parameters;
send(message) to receiver;
endloop;
Scarica

murzi