Предположим, что у меня есть поток объектов [acme], который я хочу открыть через API. У меня есть два варианта: обратные вызовы и итераторы.
API # 1: Обратные вызовы
// API #1
// This function takes a user-defined callback
// and invokes it for each object in the stream.
template<typename CallbackFunctor>
void ProcessAcmeStream(CallbackFunctor &callback);
API # 2: Итераторы
// API #2
// Provides the iterator class AcmeStreamIterator.
AcmeStreamIterator my_stream_begin = AcmeStreamIterator::begin();
AcmeStreamIterator my_stream_end = AcmeStreamIterator::end();
API # 1 берет поток управления программой из руки пользователя и не возвращается до тех пор, пока весь поток не будет потреблен (забыв об исключениях на данный момент).
API # 2 сохраняет поток управления в руке пользователя, позволяя пользователю самостоятельно перемещать поток.
API # 1 чувствует себя более высоким уровнем, позволяя пользователям сразу перейти к бизнес-логике (функтору обратного вызова). С другой стороны, API # 2 чувствует себя более гибким, что позволяет пользователям более низкого уровня управления.
С точки зрения дизайна, с которым мне следует идти? Есть ли еще какие-то плюсы и минусы, которых я еще не видел? Каковы некоторые проблемы поддержки/обслуживания в будущем?