Sviluppo Ignorante

Ignoranza in abbondanza

Programmazione ad oggetti (OOP)

Buongiorno popolo di ignoranti.

Di cosa parleremo oggi ?

Oggi parleremo della programmazione ad oggetti, chiamata anche OOP, ovvero Object Oriented Programming.

Cenni storici

Di cosa si tratta? Per spiegare la OOP , dobbiamo andare un po' indietro nel tempo, ovvero, nei ruggenti anni '60, quando il rock era ancora rock, quando le rondini facevano ancora primavera e c'erano le mezze stagioni e via dicendo. Scherzi a parte, fino agli anni sessanta, si usava un metodo di programmazione che era definito procedurale, ovvero, il codice veniva eseguito in una determinata sequenza, la cosa portava diversi disagi perchè non si poteva riciclare lo stesso codice e si potevano utilizzare solo i tipi legati alle variabili. Nel 1967 nacque Simula , il primo linguaggio ad oggetti.

Bene, dal 1967 ad oggi, cosa è cambiato? Sono cambiate tantissime cose, nacquero i concetti di astrazione ed eredatietà. Ma esattamente, di cosa si tratta?

Lo spieghiamo con un esempio pratico.

Esempio

Si richiede di sviluppare un software che indichi su una flotta di veicoli, i livelli di carburante di ogni singolo veicolo. Quindi, cosa si fa? Si crea un oggetto ( o classe ) che chiameremo macchina. La macchina indubbiamente avrà dei suoi attributi, quali, dimensione,peso,e livello carburante. Per comodità scriverò l'esempio dell'oggetto in c# .

Public class Macchina 
{
    double Altezza {get;set;}
    double Larghezza {get;set;}
    double Lunghezza {get;set;}
    double Peso {get;set;}
    double LivelloCarburante {get;set;}
}

Nell'esempio, possiamo notare che ho creato la classe Macchina con tutte le sue proprietà (o attributi). Da notare, la parte a destra di ogni attributo {get;set;}, indica che quell'attributo può essere sia letto che scritto. Se ci fosse solo il {get;} l'attributo sarebbe in sola lettura.

Ogni classe ha un suo costruttore, che è un metodo che si può utilizzare per inizializzare gli attributi di una classe

Public Macchina()
{
     this.Altezza = 0d; 
     this.Larghezza = 0d; 
     this.Lunghezza = 0d;
     this.Peso = 0d;
}

In questo esempio, ho creato il costruttore della classe macchina. Ciò implica che quando istanzierà la classe Macchina con l'istruzione new, i valori di altezza, larghezza, lunghezza e peso saranno inizializzati a 0.

Se nel metodo del costruttore passassimo dei parametri, quelli sarebbero obbligatori.

Ho utilizzato la parola chiave this prima di ogni attributo, quello indica che verrà utilizzato l'attributo di classe e non ad esempio una variabile locale chiamata con lo stesso nome.

Public Macchina(double altezzamm)
{
     //converto l'altezza in metri
     double Altezza =altezzamm/1000;
     this.Altezza = Altezza; 
}

Nell'esempio sopra, ho creato un costruttore che richiede in input un parametro obbligatorio, che corrisponde all'altezza della macchina in millimetri. Nel codice del costruttore, possiamo notare che ho creato una variablie locale chiamata come il nome dell'attributo altezza, nel quale viene convertita l'altezza in millimetri in metri. dopo di chè, ho assegnato all'attibuto Altezza il valore della variabile locale ( this.Altezza = Altezza) .

In una classe si possono avere anche più di un costruttore e più metodi.

Public class Macchina 
{
    double Altezza {get;set;}
    double Larghezza {get;set;}
    double Lunghezza {get;set;}
    double Peso {get;set;}
    double LivelloCarburante {get;set;}

   Public Macchina()
   {
     this.Altezza = 0d; 
     this.Larghezza = 0d; 
     this.Lunghezza = 0d;
     this.Peso = 0d;
   }
   Public Macchina(double altezzamm)
   {
     //converto l'altezza in metri
     double Altezza =altezzamm/1000;
     this.Altezza = Altezza; 
   }
   public double SetLivelloCarburante(double livello)
   {
        this.LivelloCarburante = livello; 
        return this.LivelloCarburante; 
   }
}

Ho riscritto completamente la classe Macchina, con due costruttori, uno che non richiede parametri e l'altro che richiede un parametro. In più ho creato anche la funzione SetLivelloCarburante, che richiede il livello da settare e restituisce il livello appena settato. L'utilizzo sarà molto semplice.

//Creo una lista di macchine senza passare nessun parametro; 
var Macchine = new List<Macchina>(); 
//Creo una singola macchina passando l'altezza come parametro 
var _Macchina = new Macchina(2560); 

//Setto il livello di carburante nella macchina
var livello  = _Macchine.SetLivelloCarburante (25); 

Ora poniamo, che dobbiamo creare anche l'oggetto Furgone che dovrà essere identico all'oggetto Macchina, ma , deve avere in più la capacità di carico del mezzo.

public class Furgone : Macchina {
      public double CapacitàCarico {get;set}
}

Ho appena applicato il concetto di Ereditarietà, ovvero, la classe Furgone, eredita tutti i metodi, le funzioni e gli attributi della classe macchina, aggiungendo l'attributo CapacitàCarico. Se volessi riscrivere un metodo della classe Macchina (quindi quella dal quale eredito) posso creare un override

public ovverride double SetLivelloCarburante(double livello)
   {
        this.LivelloCarburante = livello; 
        return 0d; 
   }

In questo caso, per l'oggeto Furgone, la funzione SetLivelloCarburante, restituirà sempre 0.

Ricapitolando

Astrazione : Portare ad un livello logico, un qualcosa di reale, come una macchina. Il fatto di aver creato l'oggetto Macchina è un'astrazione.

Ereditarietà : Capacità da parte di un oggetto di ereditare metodi, funzioni ed attributi da un altro oggetto.

Quindi, la programmazione ad oggetti, è un paradigma di programmazione basato sulla creazione di oggetti, riutilizzabili e manipolabili a proprio piacimento.

Per approfondire l'argomento Wikipedia può essere fonte di ispirazione

Buon sviluppo a tutti.