После анализа приложения оказалось, что в нём данные идут следующим образом: сначала читаются строки из одной таблицы, проводится их первичная валидация, строки объединяются по специальному признаку, на группе строк проводится валидация, группа строк анализируется и строится граф объектов, во время построения опять же проводится валидация, итоговый граф опять валидируется и результат записывается в БД.
Подумав я решил применить знакомый из Unix-а принцип конвеера:
RowLoader -[Row]-> RowValidator -[Row]-> RowGrouper -[RowGroup]-> RowGroupValidator -[RowGroup]-> BusinessObjectBuilder -[BusinessObject]-> BusinessObjectValidator -[BusinessObject]-> BusinessObjectSaver
На каждом этапе валидации, при невалидном входном объекте на выход ничего не подаётся, иначе объект проходит без изменения.
Для этого был сделан мини-фреймворк:
interface Receiver<T> {
void receive(T obj);
void receiveEnd();
}
interface Destination<T> {
void send(T obj);
void sendEnd();
}
interface Sender<T> {
void setDestination(Destination<T> destination);
}
и несколько вспомогательных классов.
В итоге каждый этап обрабоки представлен отдельным объектом, который знает только про свой вход и выход, про соседей он ничего не знает, т.е. достигается хороший decoupling и testability.
Мне сама идея понравилась, но смущает то, что я не встречал её раньше. Какие могут возникнуть проблемы с этим решением?