Programmazione ad Oggetti Facile
10 Mar 2021 - Informatica, Software
Programmazione ad Oggetti anche detta OOP spiegata in maniera facile e accessibile a tutti.Per chi si approccia per la prima volta o per chi è semplicemente curioso. Ti mostrerò inoltre che non è necessario essere programmatori o conoscere un determinato linguaggio per capirci qualcosa.
Indice
Programmazione ad Oggetti: Una Introduzione!
Quando ho iniziato i miei studi da programmatore sapevo con certezza che prima o poi mi sarei trovato di fronte il mostro sacro della OOP dall’inglese Object Oriented Programming.
L’appassionato neofita ma anche lo studente che si imbatte nelle prime due righe di Wikipedia troverà già le prime difficoltà.
Cito : ” […] è un paradigma di programmazione che permette di definire oggetti software in grado di interagire gli uni con gli altri attraverso lo scambio di messaggi. Particolarmente adatta nei contesti in cui si possono definire delle relazioni di interdipendenza tra i concetti da modellare[…]“
Eppure non dovrebbe essere per niente ostico infatti essa è pensata proprio per avvicinare il coding alla vita reale.
Ti faccio vedere come sia del tutto banale! Sapresti descrivermi banalmente una penna? Oppure una matita? Sapresti descrivermi le sue caratteristiche? Sapresti dirmi cos’è che fa di preciso una penna? O un autobus?
Secondo me poi in secondo luogo è figo conoscere la OOP così come anche altri paradigmi di programmazione in quanto esula dal Linguaggio che si utilizza.
OOP: Una Filosofia!
Un Linguaggio è uno strumento! È un giravite, un trapano, una cazzuola… come le usi? Cosa ci fai con questo strumento?
Devi cambiare la ruota ad una macchina, o fare un caffè, al di là degli strumenti che utilizzi che algoritmo usi? Come ti approcci al problema e come lo affronti?
Java, C#, PHP o Python sono strumenti soggetti a determinate regole!
Se ti chiedessi 2+2 quanto fa mi sapresti rispondere perchè sai come funziona l’addizione o solo perchè sai a memoria che fa 4? In caso sai solo che 2+2=4 allora non andrai mai avanti! Se sai come funzionano le addizioni allora sarai in grado anche di fare 5+2!
Capito il concetto? Spero davvero di si perchè con questo approccio mentale puoi aprirti davvero a tutte le strade!
La programmazione è una filosofia, un modo di risolvere problemi ed esula dallo strumento che utilizzi per farlo!
Classi e Oggetti: I mattoncini della Programmazione Orientata ad Oggetti!
Utilizziamo l’esempio classico che si trova in giro su testi, libri di scuola e siti web dedicati alla formazione.
L’automobile! Sappiamo per esperienza quali sono le caratteristiche principali di un’automobile!
Per identificare un’auto specifica utilizziamo caratteristiche specifiche come la casa produttrice, i cavalli motore, il colore della carrozzeria.
Il tuo concessionario di fiducia saprebbe esattamente cosa venderti fornendogli queste caratteristiche. Il tuo concessionario non è di certo un programmatore o un ingegnere… perchè dovrebbe essere così difficile identificare un’automobile?
Già con questo semplice esempio abbiamo definito cosa sia una Classe e cosa sia un Oggetto.
LE CARATTERISTICHE COMUNI A TUTTI GLI OGGETTI SONO CLASSI.
Le caratteristiche comuni a tutte le auto quali pneumatici, carrozzeria, volante, ecc… descrivono una Classe.
Quando queste caratteristiche comuni (penumatici, ecc…) assumono valori precisi (ad esempio pneumatici da neve, casa produttrice Ford, trazione 4×4) otteniamo un singolo Oggetto.
Semplicemente nel mondo dei programmatori questo singolo oggetto viene chiamato Istanza.
Quindi quando sentirete parlare di Istanze della Classe sappiate che ci si sta riferendo ad un Oggetto in particolare.
Ricapitolando, quindi, quando si parla di Persona, Matita, Automobile, Penna, Albero, stiamo indicando l’insieme delle caratteristiche comuni a tutti gli oggetti appartenenti alla stessa classe.
Volendo scendere nel pratico, anche per mostrarti quanto prima detto e cioè che la filosofia della programmazione esula dall’utilizzo di uno specifico linguaggio vediamo con tre linguaggi diversi come definire una classe.
Premetto anche, per avvalorare la mia tesi, che io sono un Web Developer non programmo in Java o in C# ma andando su documentazioni ufficiali o spulciando qualche manuale e sapendo esattamente cosa voglio fare riesco a trovare il modo per farlo!
Java 9:
//dichiarazione Classe Automobile
public class Automobile{
private string casaProduttrice;
private string coloreCarrozzeria;
private int numeroCavalli;
}
//creazione di una istanza (oggetto) della classe
Automobile fordMondeo = new Automobile();
C#:
//dichiarazione Classe Automobile
public class Automobile{
private string casaProduttrice;
private string coloreCarrozzeria;
private int numeroCavalli;
}
// creazione di una istanza (oggetto) della classe
Automobile fordMondeo = new Automobile();
PHP:
//dichiarazione Classe Automobile
class Automobile{
private $casaProduttrice;
private $coloreCarrozzeria;
private $numeroCavalli;
}
// creazione di una istanza (oggetto) della classe
$fordMondeo = new Automobile();
Come potete vedere anche se scritto in tre linguaggi diversi il codice somiglia moltissimo. Addirittura Java e C# sono praticamente identici!
Il concetto di Incapsulamento!
Se ti sei imbattuto nella OOP avrai senz’altro sentito parlare anche di Incapsulamento. Ora ti spiego cos’è!
Abbiamo detto che un oggetto si differenzia da una classe perchè assegna dei valori alle caratteristiche, variabili in termini di programmazione, in essa contenute.
Le caratteristiche, le variabili, in una classe si chiamano attributi. Quindi quando mi sentirai parlare di attributi saprai che mi sto riferendo alle “caratteristiche“.
Ma come si fa a leggere e modificare questi attributi?
Per questioni di sicurezza non è possibile accedere e modificarli direttamente. Tuttavia sono stati creati dei metodi appositi per farlo.
I valori dell’oggetto sono incapsulati nell’oggetto stesso e non è possible accedervi se non appunto con dei metodi.
Possiamo dire che i metodi sono delle funzioni all’interno di una classe!
Questi metodi vengono detti “getters” e “setters“. I primi leggono i valori degli attributi e i secondi li scrivono o li modificano.
Getter in inglese è participio del verbo get che si potrebbe tradurre tra le altre cose come “ottenere“… al participio getter può essere tradotto come “colui che ti procura qualcosa” Google Traduttore lo traduce come “procacciatore”! Insomma rende bene l’idea!
Stessa storia per Setter! Set dall’inglese “impostare“! Ergo…
Per convezione di i metodi getters sono quelli che iniziano con la parola get e i setters con set.
PHP:
class Automobile{
private $casaProduttrice;
private $coloreCarrozzeria;
private $numeroCavalli;
//getters
public function getCasaProduttrice(){
return $this->casaProduttrice;
}
public function getColoreCarrozzeria(){
return $this->coloreCarrozzeria;
}
public function getNumeroCavalli(){
return $this->coloreCarrozzeria;
}
//setters
public function setCasaProduttrice($casaProduttrice){
$this->casaProduttrice = $casaProduttrice;
}
public function setColoreCarrozzeria($coloreCarrozzeria){
$this->coloreCarrozzeria = $coloreCarrozzeria;
}
public function setNumeroCavalli($numeroCavalli){
$this->numeroCavalli= $numeroCavalli;
}
}
Volendo poi creare una istanza di questa classe potremmo scrivere, sempre in PHP:
$fordMondeo = new Automobile();
$fordMondeo->setCasaProduttrice("Ford");
$fordMondeo->setColoreCarrozzeria("Grigio Metallizato");
$fordMondeo->setNumeroCavalli("180 CV");
Per stampare a video in PHP i valori appena inseriti ci serviremo invece dei getters:
echo "<ul><li>Casa Produttrice : ".$fordMondeo->getCasaProduttrice."."</li><li>Colore Carrozzeria :".$fordMondeo->getColoreCarrozzeria."</li><li>Cavalli Motore :".$fordMondeo->getNumeroCavalli."</li></ul>"
Come è possibile notare gli attributi, le “caratteristiche“, della classe sono precedute dalla parola “private” ad indicare che non sono accessibili dall’esterno, a differenza dei metodi che per l’appunto sono preceduti dalla parola “public“!
Il concetto di: Ereditarietà!
Se ti è chiaro quanto detto fino ad ora il concetto di ereditarietà non sarà per niente difficile.
L’ereditarietà indica la possibilità di una classe di ereditare, di prendere, gli attributi e i metodi di altre classi.
Infatti in programmazione di parla di sottoclasse e superclasse. La prima eredita dalla seconda. Può sembrare ostico ma anche questo se ti guardi intorno nel mondo reale non lo è affatto.
Fino ad ora abbiamo usato un esempio e cioè quello dell’automobile… secondo te esiste una superclasse per la classe delle automobili?
Esiste una superclasse che racchiude le stesse caratteristiche di quella delle automobili?
Se ti parlassi di veicoli?
I veicoli sono la superclasse della sottoclasse automobili.
Le motocilette, i camion, gli scooter, gli autobus… sono tutte classi che condividono degli attributi! Ad esempio tutti hanno un motore, degli pneumatici, della carrozzeria, dei fari!
Utilizzando un linguaggio di modellazione grafica chiamato UML (Unified Modeling Language) per sfruttare la potenza delle immagini possiamo rappresentare quanto detto così:
Il primo vantaggio dell’ereditarietà è il risparmio di codice! Ad esempio quel famoso
return $this->coloreCarrozzeria;
visto prima posso usarlo una sola volta nella classe Veicoli e riutilizzarla in tutte le altre sottoclassi!
Mi basterà definire il metodo una volta sola e riutilizzarlo.
Mi potresti chiedere complicando un pò le cose perchè creare tre sottoclassi di Veicolo quando potremmo aggiungere alla classe Veicolo il tipo di veicolo.
La risposta sta nelle differenze tra i veicoli!
Perchè dovrei intasare la classe Veicoli con attributi del tipo “numeroSportelli” quando ad esempio nelle moto gli sportelli non ci sono?
Le superclassi sono solo le caratteristiche in comune alle classi!
Quando però creare una superclasse? Perchè se ci pensi la classe veicoli potrebbe condividere anche l’attributo “colore” con la classe penne!
Bisogna sempre riflettere bene quando creare una superclasse.
Una regola fondamentale da seguire sempre è la famosa “is-a” ovvero : dopo aver trovato più classi che condividono gli stessi attributi, per poter creare una superclasse dobbiamo chiederci se le sottoclassi “sono” anche una superclasse.
Nel mondo reale : Una Moto è un (is-a) Veicolo? SI! Allora Veicolo può essere una superclasse! Un Camion è un Veicolo? SI!
Una penna (che condivide l’attributo “colore”) è un veicolo? Assolutamente NO!!!
Segui sempre questa regola anche quando crei le tue applicazioni!!!
Il concetto di: Polimorfismo!
Polimorfismo, dal greco antico, indica la capacità di qualcosa di assumere molte forme.
Si pensi ad esempio all’atto del camminare. Un uomo, una cane ed un cavallo lo faranno in maniera diversa eppure tutti e tre stanno compiendo la stassa azione.
Il concetto di polimorfismo è tutto qui!
Se il concetto di ereditarietà di prima era legato agli attributi il concetto di polimorfismo è un qualcosa legato ai metodi cioè alle azioni che una classe deve fare!
E’ inutile per ogni veicolo scrivere una funzione per inserire una marcia! L’utilizzo del polimorfismo mi permette di scrivere una volta sola la funzione di inserimento della marcia e sarà poi il sistema stesso a preoccuparsi di farlo.
Figo no?
OOP: Conclusioni!
Come hai potuto tu stesso constatare non è necessario conoscere per forza un determinato linguaggio di programmazione per capire la Programmazione Orientata agli Oggetti.
La programmazione è uno stile di vita, una filosofia di vita, un approccio affascinante alla risoluzione dei problemi non solo informatici ma di tutti i giorni.
Quando inizi ad addentrarti in questo mondo affascinante inizierà a condizionare anche tutto il tuo modo di vedere il mondo e i suoi problemi.
Spero di esserti stato di aiuto!
GiustinoRomano.IT – I do IT with my Heart.