Per parlare di programmazione ad oggetti, ci vorrebbe una serie di articoli dedicati: tratteremo meglio questi argomenti in futuro (speriamo non molto lontano).

Principalmente scrivo questo articolo pensando a chi ha intenzione di seguire la guida su Java, i concetti sono gli stessi in tutti i linguaggi essendo questo un paradigma di programmazione, se qualcosa non è chiara potete tranquillamente chiedermi dei chiarimenti con i commenti. In ogni caso, come già detto, questo è un “overview” giusto per sapere in cosa ci andiamo ad infilare, e come funziona questo bellissimo metodo di programmare.

Introduzione

La programmazione ad oggetti, è una evoluzione di quella procedurale: prima i programmi erano semplicemente una lunga lista di comandi che il sistema eseguiva uno dopo l’altro. A volte venivano racchiusi in blocchi di codice, ma spesso con il crescere di dimensioni del programma, a causa della capacità di ogni programma di modificare le variabili globali (variabili accessibili da ogni parte del programma) spesso si incappava in numerosi bugs (errori).

Con la programmazione orientata agli oggetti invece, le cose funzionano diversamente: possiamo accedere ai dati gestiti dalle varie parti del software semplicemente invocando un metodo (simili a funzioni) che farà riferimento solo ai dati che gli diamo.

In programmazione, l’ unità in cui i dati sono associati a dei metodi che li gestiscono, viene chiamata Oggetto.

Un Oggetto è l’ istanza di una classe, e da quì in poi prenderemo come esempio l’oggetto di tipo Macchina.

Le classi

Le classi sono blocchi di codice definiti dal programmatore che descrivono un particolare tipo di oggetto.
Ogni classe è dotata di:

[fancy_list style=”arrow_list”]

  • Attributi: le caratteristiche dell’oggetto (Es: modello della macchina, targa, cilindrata, numero di porte)
  • Metodo: quello che l’oggetto può fare (Es: Muoversi in avanti, retromarcia, cambio, abbassare i finestrini, alzare i finestrini)

[/fancy_list]

Un oggetto, come detto poco fà, è un’ istanza di una classe: ovvero è un prototipo di quella classe (quindi un modello specifico di macchina).

Un programma può usare più istanze di una classe (esempio: una gara di macchine, dobbiamo quindi avere più oggetti Macchina).

Quindi:

[fancy_table]

Classe Macchina Oggetto Ferrari
Attributi:
[fancy_list style=”bullet_list”]

  • Stringa modello;
  • Stringa targa;
  • intero cilindra;
  • intero nPorte;

[/fancy_list]

Attributi:

    [fancy_list style=”bullet_list”]

  • modello = “250 GTO”
  • targa = “FR234DY”
  • cilindrata = 250
  • nPorte = 3

[/fancy_list]

Metodi:[fancy_list style=”bullet_list”]

  • muoversiAvanti
  • retromarcia
  • cambioMarcia

[/fancy_list]

Come la classe

[/fancy_table]

I campi

Ogni classe ha dei campi conosciuti anche col nome di variabile di istanza. Queste variabili costituiscono la memoria privata dell’ oggetto.

Volendo, i campi sono accessibili dall’ esterno dell’ oggetto, ma normalmente questa è una pratica sconsigliata: piuttosto dovremmo definire dei metodi per modificare o restituire ogni campo (Incapsulamento).

Inoltre, è possibile definire campi di tipo costanti( final, in java) ovvero campi che non cambiano durante l’esecuzione del programma (es: anche se volessimo cambiarle di aspetto o bucassimo una ruota, il numero di porte di un’auto è sempre uguale).

I Metodi

I metodi sono tutte le azioni che un oggetto può compiere: accendi, spegni, elimina, aggiorna,  play, pausa e via dicendo.

Questo particolare punto della OOP assomiglia alle funzione ma il modo di invocarli e gli utilizzi sono diversi.

I metodi possono, come i campi, essere pubblici, privati o protetti: a seconda di quale impostiamo, sarà possibile permettere ad altri oggetti di accedere al metodo (vedremo un’altra volta le restrizioni applicate).

Inoltre, come i campi, possono essere statici: ovvero è come se eseguissero un’azione uguale a tutti gli oggetti. Ovvero:

static faiBenzina(Automobile a)

E’ un metodo statico che prende in input un’automobile a e le fà la benzina (operazione uguale per tutte le macchine).

tumblr_mmuudzP8791snsscko1_1280

Due concetti su cui si basa la OOP

Vediamo brevemente gli ultimi due concetti su cui si basa la Programmazione Orientata agli Oggetti, gli altri li abbiamo affrontati (magari non così direttamente) nel corso dell’articolo.

Ereditarietà

E’ una delle funzioni più utili della programmazione Object Oriented: vediamo subito un esempio pratico, applicato alla Macchina di poco fa.

Mettiamo per esempio che volessi creare un nuovo gioco di corse, in cui è possibile scegliere sia Moto che Macchine.

Se per esempio ho i tipi Macchine e i tipi Moto, senza l’ereditarietà (ed anche nella programmazione procedurale) sarei costretti a creare 2 blocchi di codice diverso, blocchi in cui dovrei copiare ed incollare tutte le volte i metodi:

  • accendi()
  • spegni()
  • usaNos()
  • ruotaBucata()
  • fineBenzina()

Sfruttando l’ Ereditarietà invece, possiamo definire prima una classe Veicolo, con attributi ad esempio:

velocità, cilindri, accellerazioni

e con metodi:

accendi(), spegni(),usaNos(), ruotaBucata(), fineBenzina()

Dopodiche, possiamo definire le classi Macchina e Moto come figlie di Veicolo, ovvero che ereditano tutti i suoi metodi ed attributi.

La particolarità di questa cosa, è la possibilità di eseguire l’override dei metodi, ovvero poter riscrivere i metodi come preferiamo. In pratica, se le macchine si spengono tutte allo stesso modo, ma c’è un nuovo modello che si accende tramite impronta digitale, ci basterà ridefinire il metodo accendi() in modo che sia adatto all’oggetto che vogliamo creare.

Polimorfismo

Polimorfismo vuol dire più forme: è la capacità di assegnare ad un oggetto, uno che lo eredita.

Vediamo un’esempio per capire subito la potenza ed utilità di questo concetto molto importante: per creare un oggetto, farò una cosa del genere:

Tipo nomeVariabile = nuovaIstanza dell'oggetto Tipo

con il polimorfismo, posso fare:

Tipo nomeVariabile = nuovaIstanza di un oggetto che eredita Tipo

Portando subito un esempio con una classe Veicolo: la classe macchina estende la classe Veicolo: ha i suoi stessi metodi e attributi. La classe Macchina però magari, esegue l’overriding di qualche metodo.

Per esempio, metti che ho Veicolo con i metodi:

  • accendi(), accende il veicolo
  • spengi(), spegne il veicolo

ed una classe Macchina che la estende e reimplementa il metodo accendi:

  • accendi(), accende la macchina ed accende i fari

Quando facciamo:

Veicolo macchina = new Macchina();

Avremo un oggetto di tipo veicolo con i metodi di Veicolo ma, se disponibili, reimplementati da Macchina.

Tornando al gioco di macchine, se l’utente stà selezionando un Veicolo ma non sappiamo quale sarà, possiamo creare già una variabile di tipo Veicolo alla quale poi potremo associare un’istanza di Macchina (o Moto).