Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Функторы vs свободные функции 
:(
    Опции темы
chipset
Дата 1.3.2006, 23:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4071
Регистрация: 11.1.2003
Где: Seattle, US

Репутация: 27
Всего: 165



Привет всем smile
Курю тут потихоньку Майерса, ЭФфективный STL и наблюдаю тот факт что он сует функторы где-бы не попало. Аргументируя следующим:
1. Когда рак на горе свистнет то может придеться добавлять дополнительные параметры (правда тут спокойно используеться bind1,2st или вообще boost).
2. Компилятору проще про-инлайнить оператор () чем функцию.

У меня на это есть следующие возражения:
1. А если по дизайну запрещено добавлять новые параметры?
2. А если ин-лайн функцией в класс?
3. А не будет ли это менее читабельнее, все-таки новый класс подсознательно говорит читателю о том что это класс а не функтор?

А тут ещё Александреску грозиться вешать всех кто пишет жуткие классы вместо двух-строчного for smile
Может я чего-то упустил? Что вы используете?


--------------------
Цитата(Jimi Hendrix)
Well, I stand up next to a mountain
And I chop it down with the edge of my hand
PM MAIL WWW   Вверх
DeadSoul
Дата 1.3.2006, 23:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1217
Регистрация: 25.9.2005
Где: Москва

Репутация: 2
Всего: 11



Цитата(chipset @ 1.3.2006, 23:46 Найти цитируемый пост)
3. А не будет ли это менее читабельнее, все-таки новый класс подсознательно говорит читателю о том что это класс а не функтор?

Нет. не говорит.smile


--------------------
 Если Вы получили ответ на Ваш вопрос, то нажмите на "Вопрос решен". 

Бьем спамеров их же оружием. Пусть весь спам сыпется им
[email protected] 
PM   Вверх
JackYF
Дата 2.3.2006, 06:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Мне пару раз приходилось использовать и то, и то. Функция, по мне, все-таки читабельней...


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
MAKCim
Дата 2.3.2006, 08:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



само понятие функтор - обобщение функции/процедуры/метода/любой сущности к которой применяется operator()
значит не надо никакой обобщенности, в принципе не планируется ничего по ходу дела добавлять, можно пользоваться обычными ф-ями/методами
по поводу читабельности по мне так одинаково, вызов функтора так вообще ничем не отличается от вызова ф-ии


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Earnest
Дата 2.3.2006, 15:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



Сначала надо потренироваться - везде писать функторы, где хотя бы принципиально можно. Чтобы мозги привыкли в эту сторону думать.
Потом успокоиться и писать как нравится - как кажется более читабельным.
Я пишу по разному. Иногда, если действие хорошо локализуется, и нужно выполнить ряд таких действий в функции, лучше выглядят функторы + алгоритмы:

Код

std::for_each(items.begin(),items.end(),_ReplaceSomething(...));

std::for_each(items.begin(),items.end(),_MarkBySomeCriteria(...));
 
std::remove_if(items.begin(),items.end(),_Marked());


Комментарии можно не писать... А если заменить это дело циклами - будет хуже читаться. Но иногда действие сложное, со сквозными переменными, или в функтор слишком много параметров передать нужно, или еще что - тогда проще функцией сделать...


--------------------
...
PM   Вверх
chipset
Дата 3.3.2006, 01:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4071
Регистрация: 11.1.2003
Где: Seattle, US

Репутация: 27
Всего: 165



Цитата(Earnest @ 2.3.2006, 05:51 Найти цитируемый пост)
Комментарии можно не писать... А если заменить это дело циклами - будет хуже читаться.

Я всё больше к этому прихожу и стараюсь использовать transform, for_each, remove_copy и прочие везде где это только возможно без особого затруднения чтения. ИМХО, for'ы и while'ы не настолько читабельны.
Просто в них можно использовать как свободные функции так и функторы, афаик.
Цитата(MAKCim @ 1.3.2006, 22:30 Найти цитируемый пост)
само понятие функтор - обобщение функции/процедуры/метода/любой сущности к которой применяется operator()

Цитата(Wiki)

A function object, often called a functor, is a computer programming construct allowing an object to be invoked or called as if it were an ordinary function

Цитата(MAKCim @ 1.3.2006, 22:30 Найти цитируемый пост)
вызов функтора так вообще ничем не отличается от вызова ф-ии

Поэтому я и задал такой вопрос smile


--------------------
Цитата(Jimi Hendrix)
Well, I stand up next to a mountain
And I chop it down with the edge of my hand
PM MAIL WWW   Вверх
MAKCim
Дата 3.3.2006, 08:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



впринципе, если разобраться то все-таки вызов функтора - менее производителен, т. к вызов ф-ии/метода...происходит после вызова operator(), двойной вызов происходит не всегда (например предикаты), но обычно происходит и наверное это медленнее


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
zss
Дата 3.3.2006, 10:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 708
Регистрация: 17.6.2004

Репутация: 1
Всего: 2



Цитата(MAKCim @ 3.3.2006, 08:35 Найти цитируемый пост)
впринципе, если разобраться то все-таки вызов функтора - менее производителен

Тот же Мейерс приводит убедительные доказательства по производительности в пользу функтора

Как он говорит прирост достигал 160% на некоторых платформах
и подробно объяснил это (где-то уже под конец)
PM MAIL ICQ   Вверх
Daevaorn
Дата 3.3.2006, 10:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



Ну у функтора есть ряд преимуществ. Он, допустим, может сохранять некое своё состояние. И от итерации к итерации, от алгоритма к алгоритму менять своё поведение. Согласитесь, что иногда очень полезно. Нет, конечно, это можно сделать и свободными функциями с использованием статических переменный, но это менее удобно, и как говориться, ухудшает дизайн.
PM MAIL WWW   Вверх
chipset
Дата 3.3.2006, 11:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4071
Регистрация: 11.1.2003
Где: Seattle, US

Репутация: 27
Всего: 165



Цитата(MAKCim @ 2.3.2006, 22:35 Найти цитируемый пост)
впринципе, если разобраться то все-таки вызов функтора - менее производителен, т. к вызов ф-ии/метода...происходит после вызова operator(), двойной вызов происходит не всегда (например предикаты), но обычно происходит и наверное это медленнее

Компилятор инлайнит оператор скобки.
Цитата(Daevaorn @ 3.3.2006, 00:41 Найти цитируемый пост)
Ну у функтора есть ряд преимуществ. Он, допустим, может сохранять некое своё состояние.

Я это понимаю. В начале топика, я упоминал ту ситуацию когда ему НЕ НАДО хранить своё состояние smile


--------------------
Цитата(Jimi Hendrix)
Well, I stand up next to a mountain
And I chop it down with the edge of my hand
PM MAIL WWW   Вверх
MAKCim
Дата 3.3.2006, 20:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата

Компилятор инлайнит оператор скобки.

очень даже не факт, компиляторов-то много smile


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Void
Дата 3.3.2006, 20:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 40
Всего: 173



Цитата(MAKCim @ 3.3.2006, 22:11 Найти цитируемый пост)
очень даже не факт, компиляторов-то много

С компилятором, не способным инлайнить хотя бы простейшие функции, использование половины алгоритмов STL теряет смысл.

Почти в тему: вот тут — proposal комитета по введению в C++ полноценных анонимных функций (aka лямбда-функций). Предложение исходит (в том числе) от самого Страуструпа и автора Boost.Lambda. Помнится, долгие дискуссии в c.l.c++.m сводились к тому, что нормально реализовать это не удастся, однако ж…


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
chipset
Дата 6.3.2006, 03:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4071
Регистрация: 11.1.2003
Где: Seattle, US

Репутация: 27
Всего: 165



На самом деле boost это уже "второй STL" smile


--------------------
Цитата(Jimi Hendrix)
Well, I stand up next to a mountain
And I chop it down with the edge of my hand
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0871 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.