|
Vero progresso quando i vantaggi di una nuova tecnologia diventano per tutti
|
|
|
|
|
GRASP : Pattern Low Coupling
By
Luana Rinaldi
7 aprile 2008
|
 |
|
L'accoppiamento (coupling) è la misura di quanto fortemente un elemento è connesso, conosce e/o dipende da altri elementi: nella progettazione di un sistema di classi, l’accoppiamento si traduce nel numero di relazioni tra di esse. La presenza massiccia di queste relazioni tra classi può ovviamente presentare numerosi problemi in termini di estensibilità, manutenzione e flessibilità. Infatti, il forte accoppiamento tra classi presenta diversi problemi nel caso in cui una delle classi coinvolte dovesse subire delle modifiche di progettazione. I problemi più comuni sono i seguenti:
- Un cambiamento nella classe principale, genera necessariamente cambiamenti nelle classi correlate;
- Risulta molto difficile isolare e riusare le classi connesse;
Esistono diverse forme in cui può manifestarsi l’accoppiamento tra classi. E’ importante sottolineare però che queste condizioni, se verificate, non costituiscono in assoluto un errore di progettazione, ma sono parte della normale implementazione di un sistema; d’altro canto, l’uso eccessivo di questo tipo di correlazioni genera invece il problema affrontato in questo articolo.
Le forme comuni di accoppiamento tra due oggetti A e B:
- La classe A ha un membro di tipo B o referenzia una istanza di B;
- A richiama e usa i servizi di B;
- A ha un metodo che possiede un elemento di tipo B, o che referenzia una istanza di B;
- A è una classe derivata direttamente o indirettamente dalla classe base B;
- A implementa un’interfaccia di tipo B;
Dai punti elencati si evidenzia il fatto che l’accoppiamento si manifesta in diverse situazioni facenti parte della normale progettazione del software, ma l’abuso di esse comporta diversi problemi, analizzati in seguito.
Passiamo ora alla definizione formale del Pattern Low Coupling: Nome: Low Coupling Problema: Come ridurre l’impatto ai cambiamenti? Soluzione: Assegnazione delle responsabilità in modo tale che l’accoppiamento non necessario rimanga basso. Affrontiamo più nel dettaglio la specifica del pattern.
|
|
|
Problema: Come ridurre l’impatto ai cambiamenti?
|
top
|
|
Come già detto, l’obiettivo di questo pattern è la progettazione delle dipendenze tra le varie classi in modo da minimizzare gli impatti alla variazione di una di esse: questo obiettivo può essere raggiunto tramite la riduzione dell’accoppiamento tra classi. In realtà, è necessario effettuare una precisazione a questo principio: Low Coupling sostiene che sarebbe da evitare l’accoppiamento con classi ( metodi o oggetti) definiti ‘instabili’ , ossia classi la cui implementazione può variare con una certa frequenza, e quindi rendere instabile l’intero codice.
|
|
Soluzione
|
top
|
|
Low Coupling riflette un obiettivo che viene spesso considerato dai designer come un parametro fondamentale di valutazione della qualità di progettazione del software: esso infatti incoraggia a scegliere una distribuzione di responsabilità che non faccia crescere il grado di accoppiamento nell’applicazione, in funzione dell’indipendenza e del riuso. E’ da sottolineare che questo principio, comunque, non risulta essenziale se non si ha come obiettivo il riuso, anche se un forte disaccoppiamento fra classi comporta sicuramente dei deficit in termini di complessità del design e di efficienza del codice. Si potrebbe infatti pensare alla situazione limite, in cui non esiste alcun accoppiamento fra classi: in teoria, questo potrebbe essere una condizione ottima per l’applicazione di questo principio, ma, d’altro canto, risulta irrealizzabile, e indesiderabile, in quanto non sussisterebbe la collaborazione tra gli oggetti, quindi ognuno di essi svolgerà il proprio compito in maniera del tutto isolata dal resto.
|
|
Conseguenze
|
top
|
|
Una considerazione molto importante da sottolineare è la correlazione esistente tra il pattern Information Expert e il patter Low Coupling. Information Expert, infatti, guida verso una scelta che sostiene Low Coupling, chiedendo di trovare l’oggetto che possiede la maggior parte delle informazioni richieste per la responsabilità in oggetto d’esame, e di assegnare quindi a quest’ultimo la responsabilità d svolgere quel determinato compito. Infatti, se si delega altrove questo compito, si aumenta l’accoppiamento complessivo, in quanto saranno presenti più oggetti o informazioni che devono essere condividi lontano dalla loro sorgente originale.
|
|
Esempio
|
top
|
|
Supponiamo di dover implementare un client ftp. Una sbagliata progettazione sarebbe quella di includere la logica per la gestione delle connessioni client ftp all’interno dello strato che modella l’interfaccia utente. Questa situazione, infatti, comporterebbe numerosi problemi nel caso in cui si abbia la necessità di variare l’implementazione dell’interfaccia stessa, ad esempio fornire un’interfaccia testuale. Low Coupling, insieme al pattern MVC ( Model-View-Controller) suggerisce invece di separare la logica di business dall’interfaccia grafica, quindi, di conseguenza, ridurre l’accoppiamento tra questi due strati, in modo da limitare al minimo gli interventi in caso di sostituzione, parziale o totale, di uno di essi. L’applicazione di Low Copuling in questo genere di situazioni è anche supportata dal fatto che l’interfaccia grafica, come anche gli strati di persistenza, viene generalmente considerata come una componente instabile del sistema, che può subire spesso variazioni.
|
|
Pattern Correlati
|
top
|
Patern High Coesion (GRASP) Pattern Protected Variations (GRASP) Pattern Adapter (GOF) Pattern Command (GOF) Pattern Strategy (GOF)
|
|
Conclusioni
|
top
|
|
Come abbiamo visto, Low Copuling non è un vero e proprio pattern, ma piuttosto un principio da applicare per una corretta progettazione, soprattutto in casi in cui il riuso rappresenta una caratteristica importante per il sistema che si sta implementando. Nel prossimo articolo analizzeremo un altro principio strettamente correlato a questo: High Coesion.
|
|
Bibliografia
|
top
|
[1] LowCouplingPattern di Ugo Landini
[2] Applying GRASP to Object Design - Creator GRASP Pattern - Who is responsible for creating a class? - Applying UML and Patterns
[3] Gamma, Erich. “Object Oriented Software Development based on ET++: Design Patterns, Classe Library, Tools.” Tesi di Dottorato, University of Zurich, Institut Fur Informatik, 1991.
[4] Gamma, Helm, Johnson, Vlissides. “Design Patterns: Elements of Reusable Object-Oriented Software”, Pearson Education Inc., 1995.
[5] Larman, Craig. “Applying UML and Patterns :An Introduction to Object-Oriented Analysis and Design and the Unified Process”, Pearson Education Inc., 2005.
[6] Object Management Group, 2003. UML 2.0 Superstructure Specification. www.uml.org.
|
|
|
| |
| JavaPortal è ideato da: |
 |

Eccetto dove diversamente specificato, i contenuti di questo sito sono rilasciati sotto licenza Creative Commons
|
|
|