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