У меня есть приложение C ++, разработанное в соответствии с классическим Model-View-Controller pattern . Модель модифицируется через интерфейс контроллера внешним источником с помощью шаблона команды . Команды представлены объектом Action (и его производными).
Теперь я хочу иметь возможность отменить изменения, но моя проблема в том, что в моем контроллере нет геттеров, только сеттеры. Это кажется вполне логичным, поскольку нет причин, по которым кто-то должен иметь возможность получать информацию о модели через контроллер. Таким образом, мои объекты Action не могут хранить состояние модели, поскольку они не имеют к ней доступа.
Как бы это решить? Я бы хотел, чтобы мое приложение было максимально расширяемым , и я не совсем уверен, какой вариант лучше для этого подходит. Методы, которые я до сих пор до сих пор:
- Установка методов получения в контроллере. Похоже, это идет вразрез с паттерном MVC.
- Задание для Движения указателя на Вид. Действие может затем либо:
- Используйте отдельные геттеры, чтобы получить состояние определенных элементов модели, которую нужно изменить.
- Используйте метод Memento , реализованный в Viewer.
Может быть, есть еще лучший способ сделать это? Прямо сейчас, чтобы быть лучшим вариантом, кажется, 2, подопция 1 (с подопцией 2, я вполне мог бы сохранить намного больше состояния, чем необходимо, чтобы отменить одно действие).
Примечание: Я знаю, что есть другие вопросы о том, как выполнить действие отмены. Тем не менее, единственные ответы, которые я нашел, содержали предложения использовать шаблон Command или Memento. Я знаю, что это наиболее вероятный путь. Я спрашиваю о том, как интегрировать это как можно более четко и расширяемо в дизайн MVC.
[Редактировать] Что мне не нравится в паттерне Memento, так это то, что он заставляет меня сохранять полное состояние. Допустим, моя модель представляет собой матрицу 1000x1000, а моя команда - ChangeOneValueAtLocation. Чтобы иметь возможность отменить свои изменения, объекту ChangeOneValueAtLocation нужно только сохранить предыдущее значение местоположения, которое он меняет, но это не представляется возможным с Memento. Чем больше моя модель, тем больше эта проблема.
[Редактировать 2] Еще одна проблема, с которой я столкнулся в Memento в конкретном случае этого приложения: для каждого метода объект Command может выполняться в модели, есть метод, который делает прямо противоположное (или может легко уговаривать сделать это). Вот почему я считаю ненужным хранить все состояние, в этом не должно быть необходимости, возвращать одну команду очень просто, единственная проблема - получить данные, чтобы это можно было сделать.
Кроме того, мне не нужно иметь возможность отменить определенную Команду, только самую верхнюю в моем стеке истории.