Существуют различные шаблоны взаимодействия с пользователем, которые вы можете использовать в зависимости от домена приложения, стиля работы и предпочтений ваших пользователей. По моему опыту, некоторые люди предпочитают свободно вводить данные в любое место на экране без какой-либо проверки или механизма проверки, блокирующего их, и это происходит только тогда, когда они наконец нажимают «Ввод» или «Сохранить». В этой модели полезны сообщения о состоянии, сигнализирующие о потенциальных проблемах с только что введенной информацией (например, «Дата окончания не может быть после даты начала»), но они должны быть только информационными и никогда не модальными. Такой подход обеспечивает очень плавное взаимодействие и длительное «время диалога» с машиной.
В качестве альтернативы, вы можете использовать подход «действовать и блокировать», подобный тому, который вы описываете, когда система предотвращает все дальнейшие взаимодействия после каждого действия, которое выполняет пользователь. Это полезно, если есть четкая последовательность действий, которые нужно выполнить (не как заполнение формы, где вы можете начать где угодно), если они занимают относительно много времени (дольше, чем ввод нескольких символов в текстовом поле!), И если зависимости между одним действием и следующим являются критическими (то есть одно действие не может быть выполнено, если предыдущее не было проверено). В этом случае рекомендуется использовать схему «действовать и заблокировать». Это надежно и потенциально уменьшает количество ошибок, если хорошо реализовано. В современных графических интерфейсах, где многопоточная поддержка легко доступна, вы можете просто заблокировать окно, в котором выполняются действия; Кроме того, вы можете заблокировать все приложение. Это не так элегантно, но обычно проще в разработке. В любом случае, информационное сообщение необходимо, и какой-либо индикатор выполнения настоятельно рекомендуется.
Редактировать. По вопросам имплементации я бы создал класс ModalInteractor
на своем уровне представления (GUI) и создал бы объект этого класса всякий раз, когда я хочу начать новое модальное взаимодействие с пользователем. Этот класс имеет следующие области повторной ответственности: (a) блокировка и разблокировка соответствующих элементов пользовательского интерфейса, (b) сигнализация прогресса и (c) управление отменой. Вы можете легко определить, какие методы свойств вам понадобятся для каждой из этих областей. Семантически, ModalInteractor
является частью логики, которая управляет или управляет вашим GUI («контроллер», некоторые скажут). Всякий раз, когда пользователь нажимает кнопку, которая запускает длительный процесс, создайте новый объект ModalInteractor
и передайте ссылку на текущее окно в конструкторе. Сконфигурируйте объект с несколькими делегатами, чтобы он знал, какой метод вызывать, чтобы начать длительный процесс, какие методы в окне вызывать для уведомления о ходе выполнения и на какое событие реагировать, когда пользователь нажимает Cancel
.
Надеюсь, это поможет.