Такой вопрос. Есть отчёт, пусть будет отчёт ордеров. Клиент может получить его в 3 вариантах: агрегированный маленький отчетик в виде json. Детальный в виде CSV. Такой же детальный в виде екселя.
Отчёт строится так: сервимс возвращает курсор типа Iterable<Order> orders. Эти orders передаются в builder и тот начинает строить. Итнрируетсчя по курсору и строит отчёт. Но для каждого вида строит по разному.
Для json, на каждом шаге итерации просто высчитываются данные каждой записи, и накапливаются. Когда цикл закончился, из данных формируется отчёт, типа всего столько записей, успешных столько, не успешных столько и т.д
Для CSV и екселя работает точно такой же цикл, точно так же высчитывается по тем же формулам суммарный агрегированный отчетик, но в дополнение ещё и по каждой записи, и каждая запись пишется в сам отчёт.
И тут проблема. Я не могу построить весь отчёт и вернуть его билдером. Я сразу пишу его в httpResponse.outputStream. тоесть метод у меня возвращает void а в первом случае возвращает объект, который потом преобразуется в json. Поэтому сейчас есть 3 класса в которых один и тот же алгоритм, и в то же время разный. Пробовал выделять абстрактные методы но не ложиться на задачу.
Кароче написал много, возможно сумбурно, вопрос такой если совсем не понятно, вы делали такое? Один и тот же отчёт вернуть в разных форматах? Как строили архетиктур? Какой класс за что отвечал?