que estoy tratando de implementar una función de deshacer/rehacer en mi aplicación, utilizando el Command Pattern. Estoy enfrentando un problemadeshacer/rehacer con eliminaciones en cascada
Para ilustrarlo, imaginemos que puede crear con mis perfiles de aplicaciones 2D (tantos como desee).
A partir de estos perfiles 2D, a continuación, puede crear una pieza 3D con diferentes atributos (nombre, color, escala, etc.).
+--------------+ +--------------+ +--------------+
| 2D profile A | | 2D profile B | | 2D profile C |
+--------------+ +--------------+ +--------------+
| | |
| +---------------+ +---------------+
| | 3D Part B | | 3D Part C |
| | Colour : blue | | Colour : grey |
| | Name : bibi | | Name : foo |
| | Scale : 33% | | Scale : 100% |
| +---------------+ +---------------+
+--------------+
| 3D Part A |
| Colour : red |
| Name : aaa |
| Scale : 50% |
+--------------*
Cuando se elimina un perfil, todas las piezas en 3D, que incorpora un en este perfil son de forma automática eliminan también (cuando un perfil está a punto de ser eliminado, un gerente de piezas en 3D es notificado y eliminará las piezas 3D obsoletos. Las vistas también son notificadas para actualizar la GUI).
Aquí es donde estoy frente a un problema: estoy escribiendo de deshacer/rehacer comandos para borrar un perfil 2D, que se ve algo como esto (pseudo-código):
virtual void redo()
{
m_pProfileList.remove(m_pProfile); // This will automatically delete all 3D parts relying on the deleted 2D profile
}
virtual void undo()
{
m_pProfileList.add(m_pProfile); // This will add the 2D profile, but the 3D Parts are lost
}
Como se puede ver en el código anterior, la eliminación del perfil 2D eliminará automáticamente todas las partes 3D dependiendo del perfil eliminado.
Pero cuando se hace deshacer, volver a agregar el perfil 2D a la lista no es suficiente: las piezas 3D se pierden.
¿Qué debo hacer? ¿Debería el comando deshacer/rehacer ser responsable de encargarse de la eliminación de las partes 3D (que en realidad es algo realizado por el administrador de partes 3d)? Esto significaría que el comando deshacer/rehacer también sería responsable de notificar a las vistas para actualizar la GUI.
O debería de deshacer/rehacer comandos crear una copia interna de todas las piezas en 3D que se borrarán y dejar que el gestor de parte 3d borrar las piezas 3D?
¿O hay otra solución mejor?
Gracias por su ayuda!