Плюсы и минусы инверсии управления

Предположим, у меня есть поток объектов [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 кажется более гибким, позволяя пользователям контролировать более низкий уровень.

С точки зрения дизайна, с чем мне пойти? Есть ли еще плюсы и минусы, которых я еще не видел? Какие проблемы с поддержкой / обслуживанием возникнут в будущем?

22
задан kirakun 1 March 2011 в 16:04
поделиться