Бизнес-логика для объектов с несколькими значениями – где разместить цикл?
-
20-09-2019 - |
Вопрос
... и как лучше всего обрабатывать обратную связь об успехе/неуспехе на уровне представления.
Варианты:
doBusinessLogic(things)
или
for (Thing thing : things) {
doBusinessLogic(thing)
}
Предполагая, что нам нужен уровень представления, который последовательно получает обратную связь об успехах/ошибках (т.из одной или нескольких операций над объектами значений), какой подход лучше всего?
Уточнение:
Обработка нескольких типов исключений, возникающих из вызова бизнес-логики на уровне представления, требует большого объема кода, а также вызывает проблемы с обслуживанием (вводятся новые исключения, о которых уровень представления не знает).Кажется, лучше, чтобы вызов бизнес-логики обрабатывал ошибки в объектах с несколькими значениями и «упаковывал» их, чтобы представление могло обрабатывать их согласованным образом.
Решение
Как насчет чего-то вроде вашего последнего предложения:
for (businessObject : businessObjects) { businessObject.doBusinessLogic() }
Идея состоит в том, чтобы поместить бизнес-логику в метод бизнес-объекта.Ваш уровень представления может циклически обходить все бизнес-объекты, сообщая каждому из них, что он должен делать свое дело.То, как каждый из них ведет свою деятельность, определяется логикой бизнес-объекта на бизнес-уровне.Вы можете обрабатывать ошибки и тому подобное, возвращая значения из метода doBusinessLogic или создавая исключения для неприятных ситуаций.
Если вы используете межбизнес-объектную логику (т. е. логику, которая работает более чем с одним бизнес-объектом), возможно, вы могли бы создать класс businessObjectManager, который мог бы иметь методы, которые принимают один или несколько бизнес-объектов и работают с ними.Таким образом, помещая объект менеджера на бизнес-уровень, вы по-прежнему сохраняете всю свою бизнес-логику на бизнес-уровне.
Другие советы
В конечном итоге я выбрал первый вариант и создал облегченный универсальный класс «пакета результатов», который инкапсулирует успехи и неудачи действия над набором объектов.Успех или неудача привязаны к соответствующему идентификатору объекта.
Пакет заполняется внутри каждого вызова бизнес-логики и возвращается на уровень представления.Исключения, возникающие в цикле бизнес-логики «выполнение действия над объектом», перехватываются, и соответствующий сбой добавляется в пакет результатов (с привязкой к идентификатору объекта).
Уровень представления имеет простой вспомогательный метод, который предоставляет пользователю обратную связь, содержащуюся в пакете результатов.
Это работает очень хорошо.
Я думаю, что выбранный вами подход лучше всего подходит для вашей системы.