Здравствуйте, SWW, Вы писали:
S>>> и чем Equals хуже == ????? И другие эквивалентные операторы.
SWW>Тем что текст становится меньше похож на математическую формулу. (Только пожалуйста, не надо в сотый раз про паскалевское сравнение). Кстати, MOD вместо % хуже по той же причине.
А вот здесь уже дело привычки. То есть ты считаешь,
что ассемблерная комада была бы предпочтительней в таком виде
% EAX,ECX
/ EAX,ECX
<< EAX,ECX >> EAX,ECX
и ^ лучше чем XOR ???? Причем в разных языках эти закорючки могут обозначать разные вещи.
И ты против введения булева типа, когда в С
float g;
if (g) нормальное явление и более читабельно чем if ( g.IsNull ) (делая проверку на погрешность) ????
... << RSDN@Home 1.1.0 stable >>
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, folk, Вы писали:
F>Здравствуйте, Kh_Oleg, Вы писали:
F>[]
K_O>>Оператор сложения для строк, означающий конкатенацию — это, пожалуй, единственное применение перегрузки операторов, где оно действительно необходимо. А все потому, что в ЯП строка должна быть базовым типом! Таким как char, int, double. Так и string. K_O>>Вот для базовых (примитивных) типов операторы должны быть определены. Но не для составных типов, определяемых программистом!
F>Я практически не вижу разницы между перегрузкой операторов и перегрузкой функций. Функция "divide" не имеет никаких преимуществ перед оператором "/" для пользовательского типа. Как раз наоборот.
"/" — это только divide. Тогда как в случае с методом я могу в имени отразить особенности реализации: SafeDivide, IntDivide, FloatDivide.
WH>>>ЗЗЫ А тех кто перегружает операторы не интуетивным образом надо сжигать на костре и предавать анафиме... K_O>> Но почему язык позволяет таким индивидуумам так хулиганить? F>Язык позволяет хулиганить с функциями ничуть не меншье.
F>ЗЫ И мне непонятно, чего ты стал придираться к неинициализированным переменным у WH. Если бы он использовал функции вместо операторов, то эти переменные инициализировались бы сами собой?
Нет, конечно. Просто это привычка.
Здравствуйте, WolfHound, Вы писали:
K_O>>Я скажу еще вот что: без перегрузки мы имеем один цикл, а с перегрузкой — столько циклов, сколько использовано перегруженных операторов. Из-за сомнительной красоты кода мы еще жертвуем и производительностью. WH> Ты недооцениваешь С++. Цикл будет один.
Тогда, видно, не С++, а оптимизатор. Только все равно непонятно — можно подробней?
Здравствуйте, WolfHound, Вы писали:
WH>Здравствуйте, Serginio1, Вы писали:
S>> f= a.div(x).add(5).mull(b).sub( y.mull(c).sub(d.div(5))).div(e).sub(z) WH>А y это float...
Ну я ж говорил, что нельзя будет отличить переменные от массивов...
Здравствуйте, Serginio1, Вы писали:
S> Но лучше тогда S> f= a.VectorDiv(x).IntAdd(5).VectorMull(b).VectorSub( c.FloatMull(y).VectorSub(d.IntDiv(5))).VectorDiv(e).VectorSub(z)
А с — и / что будешь делать?
Короче очень скоро получишь вариант еще хуже чем я привел...
И разве оно того стоит?
К томуже этот вариант не эквивалентен моему ибо не f= а f*= остальное проверять в лом ибо прочитать это совершенно не возможно.
... << RSDN@Home 1.1.3 beta 1 >>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Здравствуйте, Kh_Oleg, Вы писали:
K_O>"/" — это только divide. Тогда как в случае с методом я могу в имени отразить особенности реализации: SafeDivide, IntDivide, FloatDivide.
учитывая то как правило нет ни каких SafeDivide, IntDivide, FloatDivide..., а есть только divide то какой смысл?
... << RSDN@Home 1.1.3 beta 1 >>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Здравствуйте, Serginio1, Вы писали:
S> А вот здесь уже дело привычки. То есть ты считаешь, S> что ассемблерная комада была бы предпочтительней в таком виде
Вот только не надо путать асм и С++ ладно.
то во что превращается С++ если перегрузку операторов заменить на функции я уже показал. S> И ты против введения булева типа, когда в С
В С++ есть булеа тип bool называется. S> if (g) нормальное явление и более читабельно чем if ( g.IsNull ) (делая проверку на погрешность) ????
И в каком язые так можно писать? И какую погрешьность брать?
... << RSDN@Home 1.1.3 beta 1 >>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Здравствуйте, WolfHound, Вы писали:
WH>Здравствуйте, Serginio1, Вы писали:
S>> А вот здесь уже дело привычки. То есть ты считаешь, S>> что ассемблерная комада была бы предпочтительней в таком виде WH>Вот только не надо путать асм и С++ ладно.
Вообщето речь не идет о конкретном языке, а о языке для обучения WH>то во что превращается С++ если перегрузку операторов заменить на функции я уже показал.
И при этом ничем не лучше для понимания, считаю мой пример более читабелен S>> И ты против введения булева типа, когда в С WH>В С++ есть булеа тип bool называется. S>> if (g) нормальное явление и более читабельно чем if ( g.IsNull ) (делая проверку на погрешность) ???? WH>И в каком язые так можно писать? И какую погрешьность брать?
Еще раз разговор идет только об идеальном языке для обучения.
Для вещественных типов погрешность относительная величина правильнее конечно писать что типа
if ( g.IsNull(1) )
как и g.Equqls(g2)
... << RSDN@Home 1.1.0 stable >>
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, WolfHound, Вы писали:
WH>Здравствуйте, Serginio1, Вы писали:
S>> Но лучше тогда S>> f= a.VectorDiv(x).IntAdd(5).VectorMull(b).VectorSub( c.FloatMull(y).VectorSub(d.IntDiv(5))).VectorDiv(e).VectorSub(z) WH>А с — и / что будешь делать? WH>Короче очень скоро получишь вариант еще хуже чем я привел... WH>И разве оно того стоит? WH>К томуже этот вариант не эквивалентен моему ибо не f= а f*= остальное проверять в лом ибо прочитать это совершенно не возможно.
Ну это легко
f= f.VectorMull( a.VectorDiv(x).IntAdd(5).VectorMull(b).VectorSub( c.FloatMull(y).VectorSub(d.IntDiv(5)) ).VectorDiv(e).VectorSub(z))
Но дело в том, что и твой пример не блещет понятливостью.
А здесь понятны все действия без лишних перегрузок.
... << RSDN@Home 1.1.0 stable >>
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, Kh_Oleg, Вы писали:
S>>> f= a.div(x).add(5).mull(b).sub( y.mull(c).sub(d.div(5))).div(e).sub(z) WH>>А y это float... K_O>Ну я ж говорил, что нельзя будет отличить переменные от массивов...
А если имена будут говорящие? тиа arr1, arr2, arr3... scalar1, scalar2...
Ы? А программы которые состоят из односимвольных переменных всеравно ни кто прочитать не может.
... << RSDN@Home 1.1.3 beta 1 >>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Здравствуйте, Kh_Oleg, Вы писали:
WH>> Ты недооцениваешь С++. Цикл будет один. K_O>Тогда, видно, не С++, а оптимизатор. Только все равно непонятно — можно подробней?
Не оптимизатор(хотя и ему тоже поработать немного придется), а именно С++.
Фишка в том что тут используются ленивые вычисления те оператор не производит никаких дествий, а только запоминает ссылки на то что ему попало и возвращает структуру которая содержит эти ссылки.
В книжке это все лучше описано.
Поясняю не пальцах:
Шаблон массива параметризуется не только типом но и хранилищем для этого типа. По умолчанию я взял std::vector
Здравствуйте, Serginio1, Вы писали:
S> f= f.VectorMull( a.VectorDiv(x).IntAdd(5).VectorMull(b).VectorSub( c.FloatMull(y).VectorSub(d.IntDiv(5)) ).VectorDiv(e).VectorSub(z))
S> Но дело в том, что и твой пример не блещет понятливостью.
Нда? S> А здесь понятны все действия без лишних перегрузок.
только перегрузка исходника дикая
И ты не ответил на вопрос что с - и / делать будешь те например
arr1=const1/(const2-arr2);
или
arr1=5/(6-arr2);
В любом случае не состоятельность твоей методики из-за дичайшой перегрузки текста лишними подробностями ИМХО очевидна.
WH>В любом случае не состоятельность твоей методики из-за дичайшой перегрузки текста лишними подробностями ИМХО очевидна.
WH>болие того см мой пост Re[14]: Читать всем!!!! ОБЯЗАТЕЛЬНО!!!!
твоя реализация без перегрузок не будет обладать тойже эффективностью.
Мне лично непонятны сами действия.
Надо понимать это выглядит так
for (int i=0; i< arr.Length; i++)
{
arr[i]= 5/(6-arr[i]);
}
И прошу прощения такая записись мне лично больше понятна. Причем математически она буде выглядеть так же , только без for Конечно можно извращяться как угодно, но
ты пытаешься выразить математическое описание (векторную алгебру) средствами С++. А здесь нужен подход ФЯ. И запись должна быть четкой и понятной.
Твоя же запись не выражает общего смысла.
... << RSDN@Home 1.1.0 stable >>
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, WolfHound, Вы писали:
WH>>> Ты недооцениваешь С++. Цикл будет один. K_O>>Тогда, видно, не С++, а оптимизатор. Только все равно непонятно — можно подробней? WH>Не оптимизатор(хотя и ему тоже поработать немного придется), а именно С++. WH>Фишка в том что тут используются ленивые вычисления....... WH> Мно-ого skipped WH>Вот такие дела
Е-мое, "и эти люди запрещают мне ковыряться в носу?!"
И это все ради того, чтобы вместо Add писать +, опускать индексы у массивов и не писать явно оператор цикла?!
Кроме того считаю, что в программирование легко ввести и математическую запись, ничто этому не мешает.
И тем же студентам легче и читабельность выше, а с точки зрения тезнического Вуза это куда важнее, т.к. там не нужны программисты, но нужно средство для решения конкретных задач. Кстати многие пользуются MathCad или как его там. Хотя бы в определенных вставках типа asm.
Развитие же языков идет ввиде совершенствования старых языков, которые сами по себе морально устарели, но мало делается в плане развития других подходов или вернее не развиваются и не внедряются должным образом.
... << RSDN@Home 1.1.0 stable >>
и солнце б утром не вставало, когда бы не было меня
WH>А теперь добавь сюда дебужную проверку того что размер всех массивов в выражении одинаковый.
А это еще что за проверка, куда копать?
Тем не менее, зачем смотреть на debug издержки? Заказчику Debug не поставляется.
WH>>>А ты скачай boost да посмотри. K_O>>Мне уже и STL'ного отстоя хватает, это время пригодится для более важных целей. WH> А слабо аргументировано обосновать отстойность STL? WH>Я надеюсь, что разговариваю с человеком, умеющим аргументированно спорить.(С) Ты.
Точно, я.
Да все тоже — нечитабельные исходники, наворочено куча всего, flexibility офигенная, а usability страдает.
Больше половины фич используются крайне редко. Лично я кроме string, exception, vector'a и map'a ничего и не использовал.
Шаблоны, опять-таки — допустишь ошибку где-то у себя, а компилятор посылает куда-то в недра STL...
Короче, это тема отдельного флейма.
WH>>>Да по исходникам ты в ней не разберешься... K_O>>Это вообще приговор библиотеке и выговор разработчикам. Если я по исходникам не разберусь, то и сами разработчики этой либы через некоторое время отсутствия практики работы с boost перестанут понимать в чем дело. WH>Для того чтобы разобратся в полутра метрах исходников даже учитывая что они очень качественно написаны, да еще и не прочитав предварительно доки Не реально.
Ну почему нереально? — во-первых, мне не надо разбираться во всем, а только в той ма-аленькой части, которая интересует в данный момент; во-вторых, полтора метра — это немного, в VCL более семи метров и ничего, не только можно разобраться, но и для своих задач ценные идеи почерпнуть.
K_O>>Общего у них только название. Сложение чисел и сложение векторов — принципиально разные операции даже в математике. WH>Не вижу принципиальной разници. Да и в математике они записываются одинаково.
Сложение чисел проходят в первом классе, а векторов — почему-то в седьмом. Да еще всякие разные приемы используют, типа правило треугольника, правило паралелограмма. А операция вычитания векторов — так ли она очевидна, как вычитание чисел?
K_O>>И не dot и cross, а ScalarProduct и CrossProduct. // <== Опечатка вкралась WH>А в D3DX они называются D3DXVec3Dot и D3DXVec3Cross соответственно. WH>Я взял терминологию от туда.
Это что ли, пример хорошего идентификатора? Когда 4 символа — это префикс.
K_O>>Здесь хочу сказать еще вот что: важность правильного именования идентификаторов трудно переоценить. Причем очень важно добиваться того, чтобы имя метода не примерно отражало реализацию, а в точности соответствовало ей. Порой добиться этого непросто. Но зато такая тщательность приводит к тому, что код становится читабельным и понятным. WH>Говоришь то ты правильно но твом методы добится этого мягко говоря сомнительны. WH>Не плодите сущьности без необходимости (С) Не помню. WH>Зачем вводить сущьность ComposeVectorVector когда есть всем понятная сущьность + ? Не понимаю.
Не ComposeVectorVector, а Compose(Vector v1, Vector v2) или Vector.Compose(Vector v)
Здравствуйте, WolfHound, Вы писали:
WH>Здравствуйте, Kh_Oleg, Вы писали:
K_O>>"/" — это только divide. Тогда как в случае с методом я могу в имени отразить особенности реализации: SafeDivide, IntDivide, FloatDivide. WH>учитывая то как правило нет ни каких SafeDivide, IntDivide, FloatDivide..., а есть только divide то какой смысл?
Как правило они есть! Только неявные, что порождает еще массу ошибок.
int a = 1, b = 2;
double aa = 1, bb = 2;
выражения a/b и aa/bb дадут сильно разные результаты.
WH>А теперь добавь сюда дебужную проверку того что размер всех массивов в выражении одинаковый.
Но если напрмер определить тип
using int[30] Vector30;
Vector30 a,b,c,d;
можно и динамически
то
запись типа
for(int i= vector30.LoBound; i<=vector30.HiBound; i++)
f[i] *= (a[i] / x + 5) * b[i] — (y * c[i] — d[i] / 5) / e[i] — z;
Не вызывала бы дебужную проверку.
... << RSDN@Home 1.1.0 stable >>
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, Kh_Oleg, Вы писали:
K_O>Е-мое, "и эти люди запрещают мне ковыряться в носу?!" K_O>И это все ради того, чтобы вместо Add писать +, опускать индексы у массивов и не писать явно оператор цикла?!
Если это используется один раз то это одно, а если подобних выражений сотни? K_O>Моя крыша слегка съехала...
Если твоя крыша начала ехать на таком примитиве то я тебе крайне не рекомендую изучать спирит по его исходникам.
Ибо там для генерации парсера используется подобные технологии.
... << RSDN@Home 1.1.3 beta 1 >>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Здравствуйте, Kh_Oleg, Вы писали:
K_O>А это еще что за проверка, куда копать?
ну типа
ASSERT(a.size()==b.size()&&b.size()==c.size()&&c.size()==d.size() и так далие...); K_O>Тем не менее, зачем смотреть на debug издержки? Заказчику Debug не поставляется.
Но он нужен разработчику. Ведь язык это же для разработчика, ане для заказчика. Ему как правило пофигу на чем написана программа главное чтобу работала и была написана в срок.
K_O>Да все тоже — нечитабельные исходники, наворочено куча всего,
С этим ни чего не поделать. Стандарт обязывает так страшно именовать детали реализации STL чтобы не пересечся с клиентским кодом. Долбаные макросы K_O>flexibility офигенная,
Дык это же хорошо. K_O>а usability страдает.
Хм. ИМХО вполне достаточно. K_O>Больше половины фич используются крайне редко.
Это проблема всех библиотек общего назначения. K_O>Лично я кроме string, exception, vector'a и map'a ничего и не использовал.
Я еще использую list, set, алгоритмы+boost::lambda, а также пока не стандартные hash_map и hash_set
Ты какой компилятор используешь? Например VC++7.1 позволяет перейти не в недра STL а туда откуда пошла бага.
K_O>Ну почему нереально? — во-первых, мне не надо разбираться во всем, а только в той ма-аленькой части, которая интересует в данный момент;
Концепцию спирита из исходников не читая доков востановить очень сложно. Но прочитав доки и поняв что и для чего исходники читаются довольно легко. K_O>во-вторых, полтора метра — это немного, в VCL более семи метров и ничего, не только можно разобраться, но и для своих задач ценные идеи почерпнуть.
Тут надо учитывать что VCL это паскаль... А выразительность паскаля на единицу кода гораздо меньше чем у С++. Это раз.
Спирит это шаблонная библиотека которая использует метапрограммирование на всю катушку. А это абстрации несколько иного порядка чем VCL. Это два.
Спирит на дельфе написать не возможно. Это три.
K_O>Сложение чисел проходят в первом классе, а векторов — почему-то в седьмом.
Ну ты попробуй обьяснить что такое вектор первокласнику K_O>Да еще всякие разные приемы используют, типа правило треугольника, правило паралелограмма. K_O>А операция вычитания векторов — так ли она очевидна, как вычитание чисел?
Да и при чем тут это?
K_O>Это что ли, пример хорошего идентификатора? Когда 4 символа — это префикс.
А я разве говорил что это хорошие идентификаторы? Я сказал что взял терминологию от туда. Кстати не знаю как в других областях но в трехмерной графике используют термин dot product, а не scalar product.
K_O>Не ComposeVectorVector, а Compose(Vector v1, Vector v2) или Vector.Compose(Vector v)
А чем оно лучше + я всеравно не понимаю.
... << RSDN@Home 1.1.3 beta 1 >>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн