Hello. I am wondering why does \Doctrine\Common\Collections\Expr\ExpressionVisitor::dispatch restricts $expr to be instance of predefined classes.
Doesn't it violate key principles of visitor pattern which leverage polymorphism and double dispatch in order to avoid such hard-coding of instanceof checks.
public function dispatch(Expression $expr)
{
switch (true) {
case $expr instanceof Comparison:
return $this->walkComparison($expr);
case $expr instanceof Value:
return $this->walkValue($expr);
case $expr instanceof CompositeExpression:
return $this->walkCompositeExpression($expr);
default:
throw new RuntimeException('Unknown Expression ' . get_class($expr));
}
}
CMIIW, foregoing code can be replaced with single line like this:
public function dispatch(Expression $expr)
{
return $expr->visit($this);
}
Moreover, this method seems useless to me as we can (and should) call visit directly in the client code. If not, then what is the reason of Expression interface and implementations of visit method if those are not used at all?
Hello. I am wondering why does
\Doctrine\Common\Collections\Expr\ExpressionVisitor::dispatchrestricts$exprto be instance of predefined classes.Doesn't it violate key principles of visitor pattern which leverage polymorphism and double dispatch in order to avoid such hard-coding of
instanceofchecks.CMIIW, foregoing code can be replaced with single line like this:
Moreover, this method seems useless to me as we can (and should) call
visitdirectly in the client code. If not, then what is the reason ofExpressioninterface and implementations ofvisitmethod if those are not used at all?