Java: Coupling e Cohesion nella programmazione OOP

Studiando Sonar sono incappato in questo interessante articolo che parla di due concetti fondamentali per la programmazione ad oggetti, da tenere sempre a mente quando si lavora in Java:

  • Coupling
  • Cohesion

Il coupling è il legame che ogni classe ha con le altre. L’obiettivo è fare in modo che sia più “loose” possibile. Quando si scrive un software utilizzando la progammazione OOP occorre avere come obiettivo un “Loose Coupling”, che in buona sostanza significa che le nostre classi devo essere il più possibile svincolate le une dalle altre. Così otteniamo una buona modularità del nostro progetto.
Concettualmente è semplice da capire: se la classe A dipende, nel suo funzionamento da come è sviluppata la classe B, sentirà fortemente anche tutte le modifiche che verranno fatte su di essa. Quindi una modifica alla classe B porterà a dover modificare il codice anche della A.
Anche se è semplice da capire non è sempre immediato capire come ovviare a queste problematiche.

Il concetto di coesione si applica invece ai metodi di una classe. Per capire meglio cosa significa partiamo da uno dei concetti basilari della programmazione ad oggetti: il Single Responsibility Principle (http://en.wikipedia.org/wiki/Single_responsibility_principle), ovvero il principio che afferma che una classe ha un compito, ed uno solo, ed al suo interno dovrebbe svolgerlo in maniera esaustiva.
Questo è un aspetto che, per esperienza, non sempre viene preso in considerazione. Quando una classe ha metodi che non condividono proprietà e altri metodi, probabilmente può essere divisa in più classi, in una organizzazione più logica.

Quindi riassumendo come riassume l’articolo originale, le classi devono essere il più autonome possibile (low coupling), mentre il contrario i metodi al loro interno devono essere il più coesi possibile (high cohesion).

Ovviamente Sonar, così come altri programmi di check possono fornire anche falsi positivi, per cui il buon senso deve sempre prevalere.

Leave a Reply

Your email address will not be published.

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>