Da WIKI CoderDojo Firenze.

## TODO: 

1. Ereditarietà tra classi

2. Semplificazione lessico


Che cos'è la programmazione a oggetti

Esistono centinaia di linguaggi di programmazione, ma i più famosi come C++, Java e Python hanno una cosa in comune: si dicono object orientated (orientati agli oggetti)

In altre parole, si dicono che sono linguaggi di programmazione ad oggetti.

L'obiettivo di questo tutorial è spiegare i concetti fondamentali di questo modo di programmare.


Che cos'è un oggetto

Pensate ad un oggetto nel mondo reale. Una palla, un orologio, una lampada... Decidete voi. Prendiamo ad esempio una lampada: la mia può essere arancione, la tua blu; la mia a LED, la tua a incadescenza; la mia con il colore metallizzato e la tua no. Questi due "oggetti", però, hanno delle cose in comune che li contraddistinguono come "lampade": servono entrambi a illuminare e solitamente si mettono sopra una scrivania. 

In un linguaggio ad oggetti questi due oggetti si dicono istanze della classe lampada

Ok, calmi tutti! Pensiamo innanzittutto ad una classe come ad uno stampino o a un'idea di un oggetto: di per sè non è reale, è solo un qualcosa che descrive un qualcos'altro di reale.

Ritornando all'esempio di prima, entrambi sappiamo cos'è una lampada, ma se ci chiedono "dimmi la definizione di lampada" o "pensa all'idea di lampada" (ok lo ammetto, solo un pazzo furioso vi farebbe questa domanda) entrambi penseremo alla stessa cosa. Quella è esattamente la classe "lampada".

E cos'è un'istanza? Un'istanza puo' essere descritta come una rappresentazione reale di una classe: la mia lampada e la tua lampada sono istanze della classe/idea di lampada.

                  +------------------+                            
             +----+ Lampada (classe) +-----+                      
             |    +------------------+     |                      
             |                             |                      
             |                             |                      
             |                             |                      
             v                             v                      
+------------+----------+             +--------------------------+
| Mia lampada (istanza) |             |  Tua lampada (istanza)   |
+-----------------------+             +--------------------------+


Se ci pensate bene sotto queste definizioni qualunque oggetto del mondo reale è in realtà un'istanza di un'idea, che corrisponderebbe alla classe.


Ok, ma... a che serve?

Per diradare la nebbia che di sicuro si è accumulata dopo questa spiegazione, proverò a scrivere qualche riga di Javascript per far vedere che cos'è un oggetto (non vi preoccupate se non capite tutto subito, vi sarà chiaro poi. <ref>O, per citare Matrix: «Cerco solo di dirti che quando sarai pronto, non ne avrai bisogno.»</ref>)

Ecco un esempio:

function Lampada() {
}
var lamp = new Lampada();

 Come potete vedere, usiamo la funzione Lampada() per creare un nuovo oggetto. lamp in questo caso è un'istanza dell'oggetto Lampada.

Avrete notato però che non ho chiamato la funzione normalmente, ci ho messo di fronte infatti la parolina new: questa parola serve a creare una nuova istanza a partire da una funzione, chiamata constructor (letteralmente: costruttore). Questa funzione serve appunto a "costruire" l'istanza dell'oggetto: per tornare all'esempio di prima il constructor della vostra lampada è il procedimento con cui la lampada è stata costruita, ed è stato eseguito a partire dall'idea di lampada. Di conseguenza ogni classe ha un suo constructor, a seconda di cosa deve fare la classe.

Un esempio più complesso

Ora come ora però, questa lampada non ha nulla di che. Come abbiamo detto prima, le lampade possono essere di colori diversi, oppure accese o spente, possono avere un design diverso...

Queste sono proprietà della lampada le quali, una volta costruita, difficilmente cambieranno. Solitamente proprietà simili si mettono nel constructor come argomenti. Vediamo ora un esempio più complicato, dove scegliamo il colore della lampada nel constructor:

function Lampada(colore) {
     this.colore = colore;
}
var lamp = new Lampada("blu");

Hey, che cos'è questo? 

La prima riga dovrebbe essere abbastanza chiara: alla funzione Lampada adesso viene passato l'argomento colore. É la riga sotto invece che è più interessante:

che cos'è this?

this è una parolina che corrisponde all'istanza dell'oggetto che stiamo costruendo. Questo vuol dire che, due righe dopo, quando costruiamo lamp con new Lampada("blu") la proprietà colore di lamp sarà blu.

this però deve sempre avere un oggetto a cui riferirsi. Non possiamo perciò fare:

function Lampada(colore) {
     this.colore = colore;
}
var lamp = new Lampada("blu");
var colore_lampada = this.colore;

Come facciamo quindi a ottenere la proprietà colore di lamp? Basta anteporre alla proprietà che vogliamo ottenere il nome dell'istanza seguito da un punto, così:

function Lampada(colore) {
     this.colore = colore;
}
var lamp = new Lampada("blu");
var colore_lampada = lamp.colore;

 Metodi

La principale interazione che abbiamo con una lampada è una: accenderla o spegnerla, a seconda che sia rispettivamente già spenta o accesa. Potremmo anche noi quindi modificare l'esempio precedente per accendere o spegnere la lampada!

function Lampada(colore) {
this.colore = colore;
this.acceso = false;
}
var lamp = new Lampada("blu");
var colore = this.colore;

function accendi(lamp) {
    if(lamp.acceso == false)
        lamp.acceso = true;
    }
}
accendi(lamp);

Adesso immaginate un secondo un'altra funzione, svita(), che ci permette di svitare la lampadina di una lampada. Immaginate che questa funzione si applichi ad una lampada e che prenda un grosso numero di argomenti, ad esempio svita(lamp, lampadina, tipo, forza, verso)

Javascript qui ci viene in aiuto permettendoci di dichiarare la funzione come metodo. Un metodo non è altro che una funzione che è interna ad un oggetto.

Come per le proprietà, possiamo chiamare i metodi con istanza.metodo(); e in maniera simile a come chiamereste una normale funzione.

function Lampada(colore) {
    this.colore = colore;http://kata.coderdojo.it/wiki/index.php?title=Utente:Giovanniberti
    this.acceso = false;
    this.accendi = function() {
        if(lamp.acceso == false) {
            lamp.acceso = true;
        }
    }
}
var lamp = new Lampada("blu");
var colore = this.colore;
lamp.accendi();

 In questo caso abbiamo assegnato ad una proprietà (accendi) dell'oggetto Lampada una funzione: questa funzione è un metodo.