У меня есть цикл do ... while и блок try ... catch, который охватывает код, ориентированный на базу данных. Функция do ... while и try ... catch предназначена для предотвращения взаимных блокировок транзакций и очень хорошо справляется с обширным тестированием. Моя проблема сейчас заключается в избыточности кода. Я не могу найти способ развернуть функцию или метод, который выполняет do ... while и try ... перехватывает общий набор кода, ориентированного на базу данных, без использования «злой» команды eval. Я предполагаю, что это подходит для других сценариев проектирования программного обеспечения.
Это иллюстрирует, как я представляю метод с eval:
class Database {
public static function deadlockSafeTransaction($code) {
do {
// setup a condition
try {
// start transaction
eval($code); //evil
// commit transaction
}
catch(Exception $ex) {
// rollback transaction
// analyze exception for deadlock and adjust condition or rethrow exception
}
} while(condition);
}
}
Это иллюстрирует нежелательную практику кодирования, если бы я использовал описанный выше метод:
// code
Database::deadlockSafeTransaction("
// code - sometimes a lot of complicated code with other method calls and loops
");
// code
Я ищу решение, которое не включает использование команды eval.
После написания всего этого, я просто подумал о возможности фланкирования моего кода с помощью операторов включения:
include "do-try.php";
// database code
include "catch-while.php";
Но я ищу что-то более OOPish и менее хакерское. Я даже не знаю, сработает ли вышеперечисленное, и включение может повлечь за собой ненужные затраты производительности. Таким образом, проблема все еще требует расследования и обсуждения для лучшего решения.