23. Esempio pratico per l'uso di Interfacce


Introduzione

In questo capitolo scriverò delle classi e delle interfacce per la creazione e la gestione di alcuni account per un sito web.

Ovviamente il codice non sarà utilizzabile, in quanto solo parzialmente scritto. Lo scopo è quello di far capire meglio le potenzialità delle interfacce, mediante un esempio pratico facilmente intuibile e più vicino ad un'applicazione reale.


Definizione del concetto base

Questa pseudo-libreria, fornirà gli strumenti per creare e gestire 3 tipi di account :

  • Utente - Utente normale senza privilegi particolari
  • Premium - Utente premium con la possibilità di gestire una propria casella messaggi
  • Amministratore - Utente con privilegi amministrativi ed una casella messaggi personale

Per questo scopo scriveremo 1 classe astratta, 2 interfacce e 3 sottoclassi elencate di seguito :

  • Account - Classe Astratta
    Fornirà gli attributi di base per gli altri account e un metodo astratto per registrare gli account nell'archivio del sito (es. Database MySQL o file esterno)
  • Amministrazione - Interfaccia
    Fornirà dei metodi astratti di base per amministrare l'utenza, inserendo, modificando e cancellando utenti dall'archivio del sito
  • CasellaMessaggi - Interfaccia
    Fornirà dei metodi astratti per la gestione di una casella messaggi personale interna al sito
  • Utente - Sottoclasse derivata da Account
    Oggetto per la memorizzazione dei dati su un utente con metodo per la registrazione in archivio
  • Premium - Sottoclasse derivata da Account che implementa l'interfaccia CasellaMessaggi
    Oggetto per memorizzare un utente con privilegi premium e metodi per registrare l'utente in archivio e gestire una casella messaggi personale
  • Amministratore - Sottoclasse derivata da Account che implementa l'interfaccia Amministrazione e CasellaMessaggi
    Oggetto per la memorizzazione di un account di amministrazione, con metodi per la registrazione dell'account in archivio, la gestione di altri utenti (inserimento, modifica e cancellazione) e la gestione di una casella messaggi personale

Ecco un diagramma che mostra tutti gli oggetti e le loro relazioni.

Di seguito il codice testato con la corretta sintassi :

<?php

	// Classe Astratta di Base
	abstract class Account
	{
		protected $nome_utente;
		protected $pass_utente;
		protected $data_iscrizione = NULL;

		abstract protected function registraAccount();
	}

	// Inizio INTERFACCE
	interface Amministrazione
	{
		function aggiungiUtente(Utente $utente);
		function modificaUtente(Utente $utente);
		function cancellaUtente(Utente $utente);
	}

	interface CasellaMessaggi
	{
		const MAX_MESSAGGI = 100;

		function controllaCasella();
		function leggiMessaggio($id_messaggio);
		function cancellaMessaggio($id_messaggio);
	}
	// Fine INTERFACCE

	// Classi per la definizione dei vari tipi di Account

	class Utente extends Account
	{
		public function Utente($n, $p, $d)
		{
			$this->nome_utente = $n;
			$this->pass_utente = $p;
			$this->data_iscrizione = $d;
		}

		public function registraAccount()
		{ /* Codice per la registrazione dell'utente */ }
	}

	class Premium extends Account implements CasellaMessaggi
	{
		public function Premium($n, $p, $d)
		{
			$this->nome_utente = $n;
			$this->pass_utente = $p;
			$this->data_iscrizione = $d;
		}

		public function registraAccount()
		{ /* Codice per la registrazione dell'utente */ }

		public function controllaCasella()
		{ /* Codice per il controllo della Casella Messaggi */ }

		public function leggiMessaggio($id_messaggio)
		{ /* Codice per la lettura di un messaggio della casella */ }

		public function cancellaMessaggio($id_messaggio)
		{ /* Codice per la cancellazione di un messaggio dalla casella */ }
	}

	class Amministratore extends Account implements Amministrazione, CasellaMessaggi
	{
		public function Amministratore($n, $p)
		{
			$this->nome_utente = $n;
			$this->pass_utente = $p;
		}

		public function registraAccount()
		{ /* Codice per la registrazione dell'utente */ }

		public function aggiungiUtente(Utente $utente)
		{
			echo "Stai aggiungendo l'utente " . $utente->nome_utente . "<br />\n";
			// Codice per aggiungere un utente all'archivio ...
			echo "Utente " . $utente->nome_utente . " aggiunto con successo!<br />\n";
		}

		public function modificaUtente(Utente $utente)
		{
			echo "Stai modificando l'utente " . $utente->nome_utente . "<br />\n";
			// Codice per modificare un utente dell'archivio ...
			echo "Utente " . $utente->nome_utente . " modificato con successo!<br />\n";
		}

		public function cancellaUtente(Utente $utente)
		{
			echo "Stai cancellando l'utente " . $utente->nome_utente . "<br />\n";
			// Codice per cancellare un utente dall'archivio ...
			echo "Utente " . $utente->nome_utente . " cancellato con successo!<br />\n";
		}

		public function controllaCasella()
		{ /* Codice per il controllo della Casella Messaggi dell'Amministratore */ }

		public function leggiMessaggio($id_messaggio)
		{ /* Codice per la lettura di un messaggio della casella dell'Amministratore */ }

		public function cancellaMessaggio($id_messaggio)
		{ /* Codice per la cancellazione di un messaggio dalla casella dell'Amministratore */ }
	}

	// Inizio codice di esempio

	$utente = new Utente("mario", "miapassword", 1185456501);
	$admin = new Amministratore("francesco", "altrapass");

	$admin->aggiungiUtente($utente);

?>

Le ultime tre righe di codice, puramente a scopo illustrativo, genereranno il seguente output :

Stai aggiungendo l'utente mario
Utente mario aggiunto con successo!


Ricordatevi che l'ereditarietà multipla è concessa solo fra interfacce con extends, mentre fra classi è necessario ricorrere all'implementazione di interfacce con implements.

Nota : le interfacce non possono ereditare dalle classi.