Re[2]: Перегрузка == героин?
От: Quintanar Россия  
Дата: 08.08.05 14:34
Оценка: +1 -1
Здравствуйте, adontz, Вы писали:

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


>>>Overloading function names saves time during writing by saving keystrokes and, more significantly, saves the mental effort of thinking up unique names.


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


A>Дальше даже читать не интересно. Видно, что автор не разбирается в вопросе


Не стоит брызгать слюной, поскольку критика справедлива. С++ вариант перегрузки не накладывает никаких ограничений _вообще_. Т.е. перегруженный оператор может делать, буквально, что угодно, и о никакой "общности понятий" речь идти не может. Но есть и другие подходы к перегрузке, которые реализованы, например, в языке Haskell. Там мы не сможем нарушить некоторые аксиомы связанные с перегружаемой функцией или операцией и поэтому + всегда будет вести себя как + — т.е. мы не сможем перегрузить его для каких-то противоестественных целей.
Re[4]: Перегрузка == героин?
От: Quintanar Россия  
Дата: 08.08.05 14:37
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Согласись, что такой код:

VD>
VD>string mather = "мама";
VD>string result = "Папа" + ' ' + mather + " я";
VD>

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

VD>

Не соглашусь. В данном конкретном случае есть некоторое удобство, однако в целом, это поощряет использование перегрузки для всего, что угодно, без всякой привязки к смыслу. Мне больше импонирует Haskell'овский подход. Там можно наложить ограничения на перегрузку для того, чтобы перегружаемые функции или операнды вели себя более предсказуемо.
Re[12]: Перегрузка == героин?
От: Andrei N.Sobchuck Украина www.smalltalk.ru
Дата: 08.08.05 15:18
Оценка:
Здравствуйте, adontz, Вы писали:

ANS>>И вообще, нечего тут сокращать, ибо для конкатенации множества строк всё равно прийдётся StringBuilder создавать.


A>Для того чтобы конкатекация была эффективной? Вовсе нет StringBuilder это излишество вызванное как раз неиспользованием перегрузки операторов.


Сомневаюсь, что даже использование перегрузки операторов поможет избавиться от этого излишиства.
... << RSDN@Home 1.1.4 stable rev. 510>>
Я ненавижу Hibernate
Автор: Andrei N.Sobchuck
Дата: 08.01.08
!
Re[8]: Перегрузка == героин?
От: cranky Украина  
Дата: 08.08.05 15:19
Оценка:
Здравствуйте, Кодёнок, Вы писали:

Кё>Есть еще cons. Это почти то же, но образуется всегда список-пара:

Кё>1 :: 2 = (1 2)
Кё>(1 2) :: 3 = ((1 2) 3)
Кё>(1 2) :: (3 4) = ((1 2) (3 4))

Интересный какой cons. А что это за язык? И возможна ли в нём не-двоичная нотация списков, типа такого: (1 2 3)?
You aren't expected to absorb this
Re[7]: Перегрузка == героин?
От: Nose Россия  
Дата: 08.08.05 15:24
Оценка: +1
Здравствуйте, cranky, Вы писали:

O>>Меня не поняли

O>>Re[7]: Перегрузка == героин?
Автор: Oyster
Дата: 08.08.05

C>Да всё понятно. Но таки конкатенация — никаким боком не сложение, даже в программировании. И, на мой взгляд, это неправильно, когда в стандартной библиотеке (хорошо, что не в самом языке) для строк применяется оператор+. Если нет более подходящего, тогда уж лучше функции concat или strcat. Ведь никто не будет с аналогичной целью вводить + для векторов?

Не сложение, конечно, если строго говорить. Но вот в сознании программиста -- вполне естественно "складывать" строки, не коряво звучит. Привычка?

Кроме того, типичное применение (псевдокод) :


    strcat( string("Error ") , strcat( to_string(errNum) , strcat( string(" while proc...."), to_string( objNum ) ) ) );


вместо 3-х знаков "+"... не страшно?


Идеологически правильный вариант грозит нечитаемым кодом...

П.С. так и тянуло сказать "оверхед"
... << RSDN@Home 1.1.4 beta 7 rev. 447>>
Re[13]: Перегрузка == героин?
От: adontz Грузия http://adontz.wordpress.com/
Дата: 08.08.05 15:27
Оценка: :)
Здравствуйте, Andrei N.Sobchuck, Вы писали:

A>>Для того чтобы конкатекация была эффективной? Вовсе нет StringBuilder это излишество вызванное как раз неиспользованием перегрузки операторов.

ANS>Сомневаюсь, что даже использование перегрузки операторов поможет избавиться от этого излишиства.

Сомневаться не надо, я сам написал строковый класс на C++, который кроме всего прочьего оптимизировал конкатекацию без вмешательсва программиста.
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[2]: Перегрузка == героин?
От: A.Lokotkov Россия http://www.linkedin.com/pub/alexander-lokotkov/a/701/625
Дата: 08.08.05 15:37
Оценка:
Здравствуйте, opossum, Вы писали:

O>В приводимой статье вообще нет слова dispatch, а есть Heroin и drug,

O>что выдает ее явно популистско-провокационный характер.

Вы всё же статью-то почитайте.
bloß it hudla
Re[3]: Перегрузка == героин?
От: adontz Грузия http://adontz.wordpress.com/
Дата: 08.08.05 15:40
Оценка:
Здравствуйте, Quintanar, Вы писали:

A>>Дальше даже читать не интересно. Видно, что автор не разбирается в вопросе

Q>Не стоит брызгать слюной, поскольку критика справедлива. С++ вариант перегрузки не накладывает никаких ограничений _вообще_. Т.е. перегруженный оператор может делать, буквально, что угодно, и о никакой "общности понятий" речь идти не может.

А Си++ вообще довольно много свободы даёт и требует мозгов чтобы этой свободой надлежащим образом распорядится. Например та же адресная арифметика. Кому эта свобода бьёт в голову, те на Си++ не пишите. Кто же заставляет?
Почему-то мне не приходит в голову сопоставлять перегруженным операторам неочевидные понятия. Кому приходит, то и виноват!
Тут есть два выхода: не писать на C# или научится правильно пользоваться перегрузкой. Кого на что хватает тот такой путь и выбирает
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[8]: Перегрузка == героин?
От: cranky Украина  
Дата: 08.08.05 15:41
Оценка:
Здравствуйте, Nose, Вы писали:

N>Здравствуйте, cranky, Вы писали:


C>>Да всё понятно. Но таки конкатенация — никаким боком не сложение, даже в программировании. И, на мой взгляд, это неправильно, когда в стандартной библиотеке (хорошо, что не в самом языке) для строк применяется оператор+. Если нет более подходящего, тогда уж лучше функции concat или strcat. Ведь никто не будет с аналогичной целью вводить + для векторов?


N>Не сложение, конечно, если строго говорить. Но вот в сознании программиста -- вполне естественно "складывать" строки, не коряво звучит. Привычка?

Наверно.
N>Кроме того, типичное применение (псевдокод) :


N>
N>    strcat( string("Error ") , strcat( to_string(errNum) , strcat( string(" while proc...."), to_string( objNum ) ) ) );
N>


N>вместо 3-х знаков "+"... не страшно?


Надо придумать, чтобы было так:
strcat("Error",toString(errNum)," while proc....",toString(objNum))
И ничем не хуже плюсов, и для плюсов вполне реально сделать.

N>Идеологически правильный вариант грозит нечитаемым кодом...


N>П.С. так и тянуло сказать "оверхед"
You aren't expected to absorb this
Re[4]: Перегрузка == героин?
От: Quintanar Россия  
Дата: 08.08.05 15:56
Оценка: +2
Здравствуйте, adontz, Вы писали:

A>А Си++ вообще довольно много свободы даёт и требует мозгов чтобы этой свободой надлежащим образом распорядится. Например та же адресная арифметика. Кому эта свобода бьёт в голову, те на Си++ не пишите. Кто же заставляет?

A>Почему-то мне не приходит в голову сопоставлять перегруженным операторам неочевидные понятия. Кому приходит, то и виноват!
A>Тут есть два выхода: не писать на C# или научится правильно пользоваться перегрузкой. Кого на что хватает тот такой путь и выбирает

Ну все, пошла обычная песня. Любители С++ уперлись в некую мнимую свободу С++ и в упор не видят, что есть и другие виды свободы. Например, свобода не думать об управлении памятью, свобода не думать, что означает данная закорючка в данном контексте, свобода не разбирать километровые объявления шаблонных типов и т.д. Полную свободу предоставляет, кстати, не С++, а С — на нем можно реализовать все, что угодно, без нелепых ограничений С++.
Что вам приходит в голову, ведомо только вам одному. То, что вы считаете логичным и понятным, может оказаться совершенно нелогичным и непонятным для других.
Re[15]: No String Builder
От: adontz Грузия http://adontz.wordpress.com/
Дата: 08.08.05 15:58
Оценка: +1
Здравствуйте, Oyster, Вы писали:

O>Как вариант... но StringBuilder всё равно выходит функциональнее и [немного] эффективнее (надо же в таком случае внутри хранить некий список конкатенируемых строк, даже скорее дерево, — накладные расходы на это).

O>А вообще идея хорошая

На самом деле если не мучать себя реализацией, то можно сделать так
string a = b + c + d + e;
оптимизируется
string a;
for (...)
{
 a += "abcd";
}
не оптимизируется
string_result b;
for (...)
{
 b += "abcd";
}
string a = b;
оптимизируется.

string_result это просто vector< some_smart_ptr<string> >

Всё это делается очень на основе очень простой идеи
string_result operator + (const string &, const string &);
string_result operator + (const string_result &, const string &);
string_result operator + (const string &, const string_result &);
string & operator = (const string &, const string &);
string & operator = (const string &, const string_result &);


Именно string_builder с явным методом add не нужен, а сам класс строки не перегружен лишними вещами. Я именно на такой реализации и остановился.
С другой стороны как продолжение идеи конечно неплохо было бы кое что перенести в compile time, но на фоне копирования строк это копейки.
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[8]: Перегрузка == героин?
От: Quintanar Россия  
Дата: 08.08.05 15:58
Оценка: +2
Здравствуйте, Nose, Вы писали:

N>
N>    strcat( string("Error ") , strcat( to_string(errNum) , strcat( string(" while proc...."), to_string( objNum ) ) ) );
N>


N>вместо 3-х знаков "+"... не страшно?

N>Идеологически правильный вариант грозит нечитаемым кодом...

Идеологически правильный вариант — выбрать другое обозначение для операции конкатенации. Ибо конкатенация по сути — это слияние списков, а не сложение.
Re[5]: Перегрузка == героин?
От: Павел Кузнецов  
Дата: 08.08.05 16:03
Оценка: 1 (1) +4
Quintanar,

> Полную свободу предоставляет, кстати, не С++, а С — на нем можно реализовать все, что угодно, без нелепых ограничений С++.


Это шутка? Если нет, можно конкретный пример того, что реализуемо на C, но не реализуемо на C++? Т.к. обратные примеры можно привести легко (начиная со статического полиморфизма и возможности вычислений на этапе компиляции).
Posted via RSDN NNTP Server 2.0 beta
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[9]: Перегрузка == героин?
От: Nose Россия  
Дата: 08.08.05 16:03
Оценка:
Здравствуйте, cranky, Вы писали:

C>Надо придумать, чтобы было так:
strcat("Error",toString(errNum)," while proc....",toString(objNum))
И ничем не хуже плюсов, и для плюсов вполне реально сделать.


Для плюсов тогда будет функция с переменным числом параметров. Операторы хотя бы безопасно можно сделать, а тут...
Или написать 30 прототипов?

не знаю, по-моему ничего страшного с "+", к тому же уже привычное старое решение...
Никаких глюков, напрягов и пр. от него не знаю -- не встречался.
Читаемо, удобно и стандартно.
А теоретизирование насчет идеологии ни к чему не ведет.
... << RSDN@Home 1.1.4 beta 7 rev. 447>>
Re[9]: Перегрузка == героин?
От: cranky Украина  
Дата: 08.08.05 16:09
Оценка:
Здравствуйте, Quintanar, Вы писали:

Q>Здравствуйте, Nose, Вы писали:


N>>
N>>    strcat( string("Error ") , strcat( to_string(errNum) , strcat( string(" while proc...."), to_string( objNum ) ) ) );
N>>


N>>вместо 3-х знаков "+"... не страшно?

N>>Идеологически правильный вариант грозит нечитаемым кодом...

Q>Идеологически правильный вариант — выбрать другое обозначение для операции конкатенации. Ибо конкатенация по сути — это слияние списков, а не сложение.


Ну это совсем идеалистический вариант — представление строки списком, всё-таки нечто с рандомным доступом подошло бы лучше.
You aren't expected to absorb this
Re[5]: Перегрузка == героин?
От: adontz Грузия http://adontz.wordpress.com/
Дата: 08.08.05 16:20
Оценка: 46 (5) +3 :)
Здравствуйте, Quintanar, Вы писали:

Q>Ну все, пошла обычная песня. Любители С++ уперлись в некую мнимую свободу С++ и в упор не видят, что есть и другие виды свободы. Например, свобода не думать об управлении памятью, свобода не думать, что означает данная закорючка в данном контексте, свобода не разбирать километровые объявления шаблонных типов и т.д.


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

Q>Что вам приходит в голову, ведомо только вам одному.


Нет. У меня есть образование. Например по формуле F = am я понимаю, что сила равная произведению ускорения на массу. Человек вроде вас боится, что за формулой F = am может скрываться, что мощность равная силе тока умноженной на напряжение, но увы любой кто не с Луны свалился и не ставит себе целью выпендриться такими обозначениями пользоваться не станет.

Вам мешает перегрузка? Не пользуйтесь! Но зачем хаять тех кто умеет пользоватся и делает это?

Давайте тогда хаять систему распределения памяти в Си++! Конечно! Какой-то дурак не знал что такое вектор, сделал new MyClass[38] и не сделал delete[]. Чем не повод? Система распределения памяти в Си++ полный отстой! Она не накладывает ограничений! Какие там ещё могут быть лозунги? А ну да! Все переходим на .Net!

Множественно наследование? О ужас! Заставлять человека писать или не писать virtual при наследовании. Какое напряжение мозга! Отменим multiple inheritance! В Хаскеле оно есть? Если нету, то я раз за этот язык — он полон ограничений усиливающих свободу не думать.

Короче хватит Думаешь, что ты умее тех кто, например, разрабатывает Си++? Си++ не сразу стал таким, какой он есть. 90% того что в нём реализовано добавили при утверждении очередного стандарта и не от нечего делать, а потому что в этом была необходимость. В Object Pascal'е который был с TurboPascal перегрузки операторов не было, в Delphi добавили. Думаешь зависть к Си++? Нет! Насущная необходимость!

Так что перегрузка операторов нужна.
Стоит ли её ограничивать? Нет, не стоит! Никакое формальное ограничение не выразит человеческую мысль. В результате будь такое ограничение введённым в современный промышленный язык им бы всё равно никто не стал пользоваться. Да, да, современный промышленный язык, на котором пишут сложные системы, а не богом забытый на котором пишут одни энтузиасты.
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[10]: Перегрузка == героин?
От: cranky Украина  
Дата: 08.08.05 16:21
Оценка:
Здравствуйте, Nose, Вы писали:

N>Здравствуйте, cranky, Вы писали:


C>>Надо придумать, чтобы было так:
strcat("Error",toString(errNum)," while proc....",toString(objNum))
И ничем не хуже плюсов, и для плюсов вполне реально сделать.


N>Для плюсов тогда будет функция с переменным числом параметров. Операторы хотя бы безопасно можно сделать, а тут...

N>Или написать 30 прототипов?

Хм, вроде что-то у Александреску было насчёт списка типов. Может подойдёт для объявления функций с произвольным числом параметров?

N>не знаю, по-моему ничего страшного с "+", к тому же уже привычное старое решение...

N>Никаких глюков, напрягов и пр. от него не знаю -- не встречался.
Также как и некоторые не встречались с memory leak.
N>Читаемо, удобно и стандартно.
Стандартно, конечно, только это единичный случай неправильного использования перегрузки и вообще, исключение из правил.
N>А теоретизирование насчет идеологии ни к чему не ведет.
You aren't expected to absorb this
Re[10]: Перегрузка == героин?
От: Quintanar Россия  
Дата: 08.08.05 16:39
Оценка: +1
Здравствуйте, cranky, Вы писали:

Q>>Идеологически правильный вариант — выбрать другое обозначение для операции конкатенации. Ибо конкатенация по сути — это слияние списков, а не сложение.


C> Ну это совсем идеалистический вариант — представление строки списком, всё-таки нечто с рандомным доступом подошло бы лучше.


Это не совсем идеалистический вариант, кое-где так и сделано. Кроме того, никто не говорит о том, что обязательно нужно представлять строку списком, речь идет о том, что конкатенация по сути — это слияние списков, а не арифметическре сложение, и логично для этого использовать другое обозначение.
Re[6]: Перегрузка == героин?
От: Quintanar Россия  
Дата: 08.08.05 16:55
Оценка: +2
Здравствуйте, adontz, Вы писали:

A>Ага. Свобода не ходить на выборы, свобода когда только один сорт кофе, свобода не думать короче. Это не свобода. Это Богом данное право не напрягать свой мозг. К свободе оно отношения не имеет, оно имеет отношение к лени, экономии времени, низкой квалификации, но никак не к свободе.


Бла-бла-бла. Один кофе только у любителей С++. Другие выбирают между разными языками и смотрят как реализованы идеи там.

A>Нет. У меня есть образование. Например по формуле F = am я понимаю, что сила равная произведению ускорения на массу. Человек вроде вас боится, что за формулой F = am может скрываться, что мощность равная силе тока умноженной на напряжение, но увы любой кто не с Луны свалился и не ставит себе целью выпендриться такими обозначениями пользоваться не станет.


Да ну. Как раз наоборот, вы застряли на уровне ньютоновской механики, в то время как давно уже открыта теория относительности. Можно,конечно, пытаться адаптировать устаревшую теорию к новым знаниям, но стоит ли. Это ведет только к лишним усложнениям когда-то стройной системы.

A>Вам мешает перегрузка? Не пользуйтесь! Но зачем хаять тех кто умеет пользоватся и делает это?

A>Давайте тогда хаять систему распределения памяти в Си++! Конечно! Какой-то дурак не знал что такое вектор, сделал new MyClass[38] и не сделал delete[]. Чем не повод? Система распределения памяти в Си++ полный отстой! Она не накладывает ограничений! Какие там ещё могут быть лозунги? А ну да! Все переходим на .Net!

Да не отстой, поскольку ее фактически нет и каждый вправе сделать свою, но и смысла для 98% задач в ней мало. Для любой программы, где производительность не стоит на не просто 1-м, а 1-м в квадрате месте, GC будет справляться неплохо.

A>Множественно наследование? О ужас! Заставлять человека писать или не писать virtual при наследовании. Какое напряжение мозга! Отменим multiple inheritance! В Хаскеле оно есть? Если нету, то я раз за этот язык — он полон ограничений усиливающих свободу не думать.


Вопреки сложившемуся мнению, программы можно писать вообще без ООП, хотя это, конечно, требует несколько большего интеллекта.

A>Короче хватит Думаешь, что ты умее тех кто, например, разрабатывает Си++? Си++ не сразу стал таким, какой он есть. 90% того что в нём реализовано добавили при утверждении очередного стандарта и не от нечего делать, а потому что в этом была необходимость. В Object Pascal'е который был с TurboPascal перегрузки операторов не было, в Delphi добавили. Думаешь зависть к Си++? Нет! Насущная необходимость!


Object Pascal намного хуже С++, о нем речи вообще быть не может.

A>Так что перегрузка операторов нужна.

A>Стоит ли её ограничивать? Нет, не стоит! Никакое формальное ограничение не выразит человеческую мысль. В результате будь такое ограничение введённым в современный промышленный язык им бы всё равно никто не стал пользоваться. Да, да, современный промышленный язык, на котором пишут сложные системы, а не богом забытый на котором пишут одни энтузиасты.

Странно слышать это от сторонника языка, где нельзя даже создать новый оператор. С++ учиться и учиться гибкости у того же Lisp'a.
Re[3]: Перегрузка == героин?
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 08.08.05 16:58
Оценка:
Здравствуйте, 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
ANS>Эта. А для чего еще она нужна?

Как минимум, она позволяет писать обобщённые конструкции, которые оперируют семантикой перекрываемых операторов. Нпаример, в STL часто пользуются перекрытием operator() для подмены функции функтором. Другой пример, перекрытие operator->() для smart-указателей.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.