Por ejemplo, hay API remota con las siguientes llamadas:Diseño/Arquitectura pregunta: reversiones con servicios remotos
getGroupCapacity(group)
setGroupCapacity(group, quantity)
getNumberOfItemsInGroup(group)
addItemToGroup(group, item)
deleteItemFromGroup(group, item)
La tarea es añadir algún elemento a algún grupo. Los grupos tienen capacidad. Primero debemos verificar si el grupo no está lleno. Si es así, aumente la capacidad, luego agregue el artículo. Algo como esto (por ejemplo, la API está expuesta con jabón):
function add_item($group, $item) {
$soap = new SoapClient(...);
$capacity = $soap->getGroupCapacity($group);
$itemsInGroup = $soap->getNumberOfItemsInGroup($group);
if ($itemsInGroup == $capacity) {
$soap->setGroupCapacity($group, $capacity + 1);
}
$soap->addItemToGroup($group, $item);
}
Ahora lo que si no addItemToGroup (artículo era malo)? Necesitamos revertir la capacidad del grupo.
Ahora imagine que tiene que agregar 10 elementos para agrupar y luego configurar elementos agregados con algunas propiedades, y todo esto en una sola transacción. Eso significa que si falla en algún lugar en el medio debe revertir todo al estado anterior.
¿Es posible sin un montón de IF y código de espagueti? ¿Cualquier decisión de biblioteca, marco, patrón o arquitectura que simplificará dichas operaciones (en PHP)?
UPD: SOAP es sólo un ejemplo. La solución debería adaptarse a cualquier servicio, incluso TCP sin procesar. El punto principal de la pregunta es cómo organizar el comportamiento transaccional con la API subyacente no transaccional.
UPD2: Supongo que este problema es bastante similar en todos los lenguajes de programación. Entonces, cualquier respuesta es bienvenida, no solo PHP.
¡Gracias de antemano!
Lo siento, no puedo entender cómo esto ayudará. ¿Dónde debería detectar esas excepciones y colocar el código de reversión? Ejemplo, tal vez? :-) Gracias – Qwerty