Sconto del 20% su tutti i corsi inserendo nel form il codice SPRING20 | Fino al 30 aprile
Sconto del 20% su tutti i corsi inserendo nel form il codice SPRING20 | Fino al 30 aprile

Guide per aspiranti programmatori

Lezione 24 / 26

Object Composition in PHP

Abbiamo detto che una delle attività fondamentali in un progetto creato con linguaggi di programmazione orientati ad oggetti è stabilire i rapporti tra le classi. 
Nella programmazione ad oggetti, due modi di mettere in relazione le classi sono l’ereditarietà (che abbiamo affrontato precedentemente) e l’Object Composition, che analizzeremo in questo articolo.

Come abbiamo potuto capire, la relazione di ereditarietà rende difficile cambiare la classe padre, in quanto queste modifiche andrebbero a ripercuotersi su tutte le classi figlie che, quindi, andrebbero riadattate.

In tal senso, invece, la composizione prevede un approccio che rende assai più semplice modificare il codice.

Inoltre, al contrario dell’ereditarietà, la composizione è più dinamica, in quanto ogni oggetto può essere rimpiazzato da un altro oggetto purchè, però, sia dello stesso tipo. 
Non di meno, evita anche la costruzione di gerarchiche classi enormi e quindi poco gestibili.

Di contro, l’Object Composition è, però, più complessa dell’ereditarietà, in quanto porta a un aumento del numero degli oggetti istanziati.

Confuso? Non temere. Andiamo a tradurre quanto detto in codice, riutilizzando il nostro caro esempio precedente del computer.

Creazione di un oggetto tramite Composition

Nell’esempio del capitolo precedente, parlando della Dependency Injection, abbiamo dichiarato come la classe Computer utilizzasse la classe MotherBoard per funzionare.
Essendo MotherBoard un concetto molto ampio (diversi formati, diversi tipi di socket CPU, diversi tipi di RAM supportate ecc.), possiamo pensare di trasformare MotherBoard in una classe astratta.

abstract class MotherBoard{
  public $format;
  public $socket;
  public $ram;
}

Andiamo, poi, a creare delle classi che estendono la classe astratta, ognuna per ogni tipo di scheda madre.

class MsiB550 extends MotherBoard{
  public function __construct($format, $socket, $ram){
    $this->format = 'ATX';
    $this->socket = 'AM4';
    $this->ram = 'DDR4';
  }
}

  class MsiCreator extends MotherBoard{
    public function __construct($format, $socket, $ram){
    $this->format = 'E-ATX';
    $this->socket = 'TRX4';
    $this->ram = 'DDR4';
  }
}

Adesso, possiamo tornare al nostro Computer, come lo avevamo lasciato nel precedente capitolo.

class Computer {
  public $motherBoard;
  public function __construct(MotherBoard $motherBoard){
    $this->motherBoard = $motherBoard;
  }
}

Grazie alla Object Composition noi possiamo comporre, appunto, un’istanza di classe Computer come vogliamo: infatti, le classi MsiB550 e MsiCreator, estendendo la classe astratta MotherBoard, ne condividono il tipo (o interfaccia).
Questo si traduce nella possibilità di richiamare la funzione costruttore, continuando a rispettare il type hinting della Dependency Injection.

$computer1 = new Computer(new MsiB550());
$computer2 = new Computer(new MsiCreator());

echo $computer1->motherBoard->format . "\n";
echo $computer2->motherBoard->format;

//Output:
// ATX
// E-ATX

Questo tipo di gestione ci ha permesso di creare due istanze di classe Computer completamente diverse tra loro e che potenzialmente possono comportarsi in maniera totalmente differente. Non male, eh?

Ereditarietà VS Object Composition: quale utilizzare?

Come spesso accade nel mondo della programmazione informatica, uno sviluppatore web può, non di rado, trovarsi davanti ad un bivio. Giunto a questo punto delle nostre lezioni php avrai assimilato le differenze tra Ereditarietà e Object Composition.
Ma quale scegliere, tra le due?
Non sentirsi spaesato! Dal punto di vista prettamente didattico, dovremmo scegliere tra ereditarietà e composizione in base alla relazione che vogliamo esprimere:

  • l’ereditarietà è da preferire quando un oggetto di una classe figlia è anche un oggetto della classe padre: per esempio, Person -> Teacher. Questo tipo di relazione viene chiamata is-aIn generale usiamo l ereditarietà quando la classe che stiamo creando specializza la classe padre.
  • la composizione, invece, è da preferire quando un’istanza di una classe ha, al suo interno, un’istanza di un’altra classe, senza alcun tipo di legame ereditario: per esempio, Computer -> MotherBoard. Questo tipo di relazione viene definito has-a.

Nb. si può trasferire questo ragionamento anche ai metodi:

  • se tutti i metodi di una classe devono essere anche di un’altra, allora si usa l’ereditarietà;
  • se alcuni metodi di una classe non devono essere metodi anche di un’altra, allora si usa l’Object Composition.

Pagamento rateale

Valore della rata: A PARTIRE DA 115 €/mese.

Esempio di finanziamento 

Importo finanziato: € 2440 in 24 rate da € 115 – TAN fisso 9,55% TAEG 12,57% – importo totale del credito € 2841.

Il costo totale del credito comprende: interessi calcolati al TAN indicato, oneri fiscali (imposta di bollo sul contratto 16,00 euro*) addebitati sulla prima rata, costo mensile di gestione pratica € 3,90, spesa di istruttoria € 0,00, spesa per invio rendicontazione periodica cartacea € 0,98 (o spesa per invio rendicontazione periodica cartacea € 0,00), imposta di bollo su rendicontazione periodica € 0,00. Modalità di rimborso obbligatoria: addebito diretto su c/c. La scadenza delle rate è determinata dal giorno della liquidazione del contratto; la data di scadenza delle rate è prevista il giorno 15 del mese. L’importo di ciascuna rata comprende una quota di capitale crescente e interessi decrescente secondo un piano di ammortamento “alla francese”. Offerta valida dal 01/01/2024 al 31/12/2024.

Messaggio pubblicitario con finalità promozionale. Per le informazioni precontrattuali richiedere sul punto vendita il documento “Informazioni europee di base sul credito ai consumatori” (SECCI) e copia del testo contrattuale. Salvo approvazione di Sella Personal Credit S.p.A. Aulab S.r.l. opera quale intermediario del credito NON in esclusiva.

*In fase di richiesta del finanziamento verrà proposta la facoltà di selezionare, in alternativa all’imposta di bollo sul contratto di 16,00 euro, l’imposta sostitutiva, pari allo 0,25% dell’importo finanziato.

Pagamento rateale

Valore della rata: A PARTIRE DA 210 €/mese.

Esempio di finanziamento  

Importo finanziato: € 4500 in 24 rate da € 210,03 – TAN fisso 9,68% TAEG 11,97% – importo totale del credito € 5146,55.

Il costo totale del credito comprende: interessi calcolati al TAN indicato, oneri fiscali (imposta di bollo sul contratto 16,00 euro*) addebitati sulla prima rata, costo mensile di gestione pratica € 3,90, spesa di istruttoria € 0,00, spesa per invio rendicontazione periodica cartacea € 0,98 (o spesa per invio rendicontazione periodica cartacea € 0,00), imposta di bollo su rendicontazione periodica € 0,00. Modalità di rimborso obbligatoria: addebito diretto su c/c. La scadenza delle rate è determinata dal giorno della liquidazione del contratto; la data di scadenza delle rate è prevista il giorno 15 del mese. L’importo di ciascuna rata comprende una quota di capitale crescente e interessi decrescente secondo un piano di ammortamento “alla francese”. Offerta valida dal 01/01/2024 al 31/12/2024.

Messaggio pubblicitario con finalità promozionale. Per le informazioni precontrattuali richiedere sul punto vendita il documento “Informazioni europee di base sul credito ai consumatori” (SECCI) e copia del testo contrattuale. Salvo approvazione di Sella Personal Credit S.p.A. Aulab S.r.l. opera quale intermediario del credito NON in esclusiva.

* In fase di richiesta del finanziamento verrà proposta la facoltà di selezionare, in alternativa all’imposta di bollo sul contratto di 16,00 euro, l’imposta sostitutiva, pari allo 0,25% dell’importo finanziato.

Contattaci senza impegno per informazioni sul corso

Scopriamo insieme se i nostri corsi fanno per te. Compila il form e aspetta la chiamata di uno dei nostri consulenti.