Una pequeña introducción:Programación y transacciones orientadas a objetos
La clase contiene campos y métodos (permítanme omitir propiedades esta vez).
Los campos representan un estado de la clase.
Los métodos describen comportamiento de la clase.
En una clase bien diseñada, un método no cambiará el estado de la clase si arroja una excepción, ¿verdad? (En otras palabras, pase lo que pase, el estado de la clase no debe ser dañado)
Pregunta:
¿Existe un marco, un patrón de diseño, mejores prácticas o un lenguaje de programación para llamar a una secuencia de métodos en una transaccional estilo, para que el estado de cualquiera de las clases no se modifique (en caso de excepción), o todo tenga éxito?
ej .:
// the class foo is now in the state S1
foo.MoveToState2();
// it is now (supposed to be) in the state S2
foo.MoveToFinalState();
// it is now (supposed to be) in the state, namely, S3
Sin duda, una excepción podría ocurrir tanto en MoveToState2()
y MoveToFinalState()
. Pero desde este bloque de código, quiero que la clase foo
esté en el estado S1 o S3.
Este es un escenario simple con una sola clase involucrada, no if
, no while
, sin efectos secundarios, pero espero que la idea sea clara.
Como digo en mi publicación, el recuerdo se usa más en un entorno de interfaz gráfica de usuario, para persistencia y deshacer/rehacer. Aunque el concepto básico es el mismo (crear otra clase que represente el estado) no debe transitar al nuevo estado hasta que sea completamente seguro hacerlo. Eso sugiere intentar crear el nuevo estado, y solo si este paso tiene éxito, cambiar el estado en el nuevo. – fabrizioM