OOP non ti dimenticare mai di lei!

Cos’è un oggetto? Nella vita quotidiana tutto può essere interpretato come un oggetto: automobile, cane, casa, gelato.
In informatica: è un oggetto che compie azioni e ha delle caratteristiche specifiche.
Caratteristiche automobile: prezzo, modello, peso, numero di porte, cilindrata.
Azioni automobile: si sposta, frena, cambia marcia.
Le caratteristiche sono specifiche ma sono anche globali in quanto permettono di rappresentare un qualsiasi modello di automobile, da una Ferrari ad una Smart.

Caratteristiche degli oggetti: ATTRIBUTO/PROPRIETA’
Azioni che gli oggetti compiono: METODI

In informatica rappresentare la realtà facendo ricorso agli oggetti semplifica enormemente la programmazione.

Supponiamo di voler modellare una persona come un oggetto, un chirurgo ed un ingegnere. Ora queste due figure sono entrambe delle persone, ed avranno le stesse identiche caratteristiche di una persona (cognome nome, altezza, peso, codice fiscale, ecc). Quello che però li distingue è il fatto che il primo opera le persone e il secondo esegue calcoli.
Pertanto il paradigma OO ci permette di modellare la realtà anche in maniere più complesse facendo ricorso a concetti quali: l’ereditarietà, il polimorfirsmo e l’incapsulamento.

Una persona, un chirurgo e un ingegnere rappresentano classi.
Una classe definisce il tipo di oggetto (es: un oggetto di tipo persona).
Nome, cognome, altezza, peso sono attributi di una qualsiasi persona e quindi della classe.
Giuramento d’Ippocrate è un attributo solo del medico (non tutte le persone hanno questo attributo).
Mangia, dorme sono azioni che tutte le persone compiono.
Calcoli integrali è un metodo dell’ingegnere (non tutte le persone eseguono in continuazione integrali)
Chirurgo e ingegnere ereditano tutti gli attributi e i metodi da persona.

Lo switch mentale
Passare dal pensiero procedurale, che si basa nel pensare ad una sequenza di passi da fare per risolvere un problema, ad un pensiero decentrato. La potenza è che in un pensiero ad oggetti le modifiche sono locali. Per modificare qualcosa, invece, nel procedurale devo pensare a tutto l’intero.
Obiettivo: avere dei pezzi ri-usabili, ri-componibili. Ogni pezzo ha un senso.
Il pensiero ad oggetto, mentre, ci richiede uno sforzo mentale superiore, un livello di astrazione superiore.

Esempio: creare il login in un’applicazione ed evadere un ordine.
Approccio procedurale:

function login (username, password) {
    // ....
    return id;
}
// creo il form con il pulsante "Salva". 
function creaOrdine (idutente) {
   // ...
   return true;
}

Approccio ad oggetti: andiamo ad utilizzare direttamente gli attori

Cliente.Autenticazione()
Cliente.CreaOrdine()

Concetto di Visibilità:
public: attributo o metodo accessibile da ovunque (sia dall’interno che dall’esterno della classe e dalle classi derivate da essa)
protected: attributo o metodo accessibili dall’interno della classe stessa e dall’interno delle classi derivate), ma non sono accessibili dall’esterno. In questo modo proteggiamo l’attributo dalle modifiche.
private: attributo o metodo possono essere utilizzati soltanto all’interno della classe stessa.

Ereditarietà: una classe può ereditare le proprietà ed i metodi da un’altra classe. Non è ammessa la ereditarietà multipla, ovvero è possibile estendere una sola classe.

Override di un metodo: sovrascrivere all’interno della classe figlia un metodo definito nella classe padre. Attenzione: la visibilità del metodo deve essere maggiore o uguale alla visibilità ereditata.
Per fare in modo che una classe non venga estesa, la classe deve essere dichiarata di tipo final. Si può dichiarare anche specificatamente il metodo di tipo final, in quel caso la classe può essere estesa, ma il metodo non potrà essere sovrascritto.

Proprietà e metodi statici: elementi non accessibili tramite l’istanza, ma sono elementi interni della classe stessa. In sostanza, per accedervi non bisogna avvalersi dell’oggetto, cioè, non è necessario instanziare l’oggetto della classe. Ma bisogna utilizzare la seguente sintassi:
Auto::$modello, all’interno della classe self::$modello, all’interno della classe figlia parent::$modello.