У нас часто есть объекты, которые выполняют многоэлементные операции / задачи. Примером может быть обновление внутреннего состояния списка объектов на основе запроса файловой системы и чтение данных из найденных файлов. Эти вещи также часто выполняются долго и, как правило, выполняются в фоновых потоках (мы много работаем над Swing, но я думаю, что такого рода вещи будут применяться и к многоуровневым приложениям).
В операции такого рода вполне возможно, что часть операции потерпит неудачу (т.е. не сможет прочитать 5 или 6 из 5000 файлов, которые мы обрабатываем). В этом случае было бы неуместно выдавать исключение, но мы все же хотим предоставить пользователю обратную связь о том, что не произошло, и т. Д ...
Здесь мы всегда использовали специальные подходы (например, ведение журнала или операция возвращает список исключений), но я решил разобраться и действительно обдумать это.
Одной из мотивирующих концепций является валидация (у jgoodies хорошая реализация). Идея заключается в том, что при проверке значений в форме или структуре данных вы создаете объект ValidationResults, который может содержать объекты ValidationResult. Каждый ValidationResult имеет состояние (OK, WARN, ERROR), а также текст описания (и другие необходимые элементы).
Мне очень хочется просто использовать платформу проверки как есть для результатов задач.
Другой вариант - представить текущее состояние результата операции задачи как связанное свойство (возможно, используя список событий GlazedLists).
Мне было интересно, есть ли у кого-то еще какие-либо мнения / опыт в такого рода вещах, или какие шаблоны проектирования могли развиваться, чтобы справляться с долгосрочными задачами, которые могут иметь подзадачи, которые могут завершиться неудачей или не совсем завершиться идеально (т.е. состояние WARN)?
РЕДАКТИРОВАТЬ: разъяснение цели вопроса
Многие люди предлагают регистрировать проблемы и предлагать пользователю проверить с администратором. Чтобы немного прояснить проблему, рассмотрим приложение типа Eclipse. Если бы в процессе сборки были предупреждения или ошибки, а Eclipse просто выдавал диалоговое окно с сообщением об ошибке: «были проблемы, проверьте журналы», я думаю, что пользователь будет менее чем удовлетворен.
Предоставление пользователю списка текущих предупреждений и ошибок является гораздо более интерактивным решением и предоставляет пользователю механизм для быстрой оценки и решения проблем.
Два подхода, которые мы пробовали до сих пор, были:
- Регистрация и добавление диалогового окна в конце процесса
- Предоставление свойства, содержащего возникшие исключения
Мы пытаемся отойти от варианта 1 b / c взаимодействия с пользователем.
Вариант 2 выглядит для меня крайне неожиданно. Это, конечно, работает, но я пытаюсь найти хорошую стандартизированную методологию для решения этой ситуации.
Исключения хороши для подпрограмм, которые имеют сбои в "остановке мира" (подпрограмма либо завершается успешно, либо каким-либо образом завершается с ошибкой), а создание исключений является очень хорошим сквозным механизмом для обработки таких ситуаций.
Но когда подпрограмма не попадает в простую категоризацию «пройдено / не выполнено», все становится немного неясным - сама подпрограмма может частично преуспеть.
Итак, лучше ли передать «ProblemListener», в который мы сообщаем о проблемах? Или лучше, чтобы программа возвращала список проблем? Или объект выставил свойство проблем из последнего запуска подпрограммы?
Есть много потенциальных решений - мне интересно, есть ли у кого-нибудь опыт их применения, и нашли ли они наилучшую практику (и по каким причинам они принимают или отвергают данный подход)?