Как я могу скрыть ужасные детали реализации (например, блоки try/catch)?

Я добавляю обработку исключений в мой код PHP. Кажется, что в итоге я получаю много разреженных блоков, которые выполняют обработку исключений и по своей громоздкости скрывают фактический производственный код, который выполняется. Например:

function loadProduct($id)
{
    $product = new ProductRecord();

    try 
    {
        $data = $product->loadFromDatabase($id);
    }
    catch (\BadFunctionCallException $e)
    {
        $error = true;
    }        

    return $data;
}

Фактическая полезная нагрузка вышеуказанной функции - возвращение данных $. Без обработки исключений это может быть двухстрочная функция:

function loadProduct($id)
{
    $product = new ProductRecord();
    return $product->loadFromDatabase($id);
}

Один из способов скрыть это использовать Factory Method, такие как:

function loadProduct($id)
{
    $product = new ProductRecord();
    $factory = new ProductFactory($product);
    return $factory->loadProduct($id);  //inside loadProduct I can put try/catch block
}

Здесь я добавляю совершенно новый (фабричный) класс и еще одну строку кода в свою функцию, чтобы скрыть обработку исключений. С должной тщательностью я думаю, что это сработает и все равно будет хорошо выглядеть (т.е. я могу инициализировать свою фабрику внутри конструктора, таким образом, удаляя ее из кода уровня функции, так что это может быть хорошим вариантом). Но так ли это лучше?

Другими словами, мой вопрос - как я могу использовать Исключительную Обработку в своем коде, не погружая мою фактическую полезную нагрузку в редкость блоков try/catch?

2 ответа

Решение

Вот пример, как решить вашу проблему с Go! Рамки АОП и Around совет:

/**
 * This advice intercepts an execution of some methods
 *
 * Logic is pretty simple: we wrap an original method with our advice
 * and catch all exceptions in one place.
 *
 * @param MethodInvocation $invocation Invocation
 *
 * @Around("execution(public SomeClassName->*(*)")
 */
public function aroundPublicMethods(MethodInvocation $invocation)
{
    try {
        $result = $invocation->proceed(); // invoke original method
    } catch (\Exception $e) {
        $result = $e; // exception will be returned as a result to method call
    }

    return $result;
}

Вот и все.

Одним из способов может быть AOP, другим может быть использование IOC и ядра, подобного промежуточному программному обеспечению, например StackPHP, и просто обработка исключений в качестве другого уровня промежуточного программного обеспечения. Конечно, вы не можете сделать это, если вы используете исключения для потока управления, если только он не на полном уровне ответа на запрос.

Другие вопросы по тегам