Разработка системы “Многоуровневая система отмены”

Истории успеха

Многоуровневая отмена: Как мы избежали хаоса в разработке


Разработка программного обеспечения – это всегда путешествие, полное неожиданных поворотов и изменений. Иногда мы с энтузиазмом начинаем реализовывать новую функцию, а потом понимаем, что она не вписывается в общую концепцию или вызывает нежелательные побочные эффекты. В такие моменты незаменимой становится система отмены действий. Но что, если отмена всего одна? Это похоже на езду на велосипеде с одним тормозом – рискованно и неудобно; В нашей команде мы столкнулись с этой проблемой и разработали многоуровневую систему отмены, которая спасла нас от множества неприятностей.

Зачем нужна многоуровневая отмена?


Представьте себе графический редактор, где вы можете отменить только последнее действие. Вы случайно удалили половину изображения? Что ж, придется начинать все сначала! Многоуровневая отмена позволяет пользователям вернуться на несколько шагов назад, что значительно повышает удобство использования и снижает риск потери данных. Но не только пользователи выигрывают от этой функции. В процессе разработки многоуровневая отмена помогает нам экспериментировать с новыми идеями, не опасаясь необратимых последствий. Мы можем смело вносить изменения в код, зная, что всегда можем вернуться к предыдущей версии.

Проблемы одноуровневой отмены


  • Ограниченность: Возможность отменить только последнее действие.
  • Риск потери данных: Ошибочные действия могут привести к значительным потерям.
  • Снижение продуктивности: Необходимость начинать заново при ошибках.

Преимущества многоуровневой отмены


  1. Гибкость: Возможность вернуться на несколько шагов назад.
  2. Безопасность: Снижение риска потери данных.
  3. Улучшение продуктивности: Возможность экспериментировать и быстро исправлять ошибки.

Как мы реализовали многоуровневую отмену


Мы начали с изучения существующих решений и паттернов проектирования. В итоге мы выбрали подход, основанный на паттерне Command. Суть этого паттерна заключается в том, что каждое действие пользователя оборачивается в объект-команду. Этот объект содержит всю необходимую информацию для выполнения и отмены действия. Мы создали стек команд, в котором хранятся все выполненные действия. Когда пользователь нажимает кнопку «Отменить», мы просто извлекаем последнюю команду из стека и вызываем ее метод «undo». Аналогично, для «Вернуть» мы извлекаем команду из стека «отмененных» команд и вызываем ее метод «execute».

Используемые технологии и инструменты


При реализации многоуровневой отмены мы использовали следующие технологии:

  • Язык программирования: C++
  • Система контроля версий: Git
  • Среда разработки: Visual Studio

Детали реализации


Для хранения истории действий мы использовали структуру данных «стек». Каждая команда, представляющая собой действие пользователя, реализует интерфейс с двумя методами: execute и undo. Метод execute выполняет действие, а метод undo отменяет его. При каждом действии пользователя создается объект команды, который помещается в стек. При отмене действия команда извлекается из стека, вызывается метод undo, и команда перемещается в отдельный стек «отмененных» команд. При возврате действия происходит обратный процесс.

«Единственный способ делать великие дела – это любить то, что ты делаешь.» ⸺ Стив Джобс

Проблемы, с которыми мы столкнулись


Реализация многоуровневой отмены оказалась не такой простой задачей, как мы изначально предполагали. Мы столкнулись с несколькими проблемами, которые потребовали творческого подхода и усердной работы. Одной из основных проблем была сериализация и десериализация объектов команд. Нам нужно было обеспечить возможность сохранения состояния системы отмены при закрытии и повторном открытии приложения. Для этого мы использовали механизм сериализации, который позволял преобразовывать объекты команд в поток байтов и обратно. Другой проблемой была управление памятью. Стек команд мог быстро расти, что приводило к потреблению большого количества памяти. Чтобы решить эту проблему, мы реализовали механизм лимитирования количества команд в стеке. Когда стек достигал определенного размера, мы начинали удалять самые старые команды.

Сериализация и десериализация объектов команд


Сериализация объектов команд – это процесс преобразования объектов в поток байтов, который можно сохранить в файл или передать по сети. Десериализация – это обратный процесс, который восстанавливает объект из потока байтов. Мы использовали библиотеку для сериализации, которая позволяла нам легко преобразовывать объекты команд в поток байтов и обратно. Важно было обеспечить правильную обработку исключений и ошибок при сериализации и десериализации, чтобы избежать потери данных.

Управление памятью при большом количестве отмен


Стек команд мог расти очень быстро, особенно при выполнении сложных операций. Чтобы избежать переполнения памяти, мы реализовали механизм лимитирования количества команд в стеке. Когда стек достигал определенного размера, мы начинали удалять самые старые команды. Мы также реализовали механизм автоматической очистки стека при закрытии приложения.

Тестирование и отладка


После реализации системы многоуровневой отмены мы провели тщательное тестирование и отладку. Мы создали множество тестовых сценариев, которые охватывали все возможные варианты использования. Мы также привлекли к тестированию других разработчиков и пользователей, чтобы получить обратную связь и выявить возможные ошибки. Одной из самых сложных задач было отладка ситуаций, когда отмена действия приводила к непредсказуемым последствиям. В таких случаях нам приходилось тщательно анализировать код и логи, чтобы найти причину ошибки.

Создание тестовых сценариев


Мы создали множество тестовых сценариев, которые охватывали все возможные варианты использования системы многоуровневой отмены. Эти сценарии включали в себя:

  • Отмену и возврат простых действий
  • Отмену и возврат сложных действий, включающих несколько объектов
  • Отмену и возврат действий, влияющих на состояние нескольких компонентов приложения
  • Отмену и возврат действий в условиях многопоточности

Привлечение пользователей к тестированию


Мы привлекли к тестированию системы многоуровневой отмены других разработчиков и пользователей. Это позволило нам получить обратную связь и выявить возможные ошибки, которые мы не заметили при самостоятельном тестировании. Мы организовали бета-тестирование, в рамках которого пользователи могли использовать новую версию приложения и сообщать нам о найденных ошибках.

Результаты и выводы


Повышение удобства использования


Многоуровневая система отмены значительно повысила удобство использования приложения. Пользователи получили возможность легко исправлять ошибки и экспериментировать с новыми функциями. Это привело к увеличению лояльности пользователей и повышению их удовлетворенности.

Снижение риска потери данных


Многоуровневая система отмены значительно снизила риск потери данных. Пользователи могли легко отменить ошибочные действия и восстановить предыдущее состояние приложения. Это особенно важно для приложений, работающих с большими объемами данных.

Подробнее
LSI Запрос LSI Запрос LSI Запрос LSI Запрос LSI Запрос
Реализация Undo Redo Паттерн Command Отмена Многоуровневая Отмена C++ История изменений в приложении Архитектура системы отмены
Сохранение состояния отмены Лимитирование истории отмены Тестирование системы Undo Обработка ошибок при отмене Производительность системы отмены
Оцените статью
Цель и Порядок