Конструкция Switch в PHP - более точный способ определить приоритет?


У меня есть функция, которая принимает экземпляр контроллера, метода и параметров (это для небольшого эксперимента в MVC, я работаю на). Цель функции состоит в том, чтобы выполнить метод контроллера с заданными параметрами.

Однако, есть несколько предостережений. Во-первых, если контроллер имеет метод "маршрутизатор", он будет вызывать, что вместо метода, который был принят. Во-вторых, если какой-либо из контроллера "аннотации" возвращает ответ, который будет также переопределить метод. Затем, если эти случаи не удастся, то возвращать ответ фактического метода контроллера передают.

Это выглядит так:

    switch (true)
    {
        // Router methods get first priority!
        case ($controller->using_router):
            $response = call_user_func_array(array($controller, 'router'));
            break;

        // Annotation responses take precedence over method responses because they are often used for authentication.
        case ( ! is_null($response = Annotation\Runner::run(Annotation\Extractor::extract($controller, $method)))):
            break;

        // No router or annotation responses... we're ready to run the method!
        default:
            $response = call_user_func_array(array($controller, $method), $parameters);
    }

По некоторым причинам, это просто чувствует себя грязным. Мне не нравится перерыв после проверки на аннотацию ответ. Но, я не уверен, что какой-либо другой способ реагирования на "приоритет".

Есть ли лучший способ?



860
5
задан 10 марта 2011 в 05:03 Источник Поделиться
Комментарии
2 ответа

Это, конечно, позор переключатель заявлении.

То, что вы должны использовать это , если...еще, если... группы:

$response = null; //initialize
if ( $controller->using_router)
{
$response = $controller->router();
}
else
{
$response = Annotation\Runner::run(Annotation\Extractor::extract( $controller, $method ) );
if ( is_null( $response )
{
$response = call_user_func_array( array( $controller, $method ), $parameters );
}
}

Примечание: этот код течет в читаемой форме. Ответ находится, если контроллер использует маршрутизатор, ответ находится на выходе $контроллер->маршрутизатор(), в противном случае ответ имеет значение извлеченные методом регулятора.

Если это имеет значение null, ответ, наконец, установить с любой $контроллер->$способ(...) производит.

Код должен всегда поток в удобном для восприятия образом (если это сжатый, запутывание, или закодированных).

10
ответ дан 10 марта 2011 в 06:03 Источник Поделиться

Код почти всегда лучше, когда вы возвращаете значение, а также значение, возвращаемое позже (imnsho). Если вы просто скажете

if ( $controller->using_router) {
return $controller->router();
}

вы значительно упростило. Остальное зависит от того, является ли следующий результат имеет значение null, так что вам надо будет как-то удержать его, но ты уже смотришь проще код.

Я не думаю, что оператор switch-это то, что вы хотите здесь. Его можно подогнать, но это не совсем подходит или то, что вы пытаетесь сделать.

5
ответ дан 10 марта 2011 в 06:03 Источник Поделиться