Как я могу скрыть ужасные детали реализации (например, блоки 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, и просто обработка исключений в качестве другого уровня промежуточного программного обеспечения. Конечно, вы не можете сделать это, если вы используете исключения для потока управления, если только он не на полном уровне ответа на запрос.