Предположим, у меня есть поток объектов [acme], которые я хочу открыть через API. У меня есть два варианта: обратные вызовы и итераторы.
// 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
// 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 кажется более гибким, позволяя пользователям контролировать более низкий уровень.
С точки зрения дизайна, с чем мне пойти? Есть ли еще плюсы и минусы, которых я еще не видел? Какие проблемы с поддержкой / обслуживанием возникнут в будущем?