lunedì 9 dicembre 2013

La OOP in PHP spiegata in un esempio - Parte 9 - Le Classi Nuovamente al Lavoro


Caso 3 - Delegare una fabbrica di metodi statici alla produzione di Poligoni

La fabbrica in questione non sarà altro che un generatore di oggetti. La sua interfaccia, per adesso dedicata alla produzione di un poligono che sia un rettangolo, potrà essere ampliata con metodi per la produzione di altri poligoni. Questa classe generatrice di oggetti cPoligono sarà come segue:


<?php
class cFabbricaPoligoni {
    public static function rettangolo(\iCoordinate $oOrignine, $base, $altezza,  \iColore $oColore){
        $rettangolo = new cPoligono($oColore);
        $rettangolo->setVertice($oOrignine);
        $rettangolo->setVertice(new cCoordinate($oOrignine->getX()+$base, $oOrignine->getY()));
        $rettangolo->setVertice(new cCoordinate($oOrignine->getX()+$base, $oOrignine->getY()+$altezza));
        $rettangolo->setVertice(new cCoordinate($oOrignine->getX(),$oOrignine->getY()+$altezza));              
        return $rettangolo;
    }
}
?>

Il metodo di produzione non fa altro che generare una nuova istanza di un nuovo oggetto cPoligono ed utilizzare le informazioni passate tramite i parametri per caricare nell'oggetto i vertici. Il poligono così prodotto è restituito al client.

Volendo adeguare il nostro script di test, per provare queste nuove classi potremo scrivere:

<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Forme Geometriche</title>
    </head>
    <body>
        <?php
            require_once './cAreaDiDisegnoHTML.php';
            require_once './cPoligono.php';
            require_once './cColore.php';
            require_once './cCoordinate.php';
            require_once './cPunto.php';
            require_once './cPoligonoRettangolo.php';
            require_once './cRettangolo.php';
            require_once './cFabbricaPoligoni.php';
          
            $tavolozza = [
                'rosso'  => new cColore(255, 0, 0),
                'verde'  => new cColore(0, 255, 0),
                'blu'    => new cColore(0, 0, 255),
                'grigio' => new cColore(127, 127, 127),
                'nero'   => new cColore(0,0,0)
            ];
          
            $ad = new cAreaDiDisegnoHTML(50, 50);
          
            $puntoA=new cPunto(new cCoordinate(1, 1), $tavolozza['verde']);
            $puntoB=new cPunto(new cCoordinate(1, 20), $tavolozza['verde']);
            $puntoC=new cPunto(new cCoordinate(20, 20), $tavolozza['verde']);
            $puntoD=new cPunto(new cCoordinate(20, 1), $tavolozza['verde']);
          
                                  
            $poligono = new cPoligono($tavolozza['grigio']);
            $poligono->setVertice($puntoA);
            $poligono->setVertice($puntoB);
            $poligono->setVertice($puntoC);
            $poligono->setVertice($puntoD);
            $poligono->disegna($ad);
          
            $ad->tracciaSegmento($puntoA, $puntoC, $puntoA);
            $ad->tracciaSegmento($puntoB, $puntoD, $tavolozza['rosso']);
          
            $ad->tracciaPunto($puntoA, $tavolozza['blu']);
            $ad->tracciaPunto($puntoB, $tavolozza['blu']);
            $ad->tracciaPunto($puntoC, $tavolozza['blu']);
            $ad->tracciaPunto($puntoD, $tavolozza['blu']);
                      
            $rettangolo = new cPoligonoRettangolo(new cCoordinate(28, 28), 10, 10, $tavolozza['verde']);
            $rettangolo->disegna($ad);
          
            $pol = new cPoligono($tavolozza['rosso']);
            $rettangolo = new cRettangolo(new cCoordinate(25, 25), 10, 10, $pol, $pol);
            $rettangolo->disegna($ad);
          
            $rettangolo = cFabbricaPoligoni::rettangolo(new cCoordinate(22, 22), 10, 10, $tavolozza['blu']);
            $rettangolo->disegna($ad);
          
            echo $ad->output();
        ?>
    </body>
</html>

Questo script produrrà un output uguale a quello dell'immagine seguente, in cui i tre quadrati sovrapposti rosso, verde e blu sono ottenuti per mezzo dei tre casi appena esaminati.

Il risultato prodotto dallo script precedetne