Почему undo откатывает одно действие, а redo может применяться несколько раз?
Что проверяют
Заметите ли вы ложную предпосылку в вопросе. Отмена применяется многократно ровно так же, как повтор, если история хранит больше одного шага. Проверяют, как вы устроите историю команд и что произойдёт при ветвлении, а заодно готовы ли спорить с условием задачи.
Как отвечать
Сказать прямо: никакой встроенной асимметрии нет, описанное поведение это либо ограничение глубины истории, либо ошибка. Классическая модель это два стека:
undo: c1, c2, c3 redo: пусто- новое действие кладёт команду в стек отмены и очищает стек повтора;
- отмена снимает верх стека отмены, откатывает изменение и кладёт команду в стек повтора;
- повтор снимает верх стека повтора, применяет и возвращает команду обратно.
Оба действия работают столько раз, сколько элементов лежит в их стеке. Если отмена срабатывает ровно один раз, значит хранится один снимок в поле вместо стека, либо история сбрасывается при каждом изменении состояния.
Дальше уместно сравнить подходы: снимок состояния прост, но дорог по памяти, команда с парой операций дешевле, но требует честного обратного действия. И упомянуть склейку мелких правок ввода в одну команду по паузе, иначе отмена будет откатывать по одной букве.
Где спотыкаются
Принимают предпосылку на веру и сочиняют объяснение, почему так и должно быть. Гораздо сильнее выглядит встречный вопрос о том, что именно наблюдали, и предположение про глубину истории.
Забывают очищать стек повтора после нового действия. Команда, записанная для прежней ветки изменений, применяется к состоянию, для которого её никто не рассчитывал, и данные тихо портятся.
Мутируют объекты состояния вместо создания новых. Снимок хранит ссылку на тот же объект, поэтому откат формально проходит, а на экране ничего не меняется. Спасают неизменяемые структуры или честная глубокая копия.