Once in a while I’m stumbling on switch statements during a Code Review session.
I would like to find a more elegant way of this code
....
$istannceOfClass = $repository->loadFoo();
switch($istannceOfClass)
{
case $istannceOfClass instanceOf derivedClassAB:
$istannceOfClass->callA();
$istannceOfClass->callB();
break;
case $istannceOfClass instanceOf derivedClassCD:
$istannceOfClass->callC();
$istannceOfClass->callD();
break;
case $istannceOfClass instanceOf derivedClassEF:
$istannceOfClass->callE();
$istannceOfClass->callF();
break;
}
I thought about improve the code. could the anonymous class be used? I can not change the hierarchy and subclasses of $istannceOfClass and $istannceOfClass itself.
an attempt: to improve, correct, throw I used anonymouse for convenience. Code that can not be changed
interface baseclass { }
class ab implements baseclass
{
public function callA()
{
return "<br>class ab Call A";
}
public function callB()
{
return "<br>class ab Call B";
}
}
class cd implements baseclass
{
public function callC()
{
return "<br>class cd Call B";
}
public function callD()
{
return "<br>class cd Call C";
}
}
New code for refactor first common interface with all methods
interface commonABCDEF
{
public function callA();
public function callB();
public function callC();
public function callD();
public function callE();
}
second abstract class for default behaviour
class abstractCommonAbcdef implements commonABCDEF
{
//common behavior
public function callA() { return '<br>default A'; }
public function callB() { return '<br>default B'; }
public function callC() { return '<br>default C'; }
public function callD() { return '<br>default D'; }
public function callE() { return '<br>default E'; }
//abstract public function run();
}
adapter for case 1 of switch
$abOverride = new class(new ab()) extends abstractCommonAbcdef
{
public function __construct(baseclass $abcde)
{
$this->abcde = $abcde;
}
public function callA()
{
return $this->abcde->callA();
}
public function callB()
{
return $this->abcde->callB();
}
public function run()
{
}
};
....
final call al method
$rightClass = new class($abOverride)
{
public function __construct(abstractCommonAbcdef $abcommonABCDEF)
{
$this->abcommonABCDEF = $abcommonABCDEF;
}
public function getBo() {
return $this->abcommonABCDEF;
}
};
echo $rightClass->getBo()->callA();
echo $rightClass->getBo()->callB();
echo $rightClass->getBo()->callC();
echo $rightClass->getBo()->callD();