отменить / повторить с каскадным удалением - PullRequest
9 голосов
/ 12 января 2009

Я пытаюсь внедрить функцию отмены / возврата в свое приложение, используя Шаблон команды . У меня проблема.

Чтобы проиллюстрировать это, давайте представим, что вы можете создавать с моим приложением 2D-профили (сколько угодно).

Из этих 2D профилей вы можете затем создать трехмерную деталь с различными атрибутами (имя, цвет, масштаб и т. Д.).

+--------------+              +--------------+      +--------------+
| 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%  |
+--------------*

При удалении профиля все 3D-детали, которые построены на этом профиле, также автоматически удаляются (когда собирается удалить профиль, диспетчер 3D-деталей уведомляется и удаляет устаревшие 3D-детали. Представления также уведомляются. обновить графический интерфейс).

Здесь я сталкиваюсь с проблемой: я пишу команду отменить / повторить для удаления 2D-профиля, который выглядит примерно так (псевдокод):

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
}

Как видно из кода выше, удаление 2D-профиля автоматически удалит все 3D-детали, основанные на удаленном профиле.

Но при отмене повторного добавления 2D-профиля в список недостаточно: 3D-детали теряются.

Что мне делать? Должна ли команда undo / redo отвечать за удаление 3D-деталей (что на самом деле делает менеджер 3D-деталей)? Это будет означать, что команда undo / redo также будет ответственна за уведомление представлений об обновлении GUI.

Или команда undo / redo должна создать внутреннюю копию всех трехмерных деталей, которая будет удалена, и позволить менеджеру трехмерных деталей удалить трехмерные детали?

Или есть другое лучшее решение?

Спасибо за вашу помощь!

1 Ответ

1 голос
/ 12 января 2009

Вы хотите немного изменить это: Шаблон Memento . Вы сохраняете снимки либо вашего полного дерева объектов, либо просто всех различий при каждом изменении. Вооружившись этой последовательной историей изменений, вы можете затем перемещаться назад и вперед по командам к своему сердцу, не теряя зависимых объектов.

...