Собственно хотелось бы обсудить вот эту статью — автор утверждает, что перегрузка (операторов/функций) увеличивает сложность программ и понижает их читаемость. Критикуются плюсы с их довольно обширными правилами приведения типов и пр.
Собака лает — караван идёт
Авторы подобной критики не улучшить что-то пытаются, а себя показать Вот мол какой я умный, а мировая общественность тупая.
Подобные теоретизирования совершенно бессмысленны. Успех языка решает рынок. Замечательные Лисп и Оберон пылятся на полке, а рулят Си++ и C#. Я могу привести 100 и 1 повод почему Си++ плохой язык, придумать какое-то проблемы, но ничем кроме сотрясания воздуха это не будет.
Подробнее:
>>In general, overloading means that a function name or an operator has two or more distinct meanings. >>When you use it, the types of its operands are used by the language to determine which meaning should apply
Полная чушь! Суть как раз в том, что бы применять одно и тоже понятие к разным типам.
>>Overloading function names saves time during writing by saving keystrokes and, more significantly, saves the mental effort of thinking up unique names.
Мда, а автор похоже сам сидит на героине! Оказывается перегрузка операторов нужна, чтобы экономить 2 символа и писать + вместо add
>>The effect on readability is purely negative, however, because things with different meanings look the same.
Ещё раз убеждаемся, что автор понятия не имеет, зачем нужна перегрузка операторов.
Дальше даже читать не интересно. Видно, что автор не разбирается в вопросе
Здравствуйте, adontz, Вы писали: >>>Overloading function names saves time during writing by saving keystrokes and, more significantly, saves the mental effort of thinking up unique names.
A>Мда, а автор похоже сам сидит на героине! Оказывается перегрузка операторов нужна, чтобы экономить 2 символа и писать + вместо add
Здравствуйте, Курилка, Вы писали:
К>Собственно хотелось бы обсудить вот эту статью — автор утверждает, что перегрузка (операторов/функций) увеличивает сложность программ и понижает их читаемость. Критикуются плюсы с их довольно обширными правилами приведения типов и пр.
Ага, а шаблоны (templates) — LSD 25. Всё это беспочвенные теоретические рассуждения, причём автор статьи похоже не знаком с вопросом
Здравствуйте, adontz, Вы писали:
>>>Overloading function names saves time during writing by saving keystrokes and, more significantly, saves the mental effort of thinking up unique names.
A>Мда, а автор похоже сам сидит на героине! Оказывается перегрузка операторов нужна, чтобы экономить 2 символа и писать + вместо add
Здравствуйте, StanislavK, Вы писали:
>>>>Overloading function names saves time during writing by saving keystrokes and, more significantly, saves the mental effort of thinking up unique names.
A>>Мда, а автор похоже сам сидит на героине! Оказывается перегрузка операторов нужна, чтобы экономить 2 символа и писать + вместо add
SK>Просвети, кстати, зачем, если не для этого?
Для лучшего отражения той или иной метафоры в коде. Например, два комплексных числа логичней складывать как a + b, а не a.Add(b).
Здравствуйте, Oyster, Вы писали:
O>Здравствуйте, StanislavK, Вы писали:
>>>>>Overloading function names saves time during writing by saving keystrokes and, more significantly, saves the mental effort of thinking up unique names.
A>>>Мда, а автор похоже сам сидит на героине! Оказывается перегрузка операторов нужна, чтобы экономить 2 символа и писать + вместо add
SK>>Просвети, кстати, зачем, если не для этого?
O>Для лучшего отражения той или иной метафоры в коде. Например, два комплексных числа логичней складывать как a + b, а не a.Add(b).
Напиши a.plus(b). Чем это хуже a + b никак понять не могу.
Здравствуйте, StanislavK, Вы писали:
A>>>>Мда, а автор похоже сам сидит на героине! Оказывается перегрузка операторов нужна, чтобы экономить 2 символа и писать + вместо add
SK>>>Просвети, кстати, зачем, если не для этого?
O>>Для лучшего отражения той или иной метафоры в коде. Например, два комплексных числа логичней складывать как a + b, а не a.Add(b).
SK>Напиши a.plus(b). Чем это хуже a + b никак понять не могу.
Тем, что ((a+b)/2 + c) лучше, чем a.plus(b).div(2).plus(c).
... << RSDN@Home 1.1.4 stable rev. 510>>
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Здравствуйте, Oyster, Вы писали:
O>Здравствуйте, StanislavK, Вы писали:
>>>>>Overloading function names saves time during writing by saving keystrokes and, more significantly, saves the mental effort of thinking up unique names.
A>>>Мда, а автор похоже сам сидит на героине! Оказывается перегрузка операторов нужна, чтобы экономить 2 символа и писать + вместо add
SK>>Просвети, кстати, зачем, если не для этого?
O>Для лучшего отражения той или иной метафоры в коде. Например, два комплексных числа логичней складывать как a + b, а не a.Add(b).
Здравствуйте, eao197, Вы писали:
E>Здравствуйте, StanislavK, Вы писали:
A>>>>>Мда, а автор похоже сам сидит на героине! Оказывается перегрузка операторов нужна, чтобы экономить 2 символа и писать + вместо add
SK>>>>Просвети, кстати, зачем, если не для этого?
O>>>Для лучшего отражения той или иной метафоры в коде. Например, два комплексных числа логичней складывать как a + b, а не a.Add(b).
SK>>Напиши a.plus(b). Чем это хуже a + b никак понять не могу.
E>Тем, что ((a+b)/2 + c) лучше, чем a.plus(b).div(2).plus(c).
Для чисел — да, полность согласен и то это дело вкуса, метафоры тут не при чем.
Но все остальное более логично выглядит как раз с функциями, а не с операторами.
Здравствуйте, VladGal, Вы писали:
VG>Ага, а шаблоны (templates) — LSD 25. Всё это беспочвенные теоретические рассуждения, причём автор статьи похоже не знаком с вопросом
Здравствуйте, Andrei N.Sobchuck, Вы писали:
>>>>>>Overloading function names saves time during writing by saving keystrokes and, more significantly, saves the mental effort of thinking up unique names.
A>>>>Мда, а автор похоже сам сидит на героине! Оказывается перегрузка операторов нужна, чтобы экономить 2 символа и писать + вместо add
SK>>>Просвети, кстати, зачем, если не для этого?
O>>Для лучшего отражения той или иной метафоры в коде. Например, два комплексных числа логичней складывать как a + b, а не a.Add(b).
ANS>В критикуемой цитате об этом и говорится.
Здравствуйте, eao197, Вы писали:
SK>>Напиши a.plus(b). Чем это хуже a + b никак понять не могу.
E>Тем, что ((a+b)/2 + c) лучше, чем a.plus(b).div(2).plus(c).
А от последней записи и до (+ (/ (+ a b) 2) c) недалеко
Здравствуйте, StanislavK, Вы писали:
A>>>>>>Мда, а автор похоже сам сидит на героине! Оказывается перегрузка операторов нужна, чтобы экономить 2 символа и писать + вместо add
SK>>>>>Просвети, кстати, зачем, если не для этого?
O>>>>Для лучшего отражения той или иной метафоры в коде. Например, два комплексных числа логичней складывать как a + b, а не a.Add(b).
SK>>>Напиши a.plus(b). Чем это хуже a + b никак понять не могу.
E>>Тем, что ((a+b)/2 + c) лучше, чем a.plus(b).div(2).plus(c).
SK>Для чисел — да, полность согласен и то это дело вкуса, метафоры тут не при чем.
Нет, не вкуса, а общепринятой нотации. Выражать математические концепции проще математическими символами.
SK>Но все остальное более логично выглядит как раз с функциями, а не с операторами.
Так ведь здравого смысла еще никто не отменял. Если кто-то для класса Window определяет operator+=() для дополнения заголовка окна, то точно также он может объявить Window::add_string() для того же самого, хотя лучше было бы сделать caption() и set_caption().
Кроме того, операторы, которые являются свободными функциями, а не членами класса, позволяют делать расширения. Например, если я реализую собственный класс My_Data и объявляю:
std::ostream & operator<<( std::ostream & o, const My_Data & o ) { ... }
то это дает мне возможность писать:
std::cout << "My data: " << my_data << ", your data: " << your_data << std::endl;
Если бы перегрузок оператора сдвига не было, мне бы пришлось делать что-то вроде:
Здравствуйте, Oyster, Вы писали:
O>Здравствуйте, Трурль, Вы писали:
A>>>Полная чушь! Суть как раз в том, что бы применять одно и тоже понятие к разным типам.
Т>>
Т>>1+2
Т>>"Hello "+ "world"
Т>>
Т>>Здесь "+" одно и то же понятие?
O>Да. Понятие сложения. Для чисел результат — сумма, для строк — конкатенация. Но метафорический смысл един
Ну да.
("Hello world"-"world") ? "Hello "
Или иначе: как отнимать строки, если сложение (в виде конкатенации) возможно?
В случае соединения строк мне больше нравится введение нового оператора в язык, например, тильда в D.
O>Но вот, например, "<<" в C++ и оператор побитового сдвига, и оператор вывода в поток — вот тут уже явно разные понятия.
С++ вообще проектировался по принципу минимальных нововведений в синтаксис языка, отсюда и операторы в/в потоков, и обозначение ЧВФ, и некоторые другие вещи.
, что конкатенация и сложение это разные вещи, и, соответсвенно, не согласен с тем, что это по сути одно и то же. Взять хотябы коммутативность.
Понятно. Я говорил как программист, а не как математик. Как для программиста, для меня достаточно удобно и понятно писать "abc" + "def" вместо "abc".concat("def"). Это и означает "добавление одного значения к другому" для строки.
И другую общепринятую интерпретацию "сложения" для строк мне припомнить тяжело.