Il modello a sicronizzazione è più semplice da disegnare, è sufficente individuare la terna produttore, consumatore e risorsa e renderla evidente nel disegno.
La terna Produttore, consumatore e buffer
Il produtore e il consumatore possono ad esempio venire marcati con una interfaccia (es. IProducer e IConsumer) lo stesso vale per la risorsa che concettualmente si presta bene a essere considerata un buffer (es IBuffer).
Il buffer segue comunemente il pattern del buffer circolare: http://c2.com/cgi/wiki?CircularBuffer mentre la sincronizzazione tra produttore e consumatore può avvenire secondo il disegno per pattern Observer o detto anche Publisher-Subscribers : http://wiki.ugidotnet.org/default.aspx/UGIdotNETWiki/PatternObserver.html
Anche quando il buffer non c'è perché l'elemento di sincronizzazione è un evento, chiarisce molto avere comunque una classe che rappresenta questo evento al posto di quella che rappresenta il buffer.
Deadlock
Quando ci sono più terne produttore/consumatore/risorsa è utile evidenziare le istanza che hanno il ruolo di consumatore per un buffer e allo stesso tempo di produttore per un altro, tracciare il grafo e verificare se si creano dei circuiti chiusi perché sono indice di potenziali dead-lock.
Produttore e/o consumatore multipli
E' comune che per uno stesso buffer ci siano 2 o più consumatori e può accadere che ci siano 2 e più produttori. Anche questo va evidenziato nel disegno con interfacce e naming di classe.
Send e Receive bloccanti o no
Infine nei metodi di send e recive è utile usare una naming che evivenzi quando il metodo è bloccante (es. il send resta in attesa che l'altro faccia il receive) e quando no.
Tags : Progettazione Software |