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

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

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

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

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

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

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


person Manuel Ceron    schedule 16.02.2009    source источник


Ответы (3)


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

person sharptooth    schedule 16.02.2009

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

person vanja.    schedule 16.02.2009

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

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

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

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

person haqwin    schedule 16.02.2009