Re[4]: В чём развод STL?
От: Пётр Седов Россия  
Дата: 19.06.07 16:07
Оценка: +3
Здравствуйте, alzt, Вы писали:

MN>>>2. Интерфейсы.

MN>>>
MN>>>std::transform(it->begin(), it->begin() + commandEnd,
MN>>>    cmd.begin(),
MN>>>    std::bind2nd(std::ptr_fun(toupper_wrap), &loc));
MN>>>


MN>>>Это ещё достаточно простая комбинация. Для меня эта запись выглядит понятной, но я встречал людей, которых она вгоняла в такой ступор... А уж если надо написать свой функтор (но это уже больше относится к 3-ему пункту).


A>В ступор этот код вогнать конечно может. Но только человека плохо знающего stl.

По-моему, использование тривиальных STL-алгоритмов (вроде for_each или transform) ухудшает код.
Во-первых, такой код превращается в тайнопись для избранных и рискует стать write-only (это сейчас понятно, а через пару лет будет непонятно, и тогда проще переписать, чем понять).
Во-вторых, нельзя писать функтор по месту использования – теряется локальность кода (вспоминаю Pascal: переменная объявлена в одном месте, а используется совсем в другом; приходится постоянно метаться между двумя этими местами). Неудобно использовать в функторе локальные переменные, лежащие рядом с вызовом STL-алгоритма (приходится пихать ссылки в функтор). Архитектура программы захламляется мелочными искусственными функтор-классами (мои понятия: если название класса – не существительное, то класс искусственный).
В-третьих, снижается эффективность программы (вместо статического вызова loc.toupper_wrap(…) делается динамический вызов; это плохо для cache-а, особенно в цикле).
В-четвёртых, код с функторами сложнее отлаживать.
Пётр Седов (ушёл с RSDN)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.