Quando utilizzare l'incapsulamento

Se volessimo essere brevi, la risposta alla domanda deltitolo di quest’unità didattica, dovrebbe essere"sempre". Una qualsiasi classe di una qualsiasiapplicazione dovrebbe essere sviluppata utilizzandol’incapsulamento. Anche se all’inizio di unprogetto software può sembrarci che su determinateclassi usufruire dell’incapsulamento sia superfluo,l’esperienza c’insegna che è preferibilel’applicazione in ogni situazione. Facciamo un esempiobanale. Abbiamo già accennato al fatto, peraltroscontato, che per realizzare un’applicazione aqualsiasi livello (sempre che non sia veramente banale),bisogna apportare a questa, modifiche incrementali. Unlettore con un minimo d’esperienza di programmazionenon potrà che confermare l’ultima affermazione.

Supponiamo di voler scrivere una semplice applicazione cheassegnati due punti, disegni il segmento che li unisce.Supponiamo inoltre che questa utilizzi la seguente classe nonincapsulata Punto, già incontrata nel modulo 2:

 

class Punto{  public int x, y;  . . .}

 

l’applicazione, in un primo momento, istanzieràed inizializzerà due punti con il seguente frammentodi codice:

2)

 

. . . Punto p1=new Punto(); Punto p2=new Punto(); p1.x=5; p1.y=6; p2.x=10; p2.y=20; . . .

 

 

Supponiamo che l’evolversi della nostra applicazionerenda necessario che i due punti non debbano trovarsi al difuori di un certo area piana ben delimitata. Ecco risultareevidente che la soluzione migliore sia quella di implementarel’incapsulamento all’interno della classe Puntoin questo modo;

 

class Punto{  private int x, y;  private final int valoreMassimoPerX=10 ;  private final int valoreMinimoPerX=10 ;  private final int valoreMassimoPerY=10 ;  private final int valoreMinimoPerY=10 ;  public void setX(int a)    {if (a <= valoreMassimoPerX &&    a >= valoreMinimoPerX)  {    x=a;    System.out.println("X è OK!");  }else  {    System.out.println("X non valida");  }}   public void setY(int a){if (a <= valoreMassimoPerY &&    a >= valoreMinimoPerY)     {    y=a;    System.out.println("Y è OK!");     }else     {    System.out.println("Y non valida");     }   }  . . .   }

 

Purtroppo però, dopo aver apportato queste modifichealla classe Punto, saremo costretti a modificare anche ilframmento di codice 2) dell’applicazione nel modoseguente:

3)

 

Punto p1=new Punto(); Punto p2=new Punto(); p1.setX(5); p1.setY(6); p2.setX(10); p2.setY(20); . . .

 

Saremmo partiti meglio con la classe Punto forzatamenteincapsulata in questo modo:

 

class Punto   {  private int x, y;  public void setX(int a) {x=a; }  public void setY(int a) {y=a; }  . . .  }

 

dal momento che avremmo modificato solo il codiceall’interno dei metodi di accesso, e saremmo staticostretti al codice 3) all’internodell’applicazione che utilizza Punto.

Arriviamo alla conclusione che l’incapsulamentoè prassi ed obbligo in Java. Un linguaggio orientatoagli oggetti "puro" , infatti, non permetterebbe ladichiarazione di attributi pubblici. Java però, vuoleessere un linguaggio semplice da apprendere, ed in questomodo, non costringe l’aspirante programmatore adimparare prematuramente, un concetto ad ogni modo complessoquale l’incapsulamento. In particolare, nei primitempi, non se ne apprezzerebbe completamentel’utilizzo, dovendo comunque approcciare con troppiconcetti nuovi contemporaneamente.

Tuttavia, non bisognerebbe mai permettere di sacrificarel’incapsulamento per risparmiare qualche secondo diprogrammazione, le conseguenze sono ormai note al lettore.