Здравствуйте, 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-а, особенно в цикле).
В-четвёртых, код с функторами сложнее отлаживать.