Предоставление обратной связи с пользователем во время длительного процесса и разделения пользовательского интерфейса / бизнес-логики - PullRequest
1 голос
/ 16 февраля 2009

Когда выполняется длительный процесс, рекомендуется предоставить пользователю обратную связь, например, обновить индикатор выполнения.

Некоторые часто задаваемые вопросы для библиотек GUI предлагают что-то вроде этого:

function long_running_progress()
    do_some_work()
    update_progress_bar()
    while finish
        do_some_work()
        update_progress_bar()
    end while
end function

В любом случае, мы знаем, что рекомендуется отделять код бизнес-логики от кода пользовательского интерфейса. В приведенном выше примере смешивается код пользовательского интерфейса внутри функции бизнес-логики.

Каков хороший метод для реализации функций на уровне бизнес-логики, прогресс которых можно легко отслеживать с помощью пользовательского интерфейса без смешивания слоев?

Приветствуются ответы на любые языки и платформы.

Ответы [ 3 ]

5 голосов
/ 16 февраля 2009

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

1 голос
/ 16 февраля 2009

Публикация - это отличный способ. Все зависит от платформы, как это делается. Однако, когда дело доходит до пользовательского опыта , необходимо учитывать и несколько моментов:

  • Не показывайте пользователю индикатор выполнения, если вы не знаете, как долго выполняется задание. Сколько времени осталось? Что значит на полпути? Лучше использовать функцию песочных часов (вращающиеся колеса, подпрыгивающие индикаторы выполнения и т. Д.).

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

  • Длительный прогресс всегда должен поддерживать пользователя с помощью escape, способ отменить запрос. Вы не хотите заблокировать пользователя на долгое время. Еще лучше обработать длительный запрос полностью в фоновом режиме и позволить пользователю вернуться, когда вернется результат.

1 голос
/ 16 февраля 2009

Если бы вы использовали парадигму MVC, вы могли бы сделать так, чтобы Модель публиковала свое текущее состояние прогресса в качестве свойства, Контроллер мог бы извлекать это каждые x секунд, а затем выводить его в представление. Это предполагает многопоточность, но я не уверен, если вы позволите.

...