一种方法,仅根据param是true还是false来抛出异常。糟糕的编程?

时间:2014-01-18 12:09:51

标签: php oop

直截了当。

interface DispatcherInterface {

    /**
     * @param RouteInterface $route
     * @return ResponseInterface
     * @throws InvalidRouteException
     */
    public function dispatch(RouteInterface $route);

}

正如您所看到的,上面的方法会抛出InvalidRouteException,因为它会验证控制器是否存在,操作是否存在于控制器类等中。

然后我需要将内部方法设为公开:

/**
 * @param RouteInterface $route
 * @throws InvalidRouteException
 */
private function verifyRoute(RouteInterface $route);

所以现在我可以做的应用程序:

$route = $this->router->route( $request->getUri() );

try { 
    $this->dispatcher->verifyRoute($route);
    // Check if the user has access to this page/controller/action
    $response = $this->dispatcher->dispatch($route);
}
catch(InvalidRouteException $ex) {
    // Error 404
}

由于路线已经过验证,dispatch(RouteInterface $route)方法不再需要运行verifyRoute(RouteInterface $route)方法,因此不会抛出InvalidRouteException

我希望dispatch(RouteInterface $route)方法在API中有选项来验证提供的路由或跳过验证部分。

该方法将成为:

/**
 * @param RouteInterface $route
 * @param bool $verifyRoute
 * @return ResponseInterface
 * @throws InvalidRouteException if $verifyRoute = true
 */
public function dispatch(RouteInterface $route, $verifyRoute);

我认为我没见过像这样的东西:

@throws InvalidRouteException if $verifyRoute = true

在之前的API文档中,我有点不确定这是否是错误的编程?

如果我在Java中正确地记得一个方法要么抛出异常,要么不抛出异常,两者之间没有,所以这增加了我对我想要做的事情的怀疑。

1 个答案:

答案 0 :(得分:1)

  

方法抛出异常或不抛出异常

嗯,几乎没有类似的方法;)通常,方法会根据逻辑和条件抛出异常。在您的情况下,如果verifyRoute == true 并且路由无效,则会抛出异常。我假设如果verifyRoute == true并且路由有效,则抛出异常 not

@throws条目表示方法可以抛出某个异常。你这么说的时候 verifyRoute == false它不会抛出该异常。但通常,您的方法可以抛出该异常。您可能希望记录verifyRoute控制方法是否验证路由,如果为false,则阻止InvalidRouteException异常。

然后,依靠调用者知道路由是否有效似乎是糟糕的设计。您应该重新处理类/接口以获得优化的性能,而无需调用者传递路由是否已知有效。