Как сделать самый чистый код при сообщении пользователю о прогрессе? - PullRequest
11 голосов
/ 18 ноября 2008

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

ReportProgress("Starting Task 1");
doTask1();
ReportProgress("Task 1 is done");

ReportProgress("Starting Task 2");
doTask2();
ReportProgress("Task 2 is done");

//etc... where report progress does some form of output to the user.

Хороший кодер во мне кричит "Должен быть более чистый путь!" Но я в тупике. Есть мысли?

РЕДАКТИРОВАТЬ :: Я ищу больше информации об архитектурной информации, а не о конкретной реализации. Код указан очень упрощенно.

Ответы [ 13 ]

0 голосов
/ 18 ноября 2008

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

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

0 голосов
/ 18 ноября 2008

К сожалению, я думаю, что лучший способ сделать это зависит от деталей - по крайней мере, какой язык вы используете. Например, в Python вы можете использовать менеджер контекста , чтобы разрешить написание такого кода:

with progress_report("Task 1"):
    do_task_1()

Это может, например, гарантировать, что «Задача 1 выполнена», даже если do_task_1 () вызывает исключение. Если вы хотите, вы можете обрабатывать исключения отдельно и печатать что-то другое, например «Задача 1 не выполнена» или «Задача 1 отменена».

0 голосов
/ 18 ноября 2008

Вы можете вызывать ReportProgress изнутри методов doTask, которые могут сделать его немного чище, вместо этого вы просто должны иметь:

doTask1();
doTask2();

Отчетность будет обрабатываться внутри этих методов.

Вы могли бы использовать АОП, но мой мозг кричит ПОЦЕЛУЙ !! (Держите это просто глупо) в этом случае. Если это просто простое представление чего-то более сложного, с чем вы имеете дело, AOP может быть вариантом.

...