Перегрузка == героин?
От: Курилка Россия http://kirya.narod.ru/
Дата: 06.08.05 16:56
Оценка:
Собственно хотелось бы обсудить вот эту статью — автор утверждает, что перегрузка (операторов/функций) увеличивает сложность программ и понижает их читаемость. Критикуются плюсы с их довольно обширными правилами приведения типов и пр.
Re: Перегрузка == героин?
От: adontz Грузия http://adontz.wordpress.com/
Дата: 06.08.05 18:53
Оценка: 29 (4) +4 -2
Здравствуйте, Курилка, Вы писали:

Вкратце:

Собака лает — караван идёт
Авторы подобной критики не улучшить что-то пытаются, а себя показать Вот мол какой я умный, а мировая общественность тупая.
Подобные теоретизирования совершенно бессмысленны. Успех языка решает рынок. Замечательные Лисп и Оберон пылятся на полке, а рулят Си++ и 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.


Ещё раз убеждаемся, что автор понятия не имеет, зачем нужна перегрузка операторов.

Дальше даже читать не интересно. Видно, что автор не разбирается в вопросе
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[2]: Перегрузка == героин?
От: Andrei N.Sobchuck Украина www.smalltalk.ru
Дата: 07.08.05 12:01
Оценка: :))
Здравствуйте, 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


Эта. А для чего еще она нужна?
... << RSDN@Home 1.1.4 stable rev. 510>>
Я ненавижу Hibernate
Автор: Andrei N.Sobchuck
Дата: 08.01.08
!
Re: Перегрузка == героин?
От: VladGal  
Дата: 07.08.05 14:53
Оценка:
Здравствуйте, Курилка, Вы писали:

К>Собственно хотелось бы обсудить вот эту статью — автор утверждает, что перегрузка (операторов/функций) увеличивает сложность программ и понижает их читаемость. Критикуются плюсы с их довольно обширными правилами приведения типов и пр.

Ага, а шаблоны (templates) — LSD 25. Всё это беспочвенные теоретические рассуждения, причём автор статьи похоже не знаком с вопросом
... << RSDN@Home 1.1.4 stable rev. 510>>
Re[2]: Перегрузка == героин?
От: Трурль  
Дата: 08.08.05 05:01
Оценка: +3
Здравствуйте, adontz, Вы писали:

A>Полная чушь! Суть как раз в том, что бы применять одно и тоже понятие к разным типам.


1+2
"Hello "+ "world"

Здесь "+" одно и то же понятие?
Re[3]: Перегрузка == героин?
От: Oyster Украина https://github.com/devoyster
Дата: 08.08.05 07:08
Оценка: +2 -2 :)
Здравствуйте, Трурль, Вы писали:

A>>Полная чушь! Суть как раз в том, что бы применять одно и тоже понятие к разным типам.


Т>
Т>1+2
Т>"Hello "+ "world"
Т>

Т>Здесь "+" одно и то же понятие?

Да. Понятие сложения. Для чисел результат — сумма, для строк — конкатенация. Но метафорический смысл един

Но вот, например, "<<" в C++ и оператор побитового сдвига, и оператор вывода в поток — вот тут уже явно разные понятия.
Re[2]: Перегрузка == героин?
От: StanislavK Великобритания  
Дата: 08.08.05 07:16
Оценка:
Здравствуйте, 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


Просвети, кстати, зачем, если не для этого?
Re[3]: Перегрузка == героин?
От: Oyster Украина https://github.com/devoyster
Дата: 08.08.05 07:17
Оценка:
Здравствуйте, 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).
Re[4]: Перегрузка == героин?
От: StanislavK Великобритания  
Дата: 08.08.05 07:19
Оценка: -1
Здравствуйте, 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 никак понять не могу.
Re[5]: Перегрузка == героин?
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 08.08.05 07:22
Оценка: +1
Здравствуйте, 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++.
Re[4]: Перегрузка == героин?
От: Andrei N.Sobchuck Украина www.smalltalk.ru
Дата: 08.08.05 07:27
Оценка:
Здравствуйте, 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).


В критикуемой цитате об этом и говорится.
... << RSDN@Home 1.1.4 stable rev. 510>>
Я ненавижу Hibernate
Автор: Andrei N.Sobchuck
Дата: 08.01.08
!
Re[6]: Перегрузка == героин?
От: StanislavK Великобритания  
Дата: 08.08.05 07:27
Оценка: -2
Здравствуйте, 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).


Для чисел — да, полность согласен и то это дело вкуса, метафоры тут не при чем.
Но все остальное более логично выглядит как раз с функциями, а не с операторами.
Re[2]: Перегрузка == героин?
От: Курилка Россия http://kirya.narod.ru/
Дата: 08.08.05 07:32
Оценка:
Здравствуйте, VladGal, Вы писали:

VG>Ага, а шаблоны (templates) — LSD 25. Всё это беспочвенные теоретические рассуждения, причём автор статьи похоже не знаком с вопросом


Факты?
Re[5]: Перегрузка == героин?
От: Oyster Украина https://github.com/devoyster
Дата: 08.08.05 07:33
Оценка:
Здравствуйте, 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>В критикуемой цитате об этом и говорится.


Хмм. Мне целые удобнее складывать как a + b...

PS: За что минус: Re[3]: Перегрузка == героин?
Автор: Oyster
Дата: 08.08.05
?
Re[6]: Перегрузка == героин?
От: Andrei N.Sobchuck Украина www.smalltalk.ru
Дата: 08.08.05 07:35
Оценка: +1 :))) :))
Здравствуйте, eao197, Вы писали:

SK>>Напиши a.plus(b). Чем это хуже a + b никак понять не могу.


E>Тем, что ((a+b)/2 + c) лучше, чем a.plus(b).div(2).plus(c).


А от последней записи и до (+ (/ (+ a b) 2) c) недалеко
... << RSDN@Home 1.1.4 stable rev. 510>>
Я ненавижу Hibernate
Автор: Andrei N.Sobchuck
Дата: 08.01.08
!
Re[7]: Перегрузка == героин?
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 08.08.05 07:49
Оценка:
Здравствуйте, 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;


Если бы перегрузок оператора сдвига не было, мне бы пришлось делать что-то вроде:
print( std::cout, "My data: " );
print( std::cout, my_data );
print( std::cout, ", your data: " );
print( std::cout, your_data );
print( std::cout, "\n", std::flush );

или
print( print( print( print( print( std::cout, "My data: " ), my_data ), ", your_data: " ), your_data ), "\n", std::flush );


Вряд ли последние два варианта читабельнее и проще в сопровождении, чем первый с перегруженным оператором сдвига.
... << RSDN@Home 1.1.4 stable rev. 510>>


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[3]: Перегрузка == героин?
От: VladD2 Российская Империя www.nemerle.org
Дата: 08.08.05 08:12
Оценка: 5 (1) -1
Здравствуйте, Трурль, Вы писали:

Т>
Т>1+2
Т>"Hello "+ "world"
Т>

Т>Здесь "+" одно и то же понятие?

Для человека — да. Вот если "Hello " + "world" будет заниматься побайтным сложением строк, или еще какую фигню делать, то это уже будет уродство.

Согласись, что такой код:
string mather = "мама";
string result = "Папа" + ' ' + mather + " я";

Читается кда лучше чем:
string mather = "мама";
string result = StrCat(StrCat(StrCat("Папа", ToString(' ')), mather), " я");

... << RSDN@Home 1.2.0 alpha rev. 591>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[6]: Перегрузка == героин?
От: Andrei N.Sobchuck Украина www.smalltalk.ru
Дата: 08.08.05 08:21
Оценка: +2 -1
Здравствуйте, Oyster, Вы писали:

O>PS: За что минус: Re[3]: Перегрузка == героин?
Автор: Oyster
Дата: 08.08.05
?


Я согласен с тем
Автор: Трурль
Дата: 08.08.05
, что конкатенация и сложение это разные вещи, и, соответсвенно, не согласен с тем, что это по сути одно и то же. Взять хотябы коммутативность.
... << RSDN@Home 1.1.4 stable rev. 510>>
Я ненавижу Hibernate
Автор: Andrei N.Sobchuck
Дата: 08.01.08
!
Re[4]: Перегрузка == героин?
От: cranky Украина  
Дата: 08.08.05 08:29
Оценка: 1 (1) +1
Здравствуйте, Oyster, Вы писали:

O>Здравствуйте, Трурль, Вы писали:


A>>>Полная чушь! Суть как раз в том, что бы применять одно и тоже понятие к разным типам.


Т>>
Т>>1+2
Т>>"Hello "+ "world"
Т>>

Т>>Здесь "+" одно и то же понятие?

O>Да. Понятие сложения. Для чисел результат — сумма, для строк — конкатенация. Но метафорический смысл един

Ну да.
("Hello world"-"world") ? "Hello "
Или иначе: как отнимать строки, если сложение (в виде конкатенации) возможно?
В случае соединения строк мне больше нравится введение нового оператора в язык, например, тильда в D.

O>Но вот, например, "<<" в C++ и оператор побитового сдвига, и оператор вывода в поток — вот тут уже явно разные понятия.

С++ вообще проектировался по принципу минимальных нововведений в синтаксис языка, отсюда и операторы в/в потоков, и обозначение ЧВФ, и некоторые другие вещи.
You aren't expected to absorb this
Re[7]: Перегрузка == героин?
От: Oyster Украина https://github.com/devoyster
Дата: 08.08.05 08:32
Оценка:
Здравствуйте, Andrei N.Sobchuck, Вы писали:

O>>PS: За что минус: Re[3]: Перегрузка == героин?
Автор: Oyster
Дата: 08.08.05
?


ANS>Я согласен с тем
Автор: Трурль
Дата: 08.08.05
, что конкатенация и сложение это разные вещи, и, соответсвенно, не согласен с тем, что это по сути одно и то же. Взять хотябы коммутативность.


Понятно. Я говорил как программист, а не как математик. Как для программиста, для меня достаточно удобно и понятно писать "abc" + "def" вместо "abc".concat("def"). Это и означает "добавление одного значения к другому" для строки.

И другую общепринятую интерпретацию "сложения" для строк мне припомнить тяжело.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.