pip2.gif (2876 bytes)

Programmazione orientata a oggetti:

Nella programmazione classica (detta certe volte "top-down") il programmatore tende a semplificare sempre di più, mediante sottoprogrammi (subroutine), il problema che deve risolvere "tagliandolo a pezzettini" (da cui la tipica istruzione if a, goto x; else goto y). La oop ("object oriented programation") tende invece a creare oggetti con attributi e comportamenti che interagiscono tra di loro. Quali sono i vantaggi? essenzialmente:

  1. è un procedimento che si avvicina di più al mondo reale
  2. è più facile riutilizzare codice già scritto.

Infatti:

1.    Un oggetto è costituito da vari altri oggetti: un essere umano è costituito da due gambe, due braccia, un corpo e una testa; a sua volta la testa ha due occhi, un naso, una bocca e due orecchie. Ogni gamba termina con un piede, ogni braccia con una mano. Adesso ognuno di questi oggetti ha i suoi propri attributi: gli occhi hanno un colore (che può essere marrone, blu, verde, ecc...); le gambe possono essere lunghe o corte, ecc... e ogni oggetto ha i suoi comportamenti (le gambe possono piegarsi, gli occhi possono chiudersi, l'essere umano parla, ecc...). Gli oggetti appartengono a delle classi (la classe degli esseri umani, dei cani, ecc...), un oggetto particolare (il Sig. Rossi) è un'istanza di una classe, che possiede tutti gli attributi e comportamenti di ogni oggetto in quella classe (il Sig. Rossi ha due gambe, due braccia, ...). Gli oggetti interagiscono tra di loro (il Sig. Rossi parla col Sig. Bianchi). Spesso quando osserviamo il mondo che ci circonda facciamo (anche incosciamente) un'analisi di questo tipo: classifichiamo le cose in categorie che poi, eventualmente, sono collegate (interagiscono). In un certo senso è un approccio più naturale di quello "analitico" del tipo: ho queste costanti A, B, ....., queste variabili x, y, z, .....; se A > B allora x = 2, nel caso contrario x = 1, ecc...

2.    Nella programmazione classica, il programmatore dopo avere analizzato il suo problema, lo riduce in tanti piccoli problemi che sa risolvere (con piccoli sottoprogrammi) e poi mette tutto insieme: spesso vengono fuori centinaie di righe di codice. Poi si presenta un altro problema, molto simile al precedente, ma non veramente uguale: "l'idea" è la stessa, ma bisogna modificare i sottoprogrammi, le loro connessioni, presto le modifiche diventono così complesse che bisogna riscrivere tutto. Nella oop è più facile riutillizare codice già scritto perchè può bastare modificare un attributo o un comportamento di un oggetto (se prima avevo il Sig. Rossi con le gambe lunghe e gli occhi blu e adesso mi serve il Sig. Bianchi con le gambe corte e gli occhi verdi, non devo riscrivere tutto il codice del Sig. Rossi con le opportune modifiche, mi basta prendere un oggetto "essere umano", e attribuirli il nome di Sig. Bianchi, gambe corte e occhi verdi). In oop questo riutilizzo del codice già scritto è facilitato dal processo di ereditarietà: si può creare una nuova classe specificando solo le sue differenze con una classe già esistente. L'istruzione extends:    class B extends A, significa che la classe B eredità di tutti gli attributi e comportamenti della classe A.

In Java non si fa altro che usare classi già esistenti (una buona conoscenza della documentazione ("librerie") aiuta molto).

La oop sembra più vantaggiosa ma c'è un prezzo da pagare: una maggior astrazione (non dovrebbe essere un problema per chi ha studiato matematica ...)

Un semplice esempio pratico.

Adesso creeremo due classi: quella dei lords inglesi e quella dei popsingers americani. Ogni oggetto dovrà:

-avere un nome e essere capace di memorizzarlo

-ogni oggetto dovrà russare quando dorme

-ogni oggetto dovrà parlare.

I lords e i popsingers si ricordano del loro nome e russano allo stesso modo, ma parlano in modo diverso (si, si!!). Realizzeremo questo piccolo progetto come applicazione java (non come applet).

public class Uomo {
String nome;

public void dorme() {
System.out.println("ZZZZ ZZZZZZ ZZZZ");
}
}

Questo crea la classe Uomo; è una classe pubblica (cioè accessibile anche da altre classi); c'è una stringa nome (nella quale immeteremo il nome; per il momento, diciamo che una stringa è una sequenza di caratteri) e poi c'è un metodo dorme() (o comportamento o funzione) che è pubblico e vuoto (cioè non restituisce dati). Finalmente System.out.println è l'istruzione che permette di stampare sul video.

public class Lord extends Uomo {
public void parla() {
System.out.println("Good morning sir");
}
}

Si definisce la classe Lord che eredita gli attributi (nome) e i comportamenti (dorme) della classe Uomo (public class Lord extends Uomo) inoltre si aggiunge un comportamento specifico di Lord (il metodo parla()).

In modo analogo:

public class PopSinger extends Uomo {
public void parla() {
System.out.println("Hey man!");
}
}

Salvare questi tre files con l'estension .java (Uomo.java, Lord.java, PopSinger.java) e compilarli per creare i files Uomo.class, Lord.class, PopSinger.class nella cartella Java (dentro c:/)

ATTENZIONE: è importantissimo salvare i files con i nomi delle relative classi.

class Azione {
public static void main(String[] arguments) {
Lord john = new Lord();
PopSinger johnny = new PopSinger();
john.nome = "Sir John";
johnny.nome = "Johnny";
System.out.println("Facciamo parlare il Lord :");
john.parla();
System.out.println("Come si chiama?");
System.out.println(john.nome);
System.out.println("Adesso facciamo parlare il cantante pop :");
johnny.parla();
System.out.println("Come si chiama?");
System.out.println(johnny.nome);
System.out.println("I nostri eroi hanno sonno :");
john.dorme();
johnny.dorme();
  }
}

Salvare questo file (nella cartella Java in c:/) come Azione.java poi compilarlo per ottenere Azione.class finalmente, per eseguire,  il programma sulla linea di commando del Dos, al prompt c:\java>, digitare c:\jdk1.2\bin\java Azione

L'outpout sullo schermo dovrebbe essere:

Facciamo parlare il Lord:

Good morning sir

Come si chiama?

Sir John

Adesso facciamo parlare il cantante pop:

Hey man!

Come si chiama?

Johnny

I nostri eroi hanno sonno:

ZZZZ ZZZZZZ ZZZZ

ZZZZ ZZZZZZ ZZZZ

Le classi Lord e PopSinger non hanno nessun metodo dorme ma ognuna l'ha ereditato dalla classe Uomo, questo spiega che ci siano due righe "di sonno".

avanti02.gif (9574 bytes)fleche_retour.gif (1377 bytes)