Ich versuche, eine Funktion zum Rückgängigmachen/Wiederherstellen in meine Anwendung zu implementieren, mit der Command Pattern. Ich stehe vor einem Problem.Undo/Redo mit kaskadierenden Löschungen
Um es zu veranschaulichen, lassen Sie uns vorstellen, dass Sie mit meiner Anwendung 2D-Profile erstellen können (so viele wie Sie möchten).
Aus diesen 2D-Profilen können Sie dann ein 3D-Teil mit verschiedenen Attributen (Name, Farbe, Maßstab usw.) erstellen.
+--------------+ +--------------+ +--------------+
| 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% |
+--------------*
Wenn ein Profil gelöscht wird, werden alle 3D-Teile, die ein auf diesem Profil gebaut sind zu automatisch gelöscht (wenn ein Profil über gelöscht werden soll, ein 3D-Teil-Manager benachrichtigt wird und die veralteten 3D-Teile löschen. Ansichten werden auch benachrichtigt, um die GUI zu aktualisieren).
Dies ist, wo ich ein Problem bin vor: Ich habe die Undo ich schreibe/Befehl Redo für ein 2D-Profil zu löschen, die so etwas wie dieses (Pseudo-Code) sieht:
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
}
Wie können Sie Wenn Sie im obigen Code sehen, werden beim Entfernen des 2D-Profils automatisch alle 3D-Teile gelöscht, die auf dem entfernten Profil basieren.
Aber wenn Sie Rückgängig machen, ist das erneute Hinzufügen des 2D-Profils zur Liste nicht genug: die 3D-Teile sind verloren.
Was soll ich tun? Sollte der Undo/Redo-Befehl dafür verantwortlich sein, das Löschen der 3D-Teile zu übernehmen (was wird eigentlich vom 3D-Part-Manager gemacht)? Dies würde bedeuten, dass der Undo/Redo-Befehl auch dafür verantwortlich wäre, die Ansichten zu benachrichtigen, um die GUI zu aktualisieren.
Oder sollte der Undo/Redo-Befehl eine interne Kopie aller 3D-Teile erstellen, die gelöscht werden und der 3D-Teile-Manager die 3D-Teile löschen lassen?
Oder gibt es eine andere bessere Lösung?
Danke für Ihre Hilfe!