vi sottopongo un problema che ho, vorrei ricavarne una classe ereditabile utilizzabile come design pattern. Leggetevi questo codice:
Se dobbiamo utilizzare ripetutamente la classe Pippo e i relativi metodi, siamo costretti a fare così, occupando un casino di linee di codice ripetitivo
Codice PHP:
<?php
class Pippo
{
function _1(){echo "1";}
function _2(){echo "2";}
function _3(){echo "3";}
}
class Topolino{function add(){foreach(func_get_args() as $o) get_class($o);}}
$x=0;
$pippo[$x] = new Pippo();
$pippo[$x]->_1();
$pippo[$x]->_2();
$pippo[$x]->_3();
$x++;
$pippo[$x] = new Pippo();
$pippo[$x]->_1();
$pippo[$x]->_2();
$pippo[$x]->_3();
$x++;
$pippo[$x] = new Pippo();
$pippo[$x]->_1();
$pippo[$x]->_2();
$pippo[$x]->_3();
$altro = new Topolino();
$altro->add($pippo[0],$pippo[1],$pippo[2]);
?>
la prima soluzione, senza particolari sbattimenti, è questa:
Codice PHP:
<?php
class Pippo2
{
function _1(){echo "1";return $this;}
function _2(){echo "2";return $this;}
function _3(){echo "3";return $this;}
}
class Topolino2{function add(){foreach(func_get_args() as $o) gettype($o) . "
";}}
for($x=0;$x<3;$x++)
$pippo2[$x] = new Pippo2();
$altro = new Topolino2();
$altro->add($pippo2[0]->_1()->_2()->_3(), $pippo2[1]->_1()->_2()->_3(),$pippo2[2]->_1()->_2()->_3());
?>
quante righe di codice abbiamo risparmiato?
con return $this; abbiamo la possibilità di lavorare sulla stessa riga, chiamando metodo su metodo.
Cosa voglio ottenere? costruttore e metodi sulla stessa linea:
$top = new Topolino()->add();
Codice che chiaramente in php non va... adesso non so se questa sintassi funzioni in java c c#, ma ad occhio dovrebbe funzionare, in quanto il costruttore dovrebbe ritornare proprio l'oggetto (return $this)
un bel design pattern potrebbe essere questo:
$topolinoObject = Topolino::newInstance()->add(Pippo::newInstance()->_1()->_2()->_3(),
Pippo::newInstance()->_1()->_2()->_3(),
Pippo::newInstance()->_1()->_2()->_3());
ma sarà realizzabile?
a voi, phpespertoni