Нет встроенной языковой функции, которая позволяла бы отменять все, что изменилось в функции, но есть шаблоны, которые созданы в других, чтобы помочь в подобных ситуациях.
Один из вариантов, который у вас есть, это шаблон сувенира , где вы сохраняете копию предыдущего состояния, так что вы всегда можете вернуться к нему, но одним из недостатков этого является увеличение использования памяти для сохранения всего избыточного состояния, или если вы сохраняете состояние на диске, это приводит к снижению производительности при чтении / записи.
Другой вариант - использование шаблона команды , где каждая команда знает, как отменить себя, таким образом вам не нужно сохранять предыдущее состояние, но вам нужно отслеживать историю команд, что это означает что если у вас много состояний, тогда лучше использовать шаблон команды, потому что вам не нужно сохранять предыдущее состояние, но у вас будет обратная функция, которая знает, чтобы отменить изменения, внесенные этой командой, в то время как если у вас есть только несколько строк, тогда лучше использовать шаблон памяти, особенно если вам нужно разрешить отмену действий даже после того, как приложение будет убито и запущено снова.
Хороший пример использования шаблона команды для отмены с объяснением можно найти здесь .