Re[5]: Перегрузка == героин?
От: Oyster Украина https://github.com/devoyster
Дата: 08.08.05 08:34
Оценка:
Здравствуйте, cranky, Вы писали:

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


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

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

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

C>Ну да.
("Hello world"-"world") ? "Hello "
Или иначе: как отнимать строки, если сложение (в виде конкатенации) возможно?

C>В случае соединения строк мне больше нравится введение нового оператора в язык, например, тильда в D.

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


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

C>С++ вообще проектировался по принципу минимальных нововведений в синтаксис языка, отсюда и операторы в/в потоков, и обозначение ЧВФ, и некоторые другие вещи.

И мабуть, это таки правильно. На C++ мне нравилось писать std::cout << 1 << " is not " << 2. Но я не спрашивал "почему", я писал "вот, смотрите, тут у них разный смысл".
Re[4]: Перегрузка == героин?
От: Трурль  
Дата: 08.08.05 08:44
Оценка:
Здравствуйте, VladD2, Вы писали:

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


А каково "правильное" значение выражения
(1 2 3) + (4 5 6)

?
Есть по крайней мере 2 варианта
a) (1 2 3 4 5 6)
b) (5 7 9)
Re[5]: Перегрузка == героин?
От: Oyster Украина https://github.com/devoyster
Дата: 08.08.05 08:46
Оценка:
Здравствуйте, Трурль, Вы писали:

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


Т>А каково "правильное" значение выражения

Т>
Т>(1 2 3) + (4 5 6)
Т>

Т>?
Т>Есть по крайней мере 2 варианта
Т>
Т>a) (1 2 3 4 5 6)
Т>b) (5 7 9)
Т>

Есть общепринятая интерпретация для понятия "сложения" двух строк: Re[7]: Перегрузка == героин?
Автор: Oyster
Дата: 08.08.05
Или я опять неправ?
Re[8]: Перегрузка == героин?
От: Трурль  
Дата: 08.08.05 08:49
Оценка:
Здравствуйте, eao197, Вы писали:

E>Если бы перегрузок оператора сдвига не было, мне бы пришлось делать что-то вроде:

E>
E>print( std::cout, "My data: " );
E>print( std::cout, my_data );
E>print( std::cout, ", your data: " );
E>print( std::cout, your_data );
E>print( std::cout, "\n", std::flush );
E>

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


Могло быть и что-то вроде
std::cout.print("My data: " ).print(my_data).print(", your data: ").print(your_data).nl.flush;
Re[6]: Перегрузка == героин?
От: Трурль  
Дата: 08.08.05 08:52
Оценка:
Здравствуйте, Oyster, Вы писали:

O>Есть общепринятая интерпретация для понятия "сложения" двух строк: Re[7]: Перегрузка == героин?
Автор: Oyster
Дата: 08.08.05
Или я опять неправ?


Но есть не менее общепринятая интерпретация для сложения двух векторов.
Re[9]: Перегрузка == героин?
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 08.08.05 08:53
Оценка: +1
Здравствуйте, Трурль, Вы писали:

Т>Могло быть и что-то вроде

Т>
Т>std::cout.print("My data: " ).print(my_data).print(", your data: ").print(your_data).nl.flush;
Т>


Как раз и нет. Ведь print -- это метод std::ofstream и как же мне добавить перегрузку метода print в класс std::ofstream для своего типа?
... << RSDN@Home 1.1.4 stable rev. 510>>


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[7]: Перегрузка == героин?
От: Oyster Украина https://github.com/devoyster
Дата: 08.08.05 08:59
Оценка:
Здравствуйте, Трурль, Вы писали:

O>>Есть общепринятая интерпретация для понятия "сложения" двух строк: Re[7]: Перегрузка == героин?
Автор: Oyster
Дата: 08.08.05
Или я опять неправ?


Т>Но есть не менее общепринятая интерпретация для сложения двух векторов.


Хмм... в C#, например, есть char[] и есть string. Второе также можно назвать "вектором символов", но уже с трудом (string уже как минимум read-only). Согласитесь, когда на таком уровне проводят разделительную черту между массивом символов и строкой, можно считать строку строкой, а не вектором, и переопределить для неё оператор +, поскольку для строки у этого оператора есть только один смысл.
Re[6]: Перегрузка == героин?
От: cranky Украина  
Дата: 08.08.05 09:02
Оценка: -1
Здравствуйте, Oyster, Вы писали:

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


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

C>>Ну да.
("Hello world"-"world") ? "Hello "
Или иначе: как отнимать строки, если сложение (в виде конкатенации) возможно?

C>>В случае соединения строк мне больше нравится введение нового оператора в язык, например, тильда в D.

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

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

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

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

C>>С++ вообще проектировался по принципу минимальных нововведений в синтаксис языка, отсюда и операторы в/в потоков, и обозначение ЧВФ, и некоторые другие вещи.

O>И мабуть, это таки правильно. На C++ мне нравилось писать std::cout << 1 << " is not " << 2. Но я не спрашивал "почему", я писал "вот, смотрите, тут у них разный смысл".

Просто так, на всякий случай напомнить, почему так получилось...
You aren't expected to absorb this
Re[5]: Перегрузка == героин?
От: Кодёнок  
Дата: 08.08.05 09:07
Оценка:
Здравствуйте, Трурль, Вы писали:

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


Т>А каково "правильное" значение выражения

Т>(1 2 3) + (4 5 6)
Т>?
Т>Есть по крайней мере 2 варианта
Т>a) (1 2 3 4 5 6)
Т>b) (5 7 9)

Конкатенация и сложение два разных оператора. Другие языки специально для конкатенации используют не +.

Возможно, для конкатенации лучше использовать & (and). Тогда (1 2 3) & (3 4 5) -> (1 2 3 3 4 5), а (1 2) + (3 3) -> (4 5).
Re[4]: Перегрузка == героин?
От: Трурль  
Дата: 08.08.05 09:09
Оценка:
Здравствуйте, 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>

Соглашусь. Но лично я предпочел бы вместо "+", нечто более оригинальное.
Re[7]: Перегрузка == героин?
От: Oyster Украина https://github.com/devoyster
Дата: 08.08.05 09:11
Оценка: +1
Здравствуйте, cranky, Вы писали:

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

C>>>Ну да.
("Hello world"-"world") ? "Hello "
Или иначе: как отнимать строки, если сложение (в виде конкатенации) возможно?

C>>>В случае соединения строк мне больше нравится введение нового оператора в язык, например, тильда в D.

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

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

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

Да-да-да... но мне всё равно удобнее писать +

Кстати, а почему нельзя перегрузить + для векторов? Вот, скажем, у меня мат. либа для операций над векторами и матрицами...

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

C>>>С++ вообще проектировался по принципу минимальных нововведений в синтаксис языка, отсюда и операторы в/в потоков, и обозначение ЧВФ, и некоторые другие вещи.

O>>И мабуть, это таки правильно. На C++ мне нравилось писать std::cout << 1 << " is not " << 2. Но я не спрашивал "почему", я писал "вот, смотрите, тут у них разный смысл".

C>Просто так, на всякий случай напомнить, почему так получилось...

Ггы. Значит, << можно, а + нет? Нечестно!
Re[7]: Перегрузка == героин?
От: VladD2 Российская Империя www.nemerle.org
Дата: 08.08.05 09:21
Оценка:
Здравствуйте, StanislavK, Вы писали:

SK>Но все остальное более логично выглядит как раз с функциями, а не с операторами.


А чем отличаются другие вэлью-типы или строки?
Size size1 = new Size(10, 20);
Size size2 = new Size(5, 2);
Size size3 = new Size(100, 0);
size1 -= size2;
Size size4 = size1 + size2 + size3;


или
DateTime yesterday = DateTime.Now;
DateTime myBirthday = new DateTime(1974, 4, 25);
TimeSpan age = yesterday - myBirthday;
Console.WriteLine("Я живу: " + (age.Days / 365) + " год ("
    + age.Days + " дней).");

DateTime dt2020 = new DateTime(2020, 1, 1);
Console.WriteLine(dt2020 + " мне буедет " 
    + ((dt2020 - myBirthday).Days / 365));
... << RSDN@Home 1.2.0 alpha rev. 591>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[8]: Перегрузка == героин?
От: VladD2 Российская Империя www.nemerle.org
Дата: 08.08.05 09:21
Оценка:
Здравствуйте, eao197, Вы писали:

E>Если бы перегрузок оператора сдвига не было, мне бы пришлось делать что-то вроде:

E>
E>print( std::cout, "My data: " );
E>print( std::cout, my_data );
E>print( std::cout, ", your data: " );
E>print( std::cout, your_data );
E>print( std::cout, "\n", std::flush );
E>

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


Справидливости ради можно заметить, что потенциально можно сделать функцию с переменным числом полиморфных параметров Тогда код выглядел бы так:
PrintLine("My data: ", my_data, ", your data: ", your_data);

или так:
Console.WriteLine("My data: {0}, your data: {1}", my_data, your_data);

А в некоторых языках можно даже так:
PrintLine("My data: {my_data}, your data: {your_data}");

Откровенно говоря последний вариант мне нравится значитально больше остальных.
... << RSDN@Home 1.2.0 alpha rev. 591>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[6]: Перегрузка == героин?
От: VladD2 Российская Империя www.nemerle.org
Дата: 08.08.05 09:21
Оценка:
Здравствуйте, Oyster, Вы писали:

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


Цитируй, плиз, то что действительно нужно.
... << RSDN@Home 1.2.0 alpha rev. 591>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[8]: Перегрузка == героин?
От: cranky Украина  
Дата: 08.08.05 09:23
Оценка:
Здравствуйте, Oyster, Вы писали:

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


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


O>Да-да-да... но мне всё равно удобнее писать +


O>Кстати, а почему нельзя перегрузить + для векторов? Вот, скажем, у меня мат. либа для операций над векторами и матрицами...


Для цели поэлементного сложения аля сложения векторов — пожалуйста, да и то надо на всяк випадок проверить в справочнике по математике на совпадение последствий этого действия со смыслом сложения для скалярных типов. Но я имел в виду именно конкатенацию векторов, что вполне себе имеет право быть.

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

C>>>>С++ вообще проектировался по принципу минимальных нововведений в синтаксис языка, отсюда и операторы в/в потоков, и обозначение ЧВФ, и некоторые другие вещи.

O>>>И мабуть, это таки правильно. На C++ мне нравилось писать std::cout << 1 << " is not " << 2. Но я не спрашивал "почему", я писал "вот, смотрите, тут у них разный смысл".

C>>Просто так, на всякий случай напомнить, почему так получилось...

O>Ггы. Значит, << можно, а + нет? Нечестно!


Случай битовых сдвигов не имеет столь древней истории применения в математике, как арифметических действий, поэтому возможности для перегрузки у них разные. Опять же, ИМХО.
You aren't expected to absorb this
Re[9]: Перегрузка == героин?
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 08.08.05 09:33
Оценка: +1
Здравствуйте, VladD2, Вы писали:

VD>Справидливости ради можно заметить, что потенциально можно сделать функцию с переменным числом полиморфных параметров Тогда код выглядел бы так:

VD>
VD>PrintLine("My data: ", my_data, ", your data: ", your_data);
VD>

VD>или так:
VD>
VD>Console.WriteLine("My data: {0}, your data: {1}", my_data, your_data);
VD>

VD>А в некоторых языках можно даже так:
VD>
VD>PrintLine("My data: {my_data}, your data: {your_data}");
VD>

VD>Откровенно говоря последний вариант мне нравится значитально больше остальных.

Справедливости ради можно добавить, что в зависимости от левого операнда оператора сдвига выполняемое действие может очень сильно меняться:
// Просто печатаем на поток вывода.
std::cout << my_data << std::endl;

// Получаем XML сериализацию.
Xml_Serializer xml;
xml << my_data;

// Получаем ASN1 PER сериализацию.
Asn1per_Serializer asn1;
asn1 << my_data;

// Вычисляем MD5-хеш двоичного образа.
Md5_Hash hash;
hash << my_data;


Особенно здорово такой полиморфизм использовать в сочетании с шаблонами:
template< class Stream, class Data >
class Some_Functor
    {
        Stream & stream_;
    public :
        Some_Functor( Stream & stream )
            :    stream_( stream )
            {}
            
        void
        operator( const Data & data )
            {
                <...bla-bla-bla...>
                stream_ << data;
                <...bla-bla-bla...>
            }
    };

...
std::for_each( my_data_list.begin(), my_data_list.end(),
    Some_Functor< Xml_Serializer, My_Data >( xml ) );
std::for_each( my_data_list.begin(), my_data_list.end(),
    Some_Functor< Asn1per_Serializer, My_Data >( asn1 ) );
std::for_each( my_data_list.begin(), my_data_list.end(),
    Some_Functor< Md5_Hash, My_Data >( hash ) );
... << RSDN@Home 1.1.4 stable rev. 510>>


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[7]: Перегрузка == героин?
От: Oyster Украина https://github.com/devoyster
Дата: 08.08.05 09:36
Оценка:
Здравствуйте, VladD2, Вы писали:

Обычно я не оверквочу, но мне пришлось оставить самую первую фразу:

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


потому как в ней было словосочетание, на которое ссылался мой оппонент:

ANS>В критикуемой цитате об этом и говорится.


Все последующие фразы также не смог выбросить, т.к. без контекста диалог был бы непонятен. Поэтому никакого оверквотинга — всё легально
Re[8]: Перегрузка == героин?
От: Andrei N.Sobchuck Украина www.smalltalk.ru
Дата: 08.08.05 10:27
Оценка: -1
Здравствуйте, Oyster, Вы писали:

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


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


Как по мне, то есть более приемлемый вариант — введение нового оператора, a-la "&" в VB, "," в ST или упоминавшееся выше "~" в D.
Кстати, в развитие темы, зачем ограничиваться строками? В ST "," применим ко всем упорядоченным коллекциям. Типа:
#(1 2 3) , #(4 5 6)
Результат #(1 2 3 4 5 6)
... << RSDN@Home 1.1.4 stable rev. 510>>
Я ненавижу Hibernate
Автор: Andrei N.Sobchuck
Дата: 08.01.08
!
Re[9]: Перегрузка == героин?
От: Oyster Украина https://github.com/devoyster
Дата: 08.08.05 10:41
Оценка: +1
Здравствуйте, Andrei N.Sobchuck, Вы писали:

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


ANS>Как по мне, то есть более приемлемый вариант — введение нового оператора, a-la "&" в VB, "," в ST или упоминавшееся выше "~" в D.

ANS>Кстати, в развитие темы, зачем ограничиваться строками? В ST "," применим ко всем упорядоченным коллекциям. Типа:
ANS>#(1 2 3) , #(4 5 6)
ANS>Результат #(1 2 3 4 5 6)

Согласен, но такая фича должна быть встроена в язык. Т.е. из тех операторов, что есть в C++ (C#), наилучший кандидат — именно +. И использовать его для конкатенации строк не есть зло.
Re: Перегрузка == героин?
От: opossum  
Дата: 08.08.05 10:46
Оценка: 44 (6) +3
Здравствуйте, Курилка, Вы писали:

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


Перегрузка — диспетчеризация по типу аргумента(-ов), выполняемая на
этапе компиляции.
Чтобы обсуждать/осуждать перегрузку полезно понимать суть
диспетчеризации вообще, и по типам в частности.

В приводимой статье вообще нет слова dispatch, а есть Heroin и drug,
что выдает ее явно популистско-провокационный характер.

Уже при построении системы числовых типов,
integer->rational->float->complex, обычно называемой numeric-tower,
из-за линейной иерархии, мы сталкиваемся с необходимостью приведения
типов, и введении обобщенных операторов, диспетчеризации по типу.

Отличное введение, которое бы не помешало прочесть автору статьи
содержится в уже упоминавшейся на rsdn книге :
SICP 'Structure and Interpretation of Computer Programs'
http://www.rsdn.ru/Forum/Message.aspx?mid=978416&amp;only=1
Автор: Gaperton
Дата: 08.01.05

http://www.rsdn.ru/Forum/Message.aspx?mid=1298543&amp;only=1
Автор: opossum
Дата: 29.07.05


в разделе
2.5 Systems with Generic Operations
http://mitpress.mit.edu/sicp/full-text/book/book-Z-H-18.html#%_sec_2.5

Там приведено решение для динамической (в run-time) диспетчеризации по
типу, дан обзор _реальных_ проблем порождаемых арифметикой типов,
приведением и диспетчеризацией.

А если следовать логике автора — давайте заклеймим ветвление (if),
выбор (switch), и хеш таблицы — все же это можно использовать для
(о ужас!) диспетчеризации.

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