PHP e programmazione fluente

Leggo con un certo interesse del nuovo meme di planet-php, cioè dell’uso di interfacce fluent.

A seguire un piccolo tutorial su come utilizzarle.

In cosa consistono le interfaccie fluent? Detto in maniera semplice si tratta del principio di method chaining di linguaggi come SmallTalk che comporta l’esecuzione metodi in cascata senza dichiarare ogni volta l’oggetto, in modo da poter leggerne il codice fluentemente come se fosse una frase.

Cioè invece che scrivere:

$pippo = new Oggetto();
$pippo->faccioQuesto();
$pippo->poiQuello();
$pippo->eQuellaltro();

usando un’interfaccia fluent riscrivo così:

$pippo= new Oggetto();
$pippo->faccioQuesto()->poiQuello()->eQuellaltro();

che può essere poi reso più leggibile grazie alla gestione degli spazi e degli a capo di php ed usando un’opportuna tabulazione

$pippo= new Oggetto();
$pippo->faccioQuesto()
            ->poiQuello()
            ->eQuellaltro();

ma come funziona un codice del genere? semplicemente restituendo all’interno dei metodi sempre l’oggetto iniziale

class Oggetto()
{
            var $variabile = '';

            function public faccioQuesto()
            {
                        echo 'ciao';
                        return $this;
            }

            function public poiQuello()
            {
                       $this->poiQuelloPrivato();
                       return $this;
            }

            function public eQuellaltro()
            {
                        echo $this->variabile;
                        return $this;
            }


            function private poiQuelloPrivato()
            {
                        $this->variabile = 'mondo';
            }            
}

anche se più comodo da leggere e da usare questo metodo di programmazione ha alcuni limitazioni:

  • innanzitutto per alcune procedure complesse bisognerà sempre conoscere a priori la sequenza di comandi da eseguire (anche se spesso è così anche nella normale programmazione ad oggetti), e bisognerà conoscere tutti i parametri da passare a questi ultimi
  • il codice qui sopra esposto funziona solo con php 5 che permette di restituire l’oggetto iniziale direttamente dai metodi
  • scordatevi una Naming Convention decente dei metodi, o si usano dei termini “fluidi” e facili da concatenare o il giochetto perde di significato in leggibilità
  • e ultima cosa, come fa notare Andi Gutsman, l’utilizzo di una fluent interface comporta l’uso metodico delle exception (non sempre usate dagli sviluppatori procedurali).

ciuaz

  • Hai degli esempi di codice vero e proprio per capirne la bontà?

    Io mi son abituato a leggere php normalmente e non mi fa grossa fatica comprendere il codice.

  • oggi volevo mettere questo tuo post tra i miei del.icio.us ma …. l’avevo già fatto a gennaio 2006 ….

    per lo meno mi sento coerente :)

%d bloggers like this: