Кому ваще этот С++ нужен?
От: кубик  
Дата: 18.05.15 15:43
Оценка: 1 (1) +2 -3 :))) :))) :))) :))) :))
Всем привет,
Я вощем то С++ программист, звезд с неба не хватаю, писал всяикий аккаунтинг в стиле С++ с классами.
Сейчас открыл книгу Effective Modern C++ про С++14,С++11 и думаю, блин, для кого они все это придумывают?! Для самих себя?

Напрмиер было:

typedef void (*FP)(int, const std::string&); // typedef

Стало:

using FP = void (*)(int, const std::string&);

Там, мля, целый комитет умников сидит, они что, сразу не могут примдумать как нормально сделать?
Конечно как бы все улучшилось, но это только потому что до этого все ухудшалось так что и компилер не сразу выпустишь.
Re: Кому ваще этот С++ нужен?
От: kr510  
Дата: 18.05.15 17:12
Оценка: +1
Здравствуйте, кубик, Вы писали:

К>Всем привет,

К>Я вощем то С++ программист, звезд с неба не хватаю, писал всяикий аккаунтинг в стиле С++ с классами.
К>Сейчас открыл книгу Effective Modern C++ про С++14,С++11 и думаю, блин, для кого они все это придумывают?! Для самих себя?

Да, читаемость кода порой лучше не стала. Порой надо прилагать усилия что-бы понять какие типы стоят за auto. Получается своеобразный write-only код. С другой стороны, хорошо, что язык развивается. Никто, обычно, не заставляет пихать всё самое последнее.
Re[2]: Кому ваще этот С++ нужен?
От: Nikе Россия  
Дата: 18.05.15 17:27
Оценка: +5 :)
Здравствуйте, kr510, Вы писали:

K>Да, читаемость кода порой лучше не стала.

Читаемость кода порой стала намного лучше. А если код нечитаем — то скорее всего ручки не от туда растут
Нужно разобрать угил.
Re: Кому ваще этот С++ нужен?
От: jazzer Россия Skype: enerjazzer
Дата: 18.05.15 17:45
Оценка: 1 (1) +6 :))) :))) :))) :))) :))) :)
Здравствуйте, кубик, Вы писали, что С++ не нужен.
Вы совершенно правы.
Спасибо.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[2]: Кому ваще этот С++ нужен?
От: Grienders Земля  
Дата: 18.05.15 18:24
Оценка:
Здравствуйте, jazzer, Вы писали:

J>Здравствуйте, кубик, Вы писали, что С++ не нужен.

J>Вы совершенно правы.
J>Спасибо.

а у тебя, кстати, грамматическая ошибка в подписи.
Re[2]: Кому ваще этот С++ нужен?
От: Sheridan Россия  
Дата: 18.05.15 21:36
Оценка: +1
Здравствуйте, kr510, Вы писали:
K>Да, читаемость кода порой лучше не стала. Порой надо прилагать усилия что-бы понять какие типы стоят за auto.
А разве кто-то заставляет этот auto трогать?
Matrix has you...
Re: Кому ваще этот С++ нужен?
От: smeeld  
Дата: 18.05.15 21:42
Оценка: +2 -1 :)))
Здравствуйте, кубик, Вы писали:

К>Там, мля, целый комитет умников сидит, они что, сразу не могут примдумать как нормально сделать?

К>Конечно как бы все улучшилось, но это только потому что до этого все ухудшалось так что и компилер не сразу выпустишь.

Не беспокойтесь, когда C++ окончательно разовьётся, он приобретёт вид того самого Cи c классами, которым
Страус рукоблудил сам с собой в самом начале этого C++-психоза. Всё остальное, что придумали в последние 20 лет,
из С++ просто выкинут.
Re[2]: Кому ваще этот С++ нужен?
От: Cyberax Марс  
Дата: 19.05.15 00:07
Оценка: +1 -1
Здравствуйте, smeeld, Вы писали:

S>Не беспокойтесь, когда C++ окончательно разовьётся, он приобретёт вид того самого Cи c классами, которым

S>Страус рукоблудил сам с собой в самом начале этого C++-психоза. Всё остальное, что придумали в последние 20 лет,
S>из С++ просто выкинут.
Не надо бредить. В современном С++ нафиг никому не сдались те самые классы с виртуальным наследованием и прочим.

А вот деструкторы, шаблоны и умные указатели очень даже используются.
Sapienti sat!
Re: Кому ваще этот С++ нужен?
От: кубик  
Дата: 19.05.15 01:29
Оценка: :))) :)
Я забулькало после главы const_iterator. Мне уверяли еще оч давно (STL я учил по докам еще скачаным с SGI), используйте их, но я их не использовал. потому что как че, все надо будет менять на обыч итераторы. Я еще думал, че они пристали с конст итераторами. Они сами их вообще используют ?

Сейчас этот Майерс опять пишет: С98 с конст итераторами было грустно:

Просто что б поискать одно число и вставить после него или в конец другое:

typedef std::vector<int>::iterator IterT; // typetypedef
std::vector<int>::const_iterator ConstIterT; // defs

ConstIterT ci = std::find(static_cast<ConstIterT>(values.begin()), static_cast<ConstIterT>(values.end()), 1983);
values.insert(static_cast<IterT>(ci), 1998);

Блин, тут на туннельн синдром заработаещь запросто! Столько приходится писать лишнего ...
Re[3]: Кому ваще этот С++ нужен?
От: kr510  
Дата: 19.05.15 03:45
Оценка:
Здравствуйте, Sheridan, Вы писали:

K>>Да, читаемость кода порой лучше не стала. Порой надо прилагать усилия что-бы понять какие типы стоят за auto.

S>А разве кто-то заставляет этот auto трогать?

Типа часть новых с11 плюшек. Об этом, вроде, идёт речь в топике.
Re: Кому ваще этот С++ нужен?
От: мыщъх США http://nezumi-lab.org
Дата: 19.05.15 04:27
Оценка: 1 (1) :))) :)))
Здравствуйте, кубик, Вы писали:

Subj: Кому ваще этот С++ нужен?
хз. я тут в сша никак не встречу никого кому бы он был нужен. везде чистый си без плюсов. правда у меня специализация. уже не только с винды слез, но и даже с интела и сейчас вижу все больше MIPS вокруг себя. ARM за ним идет с большим отрывом. а винда... ну она как бы есть. в магазине. но хз кто под нее что разрабатывает и почему.
americans fought a war for a freedom. another one to end slavery. so, what do some of them choose to do with their freedom? become slaves.
Re[4]: Кому ваще этот С++ нужен?
От: Sheridan Россия  
Дата: 19.05.15 04:30
Оценка:
Здравствуйте, kr510, Вы писали:

S>>А разве кто-то заставляет этот auto трогать?


K>Типа часть новых с11 плюшек. Об этом, вроде, идёт речь в топике.


Ну, без auto вполне жить можно.
Matrix has you...
Re: Кому ваще этот С++ нужен?
От: 0BD11A0D  
Дата: 19.05.15 06:20
Оценка: 12 (7) +6 :))) :)))
Здравствуйте, кубик, Вы писали:

Последние лет десять думаю об этом. История, по-моему, была такая.

Изначально у сей (не плюсов) была ниша кросс-платформенного ассемблера — полный (и, ключевой момент — естественный) доступ к железу и скорость. Важным моментом был сокращенный синтаксис — все эти {}, &, *, ?: и так далее.

Параллельно существовали мощные объектно-ориентированные языки, которые обладали очень слабой производительностью. Страуструп писал на одном таком серьезную систему, не смог добиться перфы, плюнул и переписал на сях, после чего создал для себя новый инструмент — немного классов, чтоб организовывать код, и транслятор в си. Это была свободная ниша и плюсы туда пришлись как нельзя лучше, что и обеспечило им господство на долгие годы.

Потом пришла пора шаблонного программирования и начались чудеса.

Во-первых, фокус с функционала переместился на «архитектуру». Извините меня, но std:(w)string это ХУДШАЯ РЕАЛИЗАЦИЯ строк, которую я когда либо видел. Она же не умеет просто ничего! Форматирование? Старый добрый си. Перевод регистра? Либо явный перебор, либо навесной бустовский алгоритм (и да, буст до сих пор НЕ часть языка). Смена UTF-8 на UTF-16? Самописный велосипед. Для чего нужен класс, который ничего полезного не делает? Служит флажком в земле (штандартом)? Разве в стандартной библиотеке Си были функции для штандартизации? Нет, они все делали что-то очень полезное.

А это очень важный звоночек. Он звенит, когда программисты перестают заниматься чем-то полезным (для непрограммистов) и начинают страдать херней, раздуваясь от ЧСВ.

Во-вторых, шаблоны пошли вразрез с тем, что добавлял Страуструп. Вместо инкапсуляции алгоритмов под капот, чтобы не запинаться при работе над частной задачей, все кишки вытащили наружу и шагу ступить нельзя, чтобы не попасть в какой-нибудь a.begin(), a.end(), b.end().

Дальше — хуже. Сокращенный синтаксис стал черезвычайно многословным. static_cast<T>(o) вместо (T*) o и прочие бла-бла-бла. Шаблоны стали использоваться для чего угодно помимо обобщения. В библиотеке, претендующей на штандартность (бусте) встречаются трюки типа использования наследования для достраивания функционала (less или как там его). Не в реализации, нет! В юзерском коде! Производительность всего этого дела неявно падала все время. Если почитать, что пишут создатели требовательных к перфе приложений (движков, например), это будет «никакого STL никогда и ни за что!». А прогресс ведь тоже на месте не стоял и железо становилось мощнее. Неудивительно, что в TIOBE плюсы вдвое уступают как голому C, так и медленной Джаве.

Единственное преимущество, которое у плюсов остается, это ВЕНДОРОНЕЗАВИСИМОСТЬ. С Джавой связываться — тащить ее на целевую платформу, а ни хостеры, ни виндовые юзеры ее очень не любят. Шарп — ну, понятно, до недавнего времени это был evil Microsoft (что дальше с ним будет — увидим).

Резюме: стоит хорошему языку вырваться на волю, и конец этой груде мусора.
Re[2]: Кому ваще этот С++ нужен?
От: greenpci  
Дата: 19.05.15 07:04
Оценка: 1 (1) +2 :)
Здравствуйте, 0BD11A0D, Вы писали:

BDA>Во-первых, фокус с функционала переместился на «архитектуру». Извините меня, но std:(w)string это ХУДШАЯ РЕАЛИЗАЦИЯ строк, которую я когда либо видел. Она же не умеет просто ничего! Форматирование? Старый добрый си. Перевод регистра? Либо явный перебор, либо навесной бустовский алгоритм (и да, буст до сих пор НЕ часть языка). Смена UTF-8 на UTF-16? Самописный велосипед. Для чего нужен класс, который ничего полезного не делает? Служит флажком в земле (штандартом)? Разве в стандартной библиотеке Си были функции для штандартизации? Нет, они все делали что-то очень полезное.


да, ладно. std::string нужен для управления памятью и ничего лишнего. Это минимализм, товарищь. Тот самый, который является идеалом создателей гугла. В книжках пишут, что stl включает в себя только то, чем пользуются наибольшее количество программистов. Пихать все подряд в один класс — это антипатерн, который запрещен на всех языках. Поэтому все вынесено в разные блоки.

BDA>А это очень важный звоночек. Он звенит, когда программисты перестают заниматься чем-то полезным (для непрограммистов) и начинают страдать херней, раздуваясь от ЧСВ.


А на каком языке такого нет? В джава скрипте что-ли? Они на всех языках этим занимаются. Самый чистый язык в этом плане, это Си. Все остальное плодородная почва для "технических игр". Вы бы видели что происходит на дот нете. Там, каждые пол года выпускают новый подход (к параллелизации например) и каждый, кто выучил очередной подход, начинает гордиться и пихать его везде, куда не надо.

BDA>Во-вторых, шаблоны пошли вразрез с тем, что добавлял Страуструп. Вместо инкапсуляции алгоритмов под капот, чтобы не запинаться при работе над частной задачей, все кишки вытащили наружу и шагу ступить нельзя, чтобы не попасть в какой-нибудь a.begin(), a.end(), b.end().


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

BDA>Дальше — хуже. Сокращенный синтаксис стал черезвычайно многословным. static_cast<T>(o) вместо (T*) o и прочие бла-бла-бла. Шаблоны стали использоваться для чего угодно помимо обобщения. В библиотеке, претендующей на


это потому, что static_cast это антипатерн. Так и было задумано, чтобы его реже использовали и он резал глаза.

BDA>штандартность (бусте) встречаются трюки типа использования наследования для достраивания функционала (less или как там его). Не в реализации, нет! В юзерском коде! Производительность всего этого дела неявно падала все


я читал про разные тесты коней в вакууме, где доказывалось, что дот нет такой же быстрый, как и Си плюс плюс. А теперь запустите и закройте Студию десять раз, а потом Qt Creator. Разница очень существенная.

BDA>Единственное преимущество, которое у плюсов остается, это ВЕНДОРОНЕЗАВИСИМОСТЬ. С Джавой связываться — тащить ее на целевую платформу, а ни хостеры, ни виндовые юзеры ее очень не любят. Шарп — ну, понятно, до недавнего времени это был evil Microsoft (что дальше с ним будет — увидим).


а сколько всего уже написано на плюсах, особенно бесплатного. Жадные и богатые корпорации обажают экономить и брать все забесплатно. А скрутить все части в один продукт легко даже на плюсах.

BDA>Резюме: стоит хорошему языку вырваться на волю, и конец этой груде мусора.


Для этого нужно очень много времени и высокие затраты без быстрой отдачи. В современном мире это все сложнее и сложнее. Все хотят денег прямо сейчас. Теперь никто не даст очередному "Страуструпу" сидеть и ваять новый язык.
Re[3]: Кому ваще этот С++ нужен?
От: smeeld  
Дата: 19.05.15 07:48
Оценка: +1 -2 :))) :)))
Здравствуйте, Cyberax, Вы писали:

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


Вы говорите как школяр. Ни деструкторы, ни умные указатели (дибилизм сами по себе) не есть хоть
немного значимая фишки C++, а шаблоны вообще ущербны, по сравнению с средствами, предназначенными
для тех же целей, присутствующими в других ЯП. Сравните для начала С++ шаблоны с Лисповыми макросами.
Re[3]: Кому ваще этот С++ нужен?
От: kr510  
Дата: 19.05.15 07:56
Оценка:
Здравствуйте, Cyberax, Вы писали:

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


шаблоны, конечно, пользуют, но с ними тоже надо аккуратно. Чуть что посложнее и опять получаем write only код. Да и держать реализацию в .h как-то криво.
Re[2]: Кому ваще этот С++ нужен?
От: Nikе Россия  
Дата: 19.05.15 11:00
Оценка:
Здравствуйте, 0BD11A0D, Вы писали:

BDA>Во-первых, фокус с функционала переместился на «архитектуру». Извините меня, но std:(w)string это ХУДШАЯ РЕАЛИЗАЦИЯ строк, которую я когда либо видел.

Сюрпрайз — это НЕ является реализацией строк. Это контейнер для хранения строк.
А так, да, штука убогая, как и реализация потоков.
И list без стратегий тоже почти бесполезен.
Нужно разобрать угил.
Re[3]: Кому ваще этот С++ нужен?
От: 0BD11A0D  
Дата: 19.05.15 12:40
Оценка:
Здравствуйте, greenpci, Вы писали:

G>да, ладно. std::string нужен для управления памятью и ничего лишнего. Это минимализм, товарищь. Тот самый, который является идеалом создателей гугла. В книжках пишут, что stl включает в себя только то, чем пользуются наибольшее количество программистов. Пихать все подряд в один класс — это антипатерн, который запрещен на всех языках. Поэтому все вынесено в разные блоки.


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

Во-вторых, нет слова «антипаттерн», вас кто-то обманул. Неявная теория за этим словом стоит такая: есть книжка GoF и там перечислены паттерны. Они хорошие и их надо употреблять. А есть всякие паблики морозовы. Они плохие и их употреблять не надо. Потому и антипаттерны. Есть, кстати, более изощренная версия этой теории: что паттерн это просто обобщение, а в книжке GoF перечислены как плохие, так и хорошие паттерны, но нейтрально, без указания кто из них кто. Что наводит на вопрос, почему банда скрыла такую ценную информацию от народа. А на самом деле, наши взгляды просто меняются и то, что вчера казалось хорошим, сегодня кажется плохим. Я уж молчу, что все это в контексте какой-то цели, которая у вас с гуглом может быть разная.

Так вот, про цели и объяснения. Что значит «минимализм»? Ничего лишнего в бинарях? Это C++, он статически линкуется, главное, дайте исходники. Я вас уверяю, что если никто не вызовет String::Split, этот код в конечный продукт не попадет. Ничего лишнего в головах? Ну так он там и так есть, поскольку есть в ECMAScript. Или, может быть, в хайлоудных проектах гугла ни одна универсальная реализация не годится, ибо подправленная реализация даже с выигрышем в миллисекунду дает общий профит? И поэтому гугл-wannabe программисты в говноконторах так старательно следуют этим правилам? У меня для них плохая новость: вряд ли программисты с допросвещенческим майндсетом нужны в гугле.

BDA>>А это очень важный звоночек. Он звенит, когда программисты перестают заниматься чем-то полезным (для непрограммистов) и начинают страдать херней, раздуваясь от ЧСВ.


G>А на каком языке такого нет? В джава скрипте что-ли? Они на всех языках этим занимаются. Самый чистый язык в этом плане, это Си. Все остальное плодородная почва для "технических игр". Вы бы видели что происходит на дот нете. Там, каждые пол года выпускают новый подход (к параллелизации например) и каждый, кто выучил очередной подход, начинает гордиться и пихать его везде, куда не надо.


Дело не в том, где такого совсем нет. Дело в том, что платят за результат (который сам на 3/4 очковтирательство, но это неважно). И программист, ориентированный на результат, сталкивается с тем, что во всех приличных языках в системной библиотеке есть нужный ему код, а в этом языке — нет. Что делает язык не очень подходящим для использования программистами, ориентированными на результат. О чем и речь.

BDA>>Во-вторых, шаблоны пошли вразрез с тем, что добавлял Страуструп. Вместо инкапсуляции алгоритмов под капот, чтобы не запинаться при работе над частной задачей, все кишки вытащили наружу и шагу ступить нельзя, чтобы не попасть в какой-нибудь a.begin(), a.end(), b.end().


G>Это компенсируется стабильностью. Опытный программист обучается обходить грабли и использует это умение много лет. Да, порог вхождения выше, зато, когда вошел, выходить не надо еще много лет, в отличии от того же дот нета.


Перефразаирую: да, дерьмо, но зато они его не исправляли много лет. От себя добавлю: и не собираются.

BDA>>Дальше — хуже. Сокращенный синтаксис стал черезвычайно многословным. static_cast<T>(o) вместо (T*) o и прочие бла-бла-бла. Шаблоны стали использоваться для чего угодно помимо обобщения. В библиотеке, претендующей на


G>это потому, что static_cast это антипатерн. Так и было задумано, чтобы его реже использовали и он резал глаза.


Опять антипаттерн. Ну ладно, а какой кастинг не антипаттерн? Только не говорите, что все — они и без указателей нужны, а уж с указателями-то просто must have.

BDA>>штандартность (бусте) встречаются трюки типа использования наследования для достраивания функционала (less или как там его). Не в реализации, нет! В юзерском коде! Производительность всего этого дела неявно падала все


G>я читал про разные тесты коней в вакууме, где доказывалось, что дот нет такой же быстрый, как и Си плюс плюс. А теперь запустите и закройте Студию десять раз, а потом Qt Creator. Разница очень существенная.


Я тут одному товарищу рассказывал уже, но он мне не поверил. Сильно подозреваю, не осилил драйвера или держит какой-нибудь MacAfee. Поставьте себе не откровенно плохой SSD размером на полтерабайта, установите на него систему, файл подкачки, поставьте побольше памяти и у вас все, включая фотошоп, будет запускаться настолько быстро, насколько возможно. В частности, разницы между QtCreator'ом и студией вы не увидите.

Кроме того, есть, знаете ли, разница в функционале между первым и вторым.

BDA>>Единственное преимущество, которое у плюсов остается, это ВЕНДОРОНЕЗАВИСИМОСТЬ. С Джавой связываться — тащить ее на целевую платформу, а ни хостеры, ни виндовые юзеры ее очень не любят. Шарп — ну, понятно, до недавнего времени это был evil Microsoft (что дальше с ним будет — увидим).


G>а сколько всего уже написано на плюсах, особенно бесплатного. Жадные и богатые корпорации обажают экономить и брать все забесплатно. А скрутить все части в один продукт легко даже на плюсах.


Много раз слышал это утверждение, но на практике оно, чаще всего, означает стопицотый велосипед, который делает то, что FCL умела с первой версии. Если же речь идет о чем-то узкоспециализированном, то есть, вещах с малым инпутом и большой обработкой внутри, никто не мешает собирать ее в модуль и дергать откуда угодно.

BDA>>Резюме: стоит хорошему языку вырваться на волю, и конец этой груде мусора.


G>Для этого нужно очень много времени и высокие затраты без быстрой отдачи. В современном мире это все сложнее и сложнее. Все хотят денег прямо сейчас. Теперь никто не даст очередному "Страуструпу" сидеть и ваять новый язык.


Страуструп, по-моему, это делал в рамках прикладной задачи. Богатыри, не мы, и т.д. и т.п.
Re[3]: Кому ваще этот С++ нужен?
От: 0BD11A0D  
Дата: 19.05.15 13:28
Оценка: +3 :)
Здравствуйте, Nikе, Вы писали:

BDA>>Во-первых, фокус с функционала переместился на «архитектуру». Извините меня, но std:(w)string это ХУДШАЯ РЕАЛИЗАЦИЯ строк, которую я когда либо видел.

N>Сюрпрайз — это НЕ является реализацией строк. Это контейнер для хранения строк.
N>А так, да, штука убогая, как и реализация потоков.
N>И list без стратегий тоже почти бесполезен.

Если в том месте, где у других языков находится класс для работы со строками (а то и два, если иммутабельность), у C++ находится контейнер для хранения, это значит, что вот такие вот там строки.

Я все могу простить. И то, что эстетически система наименований делалась людьми, которые, очевидно, мало книжек в детстве читали. И даже то, что operator wchar_t* («wchar_t»! буэ!) в строках нет (те, кто говорят, что он там небезопасен — вспомните, как писали на MFC, а ТАМ ОН БЫЛ. Хоть раз это привело к проблемам? Расскажите, не стесняйтесь). Но вот то, что без скачивания носорога-буста под лозунгом минимализьма или возврата к старым добрым C-функциям, со строкой мало что полезного можно сделать — это простить нельзя никак.
Re[4]: Кому ваще этот С++ нужен?
От: Nikе Россия  
Дата: 19.05.15 13:46
Оценка:
Здравствуйте, 0BD11A0D, Вы писали:

BDA>>>Во-первых, фокус с функционала переместился на «архитектуру». Извините меня, но std:(w)string это ХУДШАЯ РЕАЛИЗАЦИЯ строк, которую я когда либо видел.

N>>Сюрпрайз — это НЕ является реализацией строк. Это контейнер для хранения строк.
N>>А так, да, штука убогая, как и реализация потоков.
N>>И list без стратегий тоже почти бесполезен.

BDA>Если в том месте, где у других языков находится класс для работы со строками (а то и два, если иммутабельность), у C++ находится контейнер для хранения, это значит, что вот такие вот там строки.

Да, язык в этом плане кривой, приходится использовать велосипеды.

BDA>Я все могу простить. И то, что эстетически система наименований делалась людьми, которые, очевидно, мало книжек в детстве читали. И даже то, что operator wchar_t* («wchar_t»! буэ!) в строках нет (те, кто говорят, что он там небезопасен — вспомните, как писали на MFC, а ТАМ ОН БЫЛ. Хоть раз это привело к проблемам? Расскажите, не стесняйтесь).

Он там не нужен. Есть специальная функция. А я вообще уже лет 8 не использую char* и wchar_t* для чего-либо, кроме связи с другими либами. Но все эти связи заврапленны и не видны.
Нужно разобрать угил.
Re[5]: Кому ваще этот С++ нужен?
От: 0BD11A0D  
Дата: 19.05.15 13:58
Оценка:
Здравствуйте, Nikе, Вы писали:

BDA>>Я все могу простить. И то, что эстетически система наименований делалась людьми, которые, очевидно, мало книжек в детстве читали. И даже то, что operator wchar_t* («wchar_t»! буэ!) в строках нет (те, кто говорят, что он там небезопасен — вспомните, как писали на MFC, а ТАМ ОН БЫЛ. Хоть раз это привело к проблемам? Расскажите, не стесняйтесь).

N>Он там не нужен. Есть специальная функция. А я вообще уже лет 8 не использую char* и wchar_t* для чего-либо, кроме связи с другими либами. Но все эти связи заврапленны и не видны.

Не всем так повезло. У некоторых на подобные wrapping'и приходится изрядная часть кода (например, в типичном WinAPI-приложении) и каждый раз при наличии строк в аргументах необходимость писать (или еще хуже — читать!) этот c_str()...
Re[6]: Кому ваще этот С++ нужен?
От: Nikе Россия  
Дата: 19.05.15 14:54
Оценка:
Здравствуйте, 0BD11A0D, Вы писали:

BDA>Не всем так повезло. У некоторых на подобные wrapping'и приходится изрядная часть кода (например, в типичном WinAPI-приложении) и каждый раз при наличии строк в аргументах необходимость писать (или еще хуже — читать!) этот c_str()...


Под виндой есть замечательный ATL/WTL CString
Нужно разобрать угил.
Re[7]: Кому ваще этот С++ нужен?
От: 0BD11A0D  
Дата: 19.05.15 15:43
Оценка:
Здравствуйте, Nikе, Вы писали:

BDA>>Не всем так повезло. У некоторых на подобные wrapping'и приходится изрядная часть кода (например, в типичном WinAPI-приложении) и каждый раз при наличии строк в аргументах необходимость писать (или еще хуже — читать!) этот c_str()...


N>Под виндой есть замечательный ATL/WTL CString


Это тот же CString, что и в MFC, насколько я знаю. Про него я написал выше. Но тащить из-за одной строки ATL/WTL... Так и рождается... мнэ... неоднозначное отношение к языку, который в стандартной библиотеке ничего близко похожего не предлагает.
Re[3]: Кому ваще этот С++ нужен?
От: koandrew Канада http://thingselectronic.blogspot.ca/
Дата: 19.05.15 15:46
Оценка: +2 :)
Здравствуйте, Cyberax, Вы писали:

C>Не надо бредить. В современном С++ нафиг никому не сдались те самые классы с виртуальным наследованием и прочим.


Виртуальное наследование — очень полезная фишка, потому что про него очень удобно спрашивать на собеседованиях, когда нужно завалить кандидата. Т.к. этой фичей реально никто не пользуется, то о ней никто путью и не знает
[КУ] оккупировала армия.
Re[8]: Кому ваще этот С++ нужен?
От: Nikе Россия  
Дата: 19.05.15 16:09
Оценка: +1
Здравствуйте, 0BD11A0D, Вы писали:

N>>Под виндой есть замечательный ATL/WTL CString


BDA>Это тот же CString, что и в MFC, насколько я знаю. Про него я написал выше. Но тащить из-за одной строки ATL/WTL... Так и рождается... мнэ... неоднозначное отношение к языку, который в стандартной библиотеке ничего близко похожего не предлагает.


Почему ради одной? Нормальный класс-строка. Мы сделали кросс-платформенный аналог + скрестили его с симбиановскими дескрипторами — и получилось то, с чем можно работать, без общущения, что тебя насилуют.
Нужно разобрать угил.
Re: Кому ваще этот С++ нужен?
От: кубик  
Дата: 19.05.15 16:30
Оценка:
Я че еще на С++ то взъелся, прочитал тут про Erlang, там вообще не парятся со многими вещами. Даж по поводу рекурсии, типа там стека не хватит или еще че.
Синтаксис страшно непривычный но чего ... вообще его можно было использовать для всего, для чего мы использовали с++ с корбой. Я конечно там ничего не решал, но все равно.
Re: Кому ваще этот С++ нужен?
От: DreamMaker  
Дата: 19.05.15 17:14
Оценка: -1 :)
Здравствуйте, кубик, Вы писали:

К>Там, мля, целый комитет умников сидит, они что, сразу не могут примдумать как нормально сделать?


C++ — это инструмент стреляния по ногам.
и вообще. если все маразмы из С++ убрать, а все чего не хватает — сделать, получится С#
In P=NP we trust.
Re[2]: Кому ваще этот С++ нужен?
От: Константин Черногория  
Дата: 19.05.15 19:48
Оценка: +1 -1
Здравствуйте, 0BD11A0D, Вы писали:

BDA>Параллельно существовали мощные объектно-ориентированные языки, которые обладали очень слабой производительностью. Страуструп писал на одном таком серьезную систему, не смог добиться перфы

Это ты Simula 67 сейчас обозвал "мощным объектно-ориентированным"?

BDA>Во-первых, фокус с функционала переместился на «архитектуру».

Не столько на архитектуру, сколько на попытках запихнуть в стандартную С++ библиотеку функционал, который бы примерно одинаково работал на всех поддерживаемых платформах, т.е. и на PIC12, и на Itanium.
Поскольку этого практически невозможно достичь (слишком разные они все), имеем то шо имеем.

BDA>Извините меня, но std:(w)string это ХУДШАЯ РЕАЛИЗАЦИЯ строк, которую я когда либо видел. Она же не умеет просто ничего!

С этим согласен.

BDA>Во-вторых, шаблоны пошли вразрез с тем, что добавлял Страуструп.

А с этим нет.
Это не шаблоны виноваты в том, что афтары STL и Boost их так используют.
В качестве примеров хороших, годных шаблонов посмотри на ATL, там тоже есть и строки, и контейнеры, и смартпоинтеры, только сделано всё по-нормальному, и работает обычно сильно быстрее, а иногда так даже на порядки быстрее, чем то же самое в STL.

BDA>Единственное преимущество, которое у плюсов остается, это ВЕНДОРОНЕЗАВИСИМОСТЬ.

Не только.
Например производительность, возможность писать низкоуровневый код если нужно, относительная кросс-платфременность.

BDA>Резюме: стоит хорошему языку вырваться на волю, и конец этой груде мусора.

Хорошие языки давно есть, в том числе для той же ниши, где щас С++. Например знакомые D используют.

Однако я не буду сильно удивлён, если эта груда мусора ещё нас обоих переживёт.
Слишком уж много проектов на нём, и старых и новых, вот например весь рынок видеоигр плотненько сидит на плюсах.
Re: Кому ваще этот С++ нужен?
От: Zenden Россия  
Дата: 19.05.15 20:47
Оценка: 6 (2) +8 :))) :))) :))) :))) :))) :))) :)
Здравствуйте, кубик, Вы писали:

К>Всем привет,

К>Я вощем то С++ программист, звезд с неба не хватаю, писал всяикий аккаунтинг в стиле С++ с классами.
К>Сейчас открыл книгу Effective Modern C++ про С++14,С++11 и думаю, блин, для кого они все это придумывают?! Для самих себя?

Я люблю С++, в нем большой простор для творчества!
Чтобы написать приложение, нужно уметь писать костыли под разные компиляторы и платформы,
Люблю изучать информативные сообщения об ошибках (access violation at adresss 0xFFFFFFFF)
Люблю С++ за скорость компиляции (можно сходить куда-нибудь по делам)
Люблю препроцессор, особенно макросы, они делают код живым.
Никогда не знаешь, что сломает компиляцию на этот раз (С++ любит удивлять!)
Люблю заниматься перекомпилированием библиотек под разные компиляторы, дебаг/релиз, статик/шаред,64 бит/32 бит
Люблю получать странные ошибки линковки и медитировать над ними.
Люблю собирать опен-сурс проекты под виндой (интересно проходить этот квест)
Люблю многообразие систем сборки для С++.


Не то что эти всякие попсовые Сишарпы/жавы для слабаков. Написал код, а он просто работает. Скучно ведь!
Чувствуешь себя ненужным.
Re[2]: Кому ваще этот С++ нужен?
От: CreatorCray  
Дата: 19.05.15 20:55
Оценка: 1 (1) +4 -2
Здравствуйте, Zenden, Вы писали:

Z>Чтобы написать приложение, нужно уметь писать костыли под разные компиляторы и платформы,

Большинству реально пох, мало кому надо более двух платформ.

Z>Люблю изучать информативные сообщения об ошибках (access violation at adresss 0xFFFFFFFF)

При чём тут С++?
И кстати такая ошибка просто подарок — можно быстро локализовать. Логические ошибки в коде куда хуже.

Z>Люблю С++ за скорость компиляции (можно сходить куда-нибудь по делам)

Давно уже летает пулей в умелых руках.

Z>Люблю препроцессор, особенно макросы, они делают код живым.

Это вообще то С а не С++.

Z>Никогда не знаешь, что сломает компиляцию на этот раз (С++ любит удивлять!)

О чём ты?

Z>Люблю заниматься перекомпилированием библиотек под разные компиляторы, дебаг/релиз, статик/шаред,64 бит/32 бит

Это всё автоматизируется уже много лет как.

Z>Люблю получать странные ошибки линковки и медитировать над ними.

Например?

Z>Люблю собирать опен-сурс проекты под виндой (интересно проходить этот квест)

Обычно потому, что опенсурсники кроме как под свой линукс ни про что другое и не думали.

Z>Люблю многообразие систем сборки для С++.

Вижуалку и make никто не отменял.

Z>Не то что эти всякие попсовые Сишарпы/жавы для слабаков. Написал код, а он просто работает.

Если бы всё было так просто
Re[4]: Кому ваще этот С++ нужен?
От: Cyberax Марс  
Дата: 19.05.15 21:05
Оценка: +1 -1
Здравствуйте, smeeld, Вы писали:

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

S>Вы говорите как школяр.
/me смотрит на свои два проданных стартапа. Ну да, для восьмого класса школы вполне нормально.

S>Ни деструкторы, ни умные указатели (дибилизм сами по себе) не есть хоть

S>немного значимая фишки C++, а шаблоны вообще ущербны, по сравнению с средствами, предназначенными
S>для тех же целей, присутствующими в других ЯП. Сравните для начала С++ шаблоны с Лисповыми макросами.
Шаблоны решают ровно те задачи, которые чаще всего нужны — типизированные контейнеры. Как макросы для сложного метапрограммирования их используют не так часто.

Ну а деструкторы — вообще основная фича С++.
Sapienti sat!
Re[3]: Кому ваще этот С++ нужен?
От: 0BD11A0D  
Дата: 19.05.15 23:00
Оценка:
Здравствуйте, Константин, Вы писали:

BDA>>Параллельно существовали мощные объектно-ориентированные языки, которые обладали очень слабой производительностью. Страуструп писал на одном таком серьезную систему, не смог добиться перфы

К>Это ты Simula 67 сейчас обозвал "мощным объектно-ориентированным"?

Ничего про нее не знаю, кроме того, что вспомнил (возможно неправильно) из рассказа С. Сейчас посмотрел:

Simula 67 introduced objects,[1]:2, 5.3 classes,[1]:1.3.3, 2 inheritance and subclasses,[1]:2.2.1 virtual methods,[1]:2.2.3 coroutines,[1]:9.2 and discrete event simulation,[1]:14.2 and features garbage collection.[1]:9.1


Да, рядом с голым Си рискнул бы назвать "мощным объектно-ориентированным". Впрочем, если это вам принципиально, мне — абсолютно нет. Готов согласиться на немощность, т.к. не вижу, что это меняет.

BDA>>Во-первых, фокус с функционала переместился на «архитектуру».

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

Подождите, но ведь C как-то умудряется примерно одинаково работать там и сям. Что мешало инкапсулировать printf? Допустим, то, что было в сях, обернули, чего не было — проигнорили. Разве это не будет достаточно логично? Но ведь так не сделали.

BDA>>Во-вторых, шаблоны пошли вразрез с тем, что добавлял Страуструп.

К>А с этим нет.
К>Это не шаблоны виноваты в том, что афтары STL и Boost их так используют.
К>В качестве примеров хороших, годных шаблонов посмотри на ATL, там тоже есть и строки, и контейнеры, и смартпоинтеры, только сделано всё по-нормальному, и работает обычно сильно быстрее, а иногда так даже на порядки быстрее, чем то же самое в STL.

На самом деле вы согласны, просто еще этого не знаете. Имелись в виду не абстрактные шаблоны, а the шаблоны, то есть те, что Степанов с Ли сочинили. Разумеется, шаблонные классы от Майкрософт (хоть ATL, хоть — в другом языке — FCL) лишены указанной... особенности. Но! В стандарт они не вошли, а вошло сами знаете что.

BDA>>Единственное преимущество, которое у плюсов остается, это ВЕНДОРОНЕЗАВИСИМОСТЬ.

К>Не только.
К>Например производительность, возможность писать низкоуровневый код если нужно, относительная кросс-платфременность.

Первые два пункта: это до тех пор, пока вы остаетесь в рамках старой парадигмы «Си с классами». Я встречал то ли на кремниевой тайге, то ли на геймдеффе (падонкавском, а не который .ру) душещипательный рассказ о неудовлетворительном падении перфоманса после попыток использовать (правильным образом, конечно) STL. То есть, при попытке использовать удобства, которые есть в других языках, в тех приложениях, которым перфоманс жизненно важен (3D-движках, например) результат будет принципиально неудовлетворительным. Что остается? Скорость в два раза выше в тех приложениях, в которых это не принципиально? Кого это волнует, кроме «пофиксившихся» на идее.

Третий пункт: я не думаю, что кросс-платформенность важна настолько, насколько мы привыкли думать. Возьмите мой пример с Джавой. У хостеров нет проблем с тем, чтобы запустить ее на своих серверах. Желания только нет. Как, впрочем, и плюсовые кастомные CGI.
Re[4]: Кому ваще этот С++ нужен?
От: Cyberax Марс  
Дата: 19.05.15 23:42
Оценка: +1
Здравствуйте, 0BD11A0D, Вы писали:

BDA>Первые два пункта: это до тех пор, пока вы остаетесь в рамках старой парадигмы «Си с классами». Я встречал то ли на кремниевой тайге, то ли на геймдеффе (падонкавском, а не который .ру) душещипательный рассказ о неудовлетворительном падении перфоманса после попыток использовать (правильным образом, конечно) STL. То есть, при попытке использовать удобства, которые есть в других языках, в тех приложениях, которым перфоманс жизненно важен (3D-движках, например) результат будет принципиально неудовлетворительным.

Ой, ну что за кретинический бред. В STL все контейнеры тупые и понятные, там просто нечему тормозить, особенно после добавления move-конструкторов.

Из того, что я видел, чаще всего страдают из-за того, что в STL не так много всего. Т.е. если нужен контейнер указателей, то не думая берут vector<shared_ptr<...>>, а потому репу чешут и пишут на форумы о тормозах STL.

Сейчас единственное улучшение в нашей внутренней STL — это специализация векторов для POD-объектов, которые можно сразу через memcpy копировать. Это изменение ускорило некоторые приложения, но не кардинально.
Sapienti sat!
Re[4]: Кому ваще этот С++ нужен?
От: Константин Черногория  
Дата: 20.05.15 00:26
Оценка: +1
Здравствуйте, 0BD11A0D, Вы писали:

BDA>

Simula 67 introduced objects,[1]:2, 5.3 classes,[1]:1.3.3, 2 inheritance and subclasses,[1]:2.2.1 virtual methods,[1]:2.2.3 coroutines,[1]:9.2 and discrete event simulation,[1]:14.2 and features garbage collection.[1]:9.1

Лично ты бы взял первую в природе реализацию подобных фундаментальных концепций для чего угодно в production?

BDA>Подождите, но ведь C как-то умудряется примерно одинаково работать там и сям.

C++ тоже везде прекрасно работает, но мы же щас не про язык, а про библиотеки.
Стандартная библиотека C реализует только какие-то совсем базовые вещи. Например программируя под Win32/64, часто можно обойтись вовсе без CRT, ибо не нужна.

BDA>Что мешало инкапсулировать printf?

Переполнения буферов, производительность, неправильное дизайн-решение афтаров STL про типобезопасность.

BDA>Допустим, то, что было в сях, обернули, чего не было — проигнорили.

Ну скажем про строки и iostreams так и сделали. Cам же пишешь, что не особо полезные получились. В частности потому шо в CRT не хватает разных критически важных кусков.
Про строки не хватает например unicode, date+time и прочей глобализации, про IO не хватает асинхронности, обработки ошибок, и вообще всего, что нужно для написания чего-то сложнее, чем printf("Hello world").

BDA> В стандарт они не вошли, а вошло сами знаете что.

Стандарт сильно волнует только студентов, преподавателей, и ещё глупых разработчиков каких-то SDK. Всем остальным на него пофигу.

BDA>душещипательный рассказ о неудовлетворительном падении перфоманса после попыток использовать (правильным образом, конечно) STL.

STL в играх не нужен, про это в индустрии уже давно в курсе.

BDA>при попытке использовать удобства, которые есть в других языках, в тех приложениях, которым перфоманс жизненно важен (3D-движках, например) результат будет принципиально неудовлетворительным.

Зависит исключительно от кривизны рук пользующего. Из личного опыта — современный C++, со всеми его шаблонами и полиморфизмом, прекрасно работает например на Nintendo Wii (кстати о производительности и портируемости — там всего 700 MHz CPU с архитектурой Power).
Причём при правильном использовании он и эффективнее (потому что при правильном использовании шаблонов они много всего инлайнят а потом компилятор много всего оптимизирует), и безопаснее, чем C, неважно с классами или без.

Конечно для индустрии в целом это скорее проблема: из-за того что язык сложный, погроммистов с правильной кривизной рук мало, а те что есть, много хотят кушать.
Поэтому где становится можно, обычно двигают от плюсов в сторону чего-нибудь более дружественного разработчику. Скажем лет 10 назад с C++ валили разработчики опердней, переходя на Java и C#.
Для игр однако это не очень критично, по следующим причинам: (1) Программисты всё равно обходятся в разы дешевле, чем арт (2) Код игр уже давно разделили на ядро (обычно С++) и скрипты (часто LUA). (3) Развитый рынок middleware, заточенный в основном на C++ клиентов, усложняет миграцию.

BDA>я не думаю, что кросс-платформенность важна настолько, насколько мы привыкли думать.

От ниши зависит. Например игры должны быть портируемыми на разные X86-64, ARM и Power.
Re[5]: Кому ваще этот С++ нужен?
От: Константин Черногория  
Дата: 20.05.15 00:38
Оценка: :))
Здравствуйте, Cyberax, Вы писали:

C>Ой, ну что за кретинический бред.

Он абсолютно прав.

C>В STL все контейнеры тупые и понятные, там просто нечему тормозить, особенно после добавления move-конструкторов.

На каждый чих кидают С++ исключения.
На каждый чих конструируют объекты new/delete: динамическая память в играх не нужна, чем статичнее, тем обычно всё лучше работает, тем более на консолях и мобильниках точно известно, сколько именно есть той памяти.
Для этих new/delete берут память из CRT heap, к которой тоже есть вопросы.

C>Сейчас единственное улучшение в нашей внутренней STL — это специализация векторов для POD-объектов

Интересно, есть ли среди ваших target platforms консоли? Мобильники? Или только PC и x86 сервера?
Re[6]: Кому ваще этот С++ нужен?
От: Cyberax Марс  
Дата: 20.05.15 01:23
Оценка: 1 (1)
Здравствуйте, Константин, Вы писали:

C>>В STL все контейнеры тупые и понятные, там просто нечему тормозить, особенно после добавления move-конструкторов.

К>На каждый чих кидают С++ исключения.
Для большинства контейнеров — только bad_alloc, который можно игнорировать. Остальное — только в специальных методах, которые явно проверяют границы (.at).

К>На каждый чих конструируют объекты new/delete: динамическая память в играх не нужна, чем статичнее, тем обычно всё лучше работает, тем более на консолях и мобильниках точно известно, сколько именно есть той памяти.

Где именно "на каждый чих"? В спеке С++ чётко прописано, когда коллекции будут делать распределения памяти и ничего неожиданного там нет совершенно.

И про игры не надо — во многих играх сейчас вообще GC используется вовсю.

К>Для этих new/delete берут память из CRT heap, к которой тоже есть вопросы.

В STL можно использовать свои аллокаторы, которые в С++11 ещё и stateful. Так что никто не мешает использовать арены, пулы или разделяемую память.

C>>Сейчас единственное улучшение в нашей внутренней STL — это специализация векторов для POD-объектов

К>Интересно, есть ли среди ваших target platforms консоли? Мобильники? Или только PC и x86 сервера?
Есть, конечно же. А чем они нынче от обычных PC отличаются?
Sapienti sat!
Re[5]: Кому ваще этот С++ нужен?
От: Evgeny.Panasyuk Россия  
Дата: 20.05.15 03:01
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>Сейчас единственное улучшение в нашей внутренней STL — это специализация векторов для POD-объектов, которые можно сразу через memcpy копировать. Это изменение ускорило некоторые приложения, но не кардинально.


А какую STL используете? В современных реализациях STL подобная оптимизация встроена.
Re[6]: Кому ваще этот С++ нужен?
От: Cyberax Марс  
Дата: 20.05.15 03:14
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

C>>Сейчас единственное улучшение в нашей внутренней STL — это специализация векторов для POD-объектов, которые можно сразу через memcpy копировать. Это изменение ускорило некоторые приложения, но не кардинально.

EP>А какую STL используете? В современных реализациях STL подобная оптимизация встроена.
На основе libc++, там такой оптимизации нет. Иногда компилятор сам догадывается, но явная оптимизация оказалась лучше.
Sapienti sat!
Re[7]: Кому ваще этот С++ нужен?
От: Evgeny.Panasyuk Россия  
Дата: 20.05.15 03:45
Оценка: +1
Здравствуйте, Cyberax, Вы писали:

C>>>Сейчас единственное улучшение в нашей внутренней STL — это специализация векторов для POD-объектов, которые можно сразу через memcpy копировать. Это изменение ускорило некоторые приложения, но не кардинально.

EP>>А какую STL используете? В современных реализациях STL подобная оптимизация встроена.
C>На основе libc++, там такой оптимизации нет.

Насколько я вижу, в libc++ для is_trivially_copy_assignable используется memmove (1, 2).
Re[6]: Кому ваще этот С++ нужен?
От: kr510  
Дата: 20.05.15 03:50
Оценка:
Здравствуйте, Константин, Вы писали:

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



C>>Сейчас единственное улучшение в нашей внутренней STL — это специализация векторов для POD-объектов

К>Интересно, есть ли среди ваших target platforms консоли? Мобильники? Или только PC и x86 сервера?

На мобильниках наиболее распространены: Objective C, Java и C#. Всё это ещё те тормоза и им до проблем высших порядков типа динамической-статической памяти как до Луны.
Re[7]: Кому ваще этот С++ нужен?
От: Константин Черногория  
Дата: 20.05.15 04:14
Оценка:
Здравствуйте, kr510, Вы писали:

K>На мобильниках наиболее распространены: Objective C, Java и C#.

Для приложений да.
Для игр нет, на плюсах обычно, OpenGL ES (iOS, Android) / Direct3D (WP8).

K>Всё это ещё те тормоза и им до проблем высших порядков типа динамической-статической памяти как до Луны.

С точностью наоборот.
Когда ресурсов много, как например на сервере, в котором 16 ядер 128 GB RAM, как правило работают даже сборщики мусора, не говоря уж про динамическую память.
Re[4]: Кому ваще этот С++ нужен?
От: greenpci  
Дата: 20.05.15 07:33
Оценка:
Здравствуйте, 0BD11A0D, Вы писали:

BDA>Во-первых, это бездумная ссылка на авторитетов, которая, как паттерн поведения, устарела еще до Просвещения. Ну, гугл, и что? Нам, современным людям, нужно объяснение, почему это плохо. Объяснения я не увидел.


Да, согласен. Я, признаться, думал, что это ты любишь гугл и для тебя это авторитет. Ты говорил про результат и "делом надо заниматься, а не программированием". Вот гугл денег много заработал, дел выгодных много сделал, карманы набил. Я думал, ну раз ты человек бизнеса, то это тебе ближе. Ну раз это не так, тогда ладно. Стало быть ты тоже инженер и программист. Тогда дам тебе ссылку на подробное объяснение почему пихать все в один класс не рекомендуется. C++ Coding Standards. Chapter 33. Prefer minimal classes to monolithic

BDA>Во-вторых, нет слова «антипаттерн», вас кто-то обманул. Неявная теория за этим словом стоит такая: есть книжка GoF и там перечислены паттерны.

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

BDA>Так вот, про цели и объяснения. Что значит «минимализм»? Ничего лишнего в бинарях? Это C++, он статически линкуется, главное, дайте исходники. Я вас уверяю, что если никто не вызовет String::Split, этот код в конечный продукт не попадет. Ничего лишнего в головах? Ну так он там и так есть, поскольку есть в ECMAScript. Или, может быть, в хайлоудных проектах гугла ни одна универсальная реализация не годится, ибо подправленная реализация даже


Ну есть еще SOLID и S это single responsibility. Подробное объяснение есть в гугле. Если с ним конкретно не согласен, можно подискутировать. Я сам согласен с ним и на практике для себя его подтвердил.

BDA>Дело не в том, где такого совсем нет. Дело в том, что платят за результат (который сам на 3/4 очковтирательство, но это неважно). И программист, ориентированный на результат, сталкивается с тем, что во всех приличных языках в системной библиотеке есть нужный ему код, а в этом языке — нет. Что делает язык не очень подходящим для использования программистами, ориентированными на результат. О чем и речь.


Так а кто запрещает использовать несколько библиотек. Зачем все должно быть в системной. Ведь лучше чтобы все занимались тем, что у них лучше получается. Это как десктопный компьютер. Пользователь может сам подобрать компоненты под задачу.

G>>Это компенсируется стабильностью. Опытный программист обучается обходить грабли и использует это умение много лет. Да, порог вхождения выше, зато, когда вошел, выходить не надо еще много лет, в отличии от того же дот нета.


BDA>Перефразаирую: да, дерьмо, но зато они его не исправляли много лет. От себя добавлю: и не собираются.


Я не считаю, что STL настолько плох. Если душа к нему не лежит, нужно искать другую работу. Каждому свое.

BDA>Опять антипаттерн. Ну ладно, а какой кастинг не антипаттерн? Только не говорите, что все — они и без указателей нужны, а уж с указателями-то просто must have.


92. Avoid using reinterpret_cast и 93. Avoid using static_cast on pointers

BDA>Я тут одному товарищу рассказывал уже, но он мне не поверил. Сильно подозреваю, не осилил драйвера или держит какой-нибудь MacAfee. Поставьте себе не откровенно плохой SSD размером на полтерабайта, установите на него систему, файл подкачки, поставьте побольше памяти и у вас все, включая фотошоп, будет запускаться настолько быстро, насколько возможно. В частности, разницы между QtCreator'ом и студией вы не увидите.


А может в клауд запустить вижуал студию? Ну там пять узлов, horizontal scaling. Если серьезно, то на работе купили самые современные, дорогие десктопы с SSD и прочими прибамбасами. За антивирусом я уже давно научился следить. Так вот, тормозит даже на топовом железе. Я не спорю если я себе промышленный сервер под стол поставлю, то я не замечу разницы. А вообще тормознутость и прожерливость студии признают даже ее создатели, но разводят руками.

BDA>Кроме того, есть, знаете ли, разница в функционале между первым и вторым.


Так я этот функционал даже не начал использовать. Просто голую студию запускал. А уж если я начну его пользовать, тогда студия будет очень плавной.

BDA>Много раз слышал это утверждение, но на практике оно, чаще всего, означает стопицотый велосипед, который делает то, что FCL умела с первой версии. Если же речь идет о чем-то узкоспециализированном, то есть, вещах с малым инпутом и большой обработкой внутри, никто не мешает собирать ее в модуль и дергать откуда угодно.


Если производительность и память не важны, тогда и плюсы не нужны. Дот нет или джава и вперед.

BDA>Страуструп, по-моему, это делал в рамках прикладной задачи. Богатыри, не мы, и т.д. и т.п.


Не это главное, а то, что его компания его профинансировала и было согласовано с руководством, потому, что времена были другие. В наше время, его такие как вы "делом надо заниматься" будете гонять ссаными тряпками, пока он результат выдавать не начнет
Re[4]: Кому ваще этот С++ нужен?
От: _Artem_ Россия  
Дата: 20.05.15 09:09
Оценка: +1
Здравствуйте, koandrew, Вы писали:

K>Виртуальное наследование — очень полезная фишка, потому что про него очень удобно спрашивать на собеседованиях, когда нужно завалить кандидата. Т.к. этой фичей реально никто не пользуется, то о ней никто путью и не знает


Это почему еще не знает? Я кое-что знаю. Возможно, не все конечно. По крайней мере как-то разбирался, как оно работает. Там есть таблица смещения класса относительно базы. Лежит рядом с таблицей виртуальных функций. И это смещение используется для определения положения в классе. Ну и видимо, по значению стоит условие, чтобы много раз конструктор не вызывать для виртуальной базы.
Re[2]: Кому ваще этот С++ нужен?
От: Mystic Украина http://mystic2000.newmail.ru
Дата: 20.05.15 11:48
Оценка:
Здравствуйте, Zenden, Вы писали:

Z>Не то что эти всякие попсовые Сишарпы/жавы для слабаков. Написал код, а он просто работает. Скучно ведь!


В квесте C#/Java я всегда останавливался на этапе «написать код». Как-то он не пишется... Если код компилируется, значит он работает это больше было про Ada. Частично про Delphi.
Re[2]: Кому ваще этот С++ нужен?
От: AlexGin Беларусь  
Дата: 20.05.15 13:20
Оценка:
Здравствуйте, кубик, Вы писали:

К>Я забулькало после главы const_iterator.

.................................................
.................................................
А я — выделил ключевое слово...
От себя добавлю — закусывать пора!
Re[5]: Кому ваще этот С++ нужен?
От: 0BD11A0D  
Дата: 20.05.15 13:35
Оценка:
Здравствуйте, greenpci, Вы писали:

BDA>>Во-первых, это бездумная ссылка на авторитетов, которая, как паттерн поведения, устарела еще до Просвещения. Ну, гугл, и что? Нам, современным людям, нужно объяснение, почему это плохо. Объяснения я не увидел.


G>Да, согласен. Я, признаться, думал, что это ты любишь гугл и для тебя это авторитет. Ты говорил про результат и "делом надо заниматься, а не программированием". Вот гугл денег много заработал, дел выгодных много сделал, карманы набил. Я думал, ну раз ты человек бизнеса, то это тебе ближе.


Вы не слышали про культ карго? Это он и есть. Давайте будем слепо поклоняться гугловым гайдлайнам, раз гугл с ними заработал, и мы заработаем. Ну смешно же, честное слово. Если кто-то хочет заработать денег, крайне не рекомендовал бы пытаться сделать это так. Объясню на примере. Допустим, вы видите, что у компании Miscrosoft есть свой R&D-центр. Денег на него тратится — море. Вы думаете: наверное, он очень хорошо окупается. Дай-ка и я открою при своем стартапе из 3 программистов R&D-центр в виде четвертого. Между тем, инсайдеры рассказывали, что ихний центр это идея лично БГ и служит он пенсией для тех, кому лямку тянуть надоело. Он же изначально умных нанимал, да еще натаскивал их потом, а куда они пойдут на свободе? Ну, объедут свет, купят ресторан, а потом? Потом к конкурентам или свой стартап открывать. При ЕГО масштабе и рыночном положении выгоднее было дать им возможность играть в бирюльки и платить, чтобы просто обезвредить. При масштабе «3 программиста, CEO и собака» балласт в виде четвертого может погубить все дело. Вот что бывает, когда гоняешься за авторитетами, а не объяснениями.

>Ну раз это не так, тогда ладно. Стало быть ты тоже инженер и программист. Тогда дам тебе ссылку на подробное объяснение почему пихать все в один класс не рекомендуется. C++ Coding Standards. Chapter 33. Prefer minimal classes to monolithic


Вы определенно издеваетесь. Или по-другому не умеете.

Divide and conquer: Small classes are easier to write, get right, test, and use. They are also more likely to be usable in a variety of situations. Prefer such small classes that embody simple concepts instead of kitchen-sink classes that try to implement many and/or complex concepts (see Items 5 and 6).

Designing fancy large classes is a typical mistake when starting object-oriented design. The prospect of having a class that offers complete and complex functionality in one shot can be quite alluring. However, designing smaller, minimal classes that can be easily combined is an approach that is more successful in practice for systems of any size, for many reasons:

A minimal class embodies one concept at the right level of granularity. A monolithic class is likely to embody several separate concepts, and using one implies dragging the intellectual overhead of all others. (See Items 5 and 11)

A minimal class is easier to comprehend, and more likely to be used and reused.

A minimal class is easier to deploy. A monolithic class must often be deployed as a bulky indivisible unit. For example, a monolithic Matrix class might attempt to implement and deploy exotic functionality such as computing the eigenvalues of a matrixeven when the majority of clients just want simple linear algebra. A better packaging would implement various functional areas as nonmember functions operating on a minimal Matrix type. Then the functional areas can be tested and deployed in separation to the callers who need them. (See Item 44)

Monolithic classes dilute encapsulation. When a class has many member functions that don't need to be members but areand therefore have gratuitous visibility to the class's private implementationthen the class's private data members become nearly as bad as public variables.

Monolithic classes usually result from an attempt to predict and deliver a "complete" solution to a problem; in practice, they virtually never succeed. There's always something more that people wantand something less, for that matter.

Monolithic classes are harder to make correct and error-safe because they often tackle multiple responsibilities. (See Items 5 and 44)


Покажите, как это относится, например, к String::Printf, String::Split, String::ToLower. Это не the right level of granularity? Или это dilutes encapsulation? Или с деплоем проблемы? Короче, завязывайте с джастификационизмом и вскрывайте суть.

BDA>>Во-вторых, нет слова «антипаттерн», вас кто-то обманул. Неявная теория за этим словом стоит такая: есть книжка GoF и там перечислены паттерны.

G>ГОФ вообще тут не причем. Если даже слова такого нет, то понятие такое точно есть. Просто люди называют его по разному. Припарковать машину на железнодорожных путях — это антипатерн.

Я говорю, что за этим словом стоит неразумная теория. А значит слово не имеет права на существование. Что не мешает его употреблять даже мне самому, если проблему я вижу задолго до применения этой неразумной теории, например, как в случае с кастингами.

BDA>>Так вот, про цели и объяснения. Что значит «минимализм»? Ничего лишнего в бинарях? Это C++, он статически линкуется, главное, дайте исходники. Я вас уверяю, что если никто не вызовет String::Split, этот код в конечный продукт не попадет. Ничего лишнего в головах? Ну так он там и так есть, поскольку есть в ECMAScript. Или, может быть, в хайлоудных проектах гугла ни одна универсальная реализация не годится, ибо подправленная реализация даже


G>Ну есть еще SOLID и S это single responsibility. Подробное объяснение есть в гугле. Если с ним конкретно не согласен, можно подискутировать. Я сам согласен с ним и на практике для себя его подтвердил.


Ну, вот это уже по существу. Я утверждаю: форматирование строк (String::Printf) или смена регистра (String::ToLower) это по своему характеру ГОРАЗДО БОЛЕЕ строковые операции, чем std::string::swap. Спрашивается, кто нарушает single responsibility — я или Степанов?

BDA>>Дело не в том, где такого совсем нет. Дело в том, что платят за результат (который сам на 3/4 очковтирательство, но это неважно). И программист, ориентированный на результат, сталкивается с тем, что во всех приличных языках в системной библиотеке есть нужный ему код, а в этом языке — нет. Что делает язык не очень подходящим для использования программистами, ориентированными на результат. О чем и речь.


G>Так а кто запрещает использовать несколько библиотек. Зачем все должно быть в системной. Ведь лучше чтобы все занимались тем, что у них лучше получается. Это как десктопный компьютер. Пользователь может сам подобрать компоненты под задачу.


Затем, что хотя каждый язык и метит в свою нишу (один с уклоном в сторону одних прикладных задач, другой — других), есть базовые вещи, которые встречаются при работе с почти всеми прикладными задачами. Покрытие близко к 100%, хотя я и затрудняюсь указать число. Это строки и контейнеры, например. Поэтому большинство языков и поддерживает работу с ними в системной библиотеке (но так куце, как C++, по-моему, один только C++). В результате избегаются следующие проблемы:

1. Программисту не надо писать свой код для каждого нового проекта либо подключать левую библиотеку прямо с первых же шагов, поскольку базовые вещи в базовой библиотеке не сделаны.
2. Программисту не надо думать про взаимные преобразования, возникающие из-за того в п.1 разные программисты выбирает разные библиотеки. Например, про char*, wchar_t*, LPC(T)STR, OLECHAR*, _bstr_t, CString, std::string, std::wstring, QString... и продолжать могу еще долго.

G>>>Это компенсируется стабильностью. Опытный программист обучается обходить грабли и использует это умение много лет. Да, порог вхождения выше, зато, когда вошел, выходить не надо еще много лет, в отличии от того же дот нета.


BDA>>Перефразаирую: да, дерьмо, но зато они его не исправляли много лет. От себя добавлю: и не собираются.


G>Я не считаю, что STL настолько плох. Если душа к нему не лежит, нужно искать другую работу. Каждому свое.


Спасибо, но я пока лучше выберу другие языки и других людей.

BDA>>Опять антипаттерн. Ну ладно, а какой кастинг не антипаттерн? Только не говорите, что все — они и без указателей нужны, а уж с указателями-то просто must have.


G>92. Avoid using reinterpret_cast и 93. Avoid using static_cast on pointers


А, так значит dynamic_cast<T>(o), который вы пропустили — не «антипаттерн» (что бы это слово ни значило)? Тогда зачем ОН режет глаз? Чтоб жизнь медом не казалась?

G>А может в клауд запустить вижуал студию? Ну там пять узлов, horizontal scaling. Если серьезно, то на работе купили самые современные, дорогие десктопы с SSD и прочими прибамбасами. За антивирусом я уже давно научился следить. Так вот, тормозит даже на топовом железе. Я не спорю если я себе промышленный сервер под стол поставлю, то я не замечу разницы. А вообще тормознутость и прожерливость студии признают даже ее создатели, но разводят руками.


Ну так и сколько пустая студия у вас открывается в секундах?
Re[5]: Кому ваще этот С++ нужен?
От: 0BD11A0D  
Дата: 20.05.15 13:52
Оценка:
Здравствуйте, Cyberax, Вы писали:

BDA>>Первые два пункта: это до тех пор, пока вы остаетесь в рамках старой парадигмы «Си с классами». Я встречал то ли на кремниевой тайге, то ли на геймдеффе (падонкавском, а не который .ру) душещипательный рассказ о неудовлетворительном падении перфоманса после попыток использовать (правильным образом, конечно) STL. То есть, при попытке использовать удобства, которые есть в других языках, в тех приложениях, которым перфоманс жизненно важен (3D-движках, например) результат будет принципиально неудовлетворительным.

C>Ой, ну что за кретинический бред. В STL все контейнеры тупые и понятные, там просто нечему тормозить, особенно после добавления move-конструкторов.

Я вспомнил: это был ныне выпиленный gamedeff.com. Копия рассказа лежит тут: http://sim0nsays.livejournal.com/38116.html Там есть описание проблемы и конкретные цифры.
Отредактировано 20.05.2015 15:16 0BD11A0D . Предыдущая версия .
Re[8]: Кому ваще этот С++ нужен?
От: alexey_ma Израиль  
Дата: 20.05.15 17:06
Оценка: 3 (1) +1
Здравствуйте, 0BD11A0D, Вы писали:

...
N>>Под виндой есть замечательный ATL/WTL CString

BDA>Это тот же CString, что и в , насколько я знаю. Про него я написал выше. Но тащить из-за одной строки ATL/WTL... Так и рождается... мнэ... неоднозначное отношение к языку, который в стандартной библиотеке ничего близко похожего не предлагает.

Сейчас это в MFC как в ATL. И чего там тащить? Один инклюд atlstr.h. WTL это тоже всего лишь набор h-файлов, причем гораздо меньший чем собственно stl. Если пишите только под Windows то ATL вполне может быть заменой stl.
Re[6]: Кому ваще этот С++ нужен?
От: Cyberax Марс  
Дата: 20.05.15 20:47
Оценка: +3
Здравствуйте, 0BD11A0D, Вы писали:

C>>Ой, ну что за кретинический бред. В STL все контейнеры тупые и понятные, там просто нечему тормозить, особенно после добавления move-конструкторов.

BDA>Я вспомнил: это был ныне выпиленный gamedeff.com. Копия рассказа лежит тут: http://sim0nsays.livejournal.com/38116.html Там есть описание проблемы и конкретные цифры.
Ну и? Причина оказалась:

Что vector::reserve(count) устанавливает capacity ровно в count, если ему вообще нужно ее менять.
Т.е. каждый следующий reserve() делает realloc, если reserve(24) а потом 24x push_back
Однако! Если bevels таки включены, то reserve-то на 24 а push_back-ов больше

Просто удивительно, всё ровно по Стандарту.

Имеем обычный баг в коде, которому не поможет никакая стандартная библиотека.
Sapienti sat!
Re[7]: Кому ваще этот С++ нужен?
От: Константин Черногория  
Дата: 20.05.15 21:26
Оценка:
Советую почитать вот это:
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2271.html
Там довольно много букв на тему того, почему компании Electronic Arts не подошёл STL, и зачем именно они делали свой аналог.

C>Есть, конечно же. А чем они нынче от обычных PC отличаются?

Например тем, что когда в мобильном приложении или в консольной игре кончается RAM, приложение крешится, а не свопится.
Re[6]: Кому ваще этот С++ нужен?
От: CreatorCray  
Дата: 20.05.15 21:36
Оценка: +4
Здравствуйте, 0BD11A0D, Вы писали:

BDA>Я вспомнил: это был ныне выпиленный gamedeff.com. Копия рассказа лежит тут: http://sim0nsays.livejournal.com/38116.html Там есть описание проблемы и конкретные цифры.


Оказывается...
Что vector::reserve(count) устанавливает capacity ровно в count, если ему вообще нужно ее менять.


"Оказывается", млять!
Единственное что "оказывается" это то, что аффтар кода понятия не имел что делает reserve.
С таким же успехом можно пользоваться вообще чем угодно и получать стабильно хреновый результат.
Re[6]: Кому ваще этот С++ нужен?
От: greenpci  
Дата: 21.05.15 02:18
Оценка:
Здравствуйте, 0BD11A0D, Вы писали:

BDA>Вы не слышали про культ карго? Это он и есть. Давайте будем слепо поклоняться гугловым гайдлайнам, раз гугл с ними заработал, и мы заработаем. Ну смешно же, честное слово. Если кто-то хочет заработать денег, крайне не рекомендовал бы пытаться сделать это так. Объясню на примере. Допустим, вы видите, что у компании Miscrosoft есть свой R&D-центр. Денег на него тратится — море. Вы думаете: наверное, он очень хорошо окупается. Дай-ка и я открою при своем стартапе из 3 программистов R&D-центр в виде четвертого. Между тем, инсайдеры рассказывали, что ихний центр это идея лично БГ и служит он пенсией для тех, кому лямку тянуть надоело. Он же изначально умных нанимал, да еще натаскивал их потом, а куда они пойдут на свободе? Ну, объедут свет, купят ресторан, а потом? Потом к конкурентам или свой стартап открывать. При ЕГО масштабе и рыночном положении выгоднее было дать им возможность играть в бирюльки и платить, чтобы просто обезвредить. При масштабе «3 программиста, CEO и собака» балласт в виде четвертого может погубить все дело. Вот что бывает, когда гоняешься за авторитетами, а не объяснениями.


Майкрософт другое дело. Я больше говорю про то время, когда гугл еще был стартапом. Там не то что, пенсии высиживали, а даже директора в служебной поездке, в другом городе, не брали таксти, а ехали на общественном транспорте. Дело не в карго культе, а в поведении, которое можно рационально объяснить.

А про датацентр, то эта аналогия больше подходит к классам со Split функцией, чем к std::string.

>>Ну раз это не так, тогда ладно. Стало быть ты тоже инженер и программист. Тогда дам тебе ссылку на подробное объяснение почему пихать все в один класс не рекомендуется. C++ Coding Standards. Chapter 33. Prefer minimal classes to monolithic


BDA>Вы определенно издеваетесь. Или по-другому не умеете.

BDA>

BDA>Divide and conquer: Small classes are easier to write, get right, test, and use. They are also more likely to be usable in a variety of situations. Prefer such small classes that embody simple concepts instead of kitchen-sink classes that try to implement many and/or complex concepts (see Items 5 and 6)...


BDA>Покажите, как это относится, например, к String::Printf, String::Split, String::ToLower. Это не the right level of granularity? Или это dilutes encapsulation? Или с деплоем проблемы? Короче, завязывайте с джастификационизмом и вскрывайте суть.


Я предпочел бы отделить ToLower и Split от std::string. Они редко нужны и строку легче использовать без них. Я согласен с автором, строку легче использовать, когда в ней нет ToLower и друзей, а они лежат в другом месте отдельно и я про это место знаю. Проблемы еще и в следующем:

    std::string ::ToLower() это еще одно выделение памяти и копирование или move (который появился относительно недавно).
    std::vector<std::string> ::Split() вообще ужас. Сколько там выделений памяти, копирований? Насколько это все разбросано и не попадет в L2, я думаю, объяснять не надо.
    std::string ::printf, по моему мнению, уступает
    (ostringstream() << "Hello" << 123).str();

    printf нужен только в тех редких случаях, когда есть шаблоны сообщений, и их можно держать отдельно от кода.

Я предпочитаю решать сам где я буду менять строку in place или copy. std::for_each(...ToUpper) или std::transform(...ToUpper). Так же я хочу добавлять символы динамически back_inserter или сделать resize(). Взять начальную строку из std::string или ifstream. И у меня для всего этого есть набор стандартных инструментов.

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

Поэтому, Split и ToUpper не достаточно гибкие для быстродействующего кода. С другой стороны, в медленных языках (C#, Java) и в С++ UI frameworks они подходят прекрасно. Поэтому они там и есть.

BDA>Я говорю, что за этим словом стоит неразумная теория. А значит слово не имеет права на существование. Что не мешает его употреблять даже мне самому, если проблему я вижу задолго до применения этой неразумной теории, например, как в случае с кастингами.


Я думаю, отметать книжки и работу других людей не продуктивно. У них есть таланты, желание, им заплатили и они потратили кучу времени на изучение особенностей языка. Если хороший умный человек, почему бы не послушать его и не воспользоваться знаниями? Надо "ехать на плече у гиганта". Да и потом, в книжках не просто написано "делай так как я сказал и все!". На каждую рекомендацию есть куча текста, описывающая почему и для чего все это нужно. Есть еще и другое полезное свойство таких книжек и рекомендаций. Самоучки в команде будут упираться и спорить, что каждый из них прав и создавать конфликты. В то время, как в книжке все написано. Показал им книжку, отправил читать ответ на вопрос "почему" так лучше, и конфликт угаснет. Другое дело, что есть разные авторы и у них может быть противоположное мнение. Я бы, кстати, хотел почитать тех, на которых основано твое мнение, если таковые имеются.

BDA>Ну, вот это уже по существу. Я утверждаю: форматирование строк (String::Printf) или смена регистра (String::ToLower) это по своему характеру ГОРАЗДО БОЛЕЕ строковые операции, чем std::string::swap. Спрашивается, кто нарушает single responsibility — я или Степанов?


Не нужно воспринимать имя string так буквально. Это контейнер для управления памятью: std::memory_management_wrapper_for_text и swap прекрасно вписывается.

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

BDA>2. Программисту не надо думать про взаимные преобразования, возникающие из-за того в п.1 разные программисты выбирает разные библиотеки. Например, про char*, wchar_t*, LPC(T)STR, OLECHAR*, _bstr_t, CString, std::string, std::wstring, QString... и продолжать могу еще долго.

Так это и есть одна из задач, которую выполняет STL. Он подходит для интерфейсов. А внутри блоков уже можно подбирать то, что лучше. С++ сделан для экономии места и времени. Для задач, требующих тонкой настройки. Каждый инструмент там надо подбирать под задачу. В геймдеве stl вообще не подходит, есть там ToLower или нет. А вообще, есть же QT действительно, там "богатые" строки и все все есть.

G>>>>Это компенсируется стабильностью. Опытный программист обучается обходить грабли и использует это умение много лет. Да, порог вхождения выше, зато, когда вошел, выходить не надо еще много лет, в отличии от того же дот нета.


BDA>А, так значит dynamic_cast<T>(o), который вы пропустили — не «антипаттерн» (что бы это слово ни значило)? Тогда зачем ОН режет глаз? Чтоб жизнь медом не казалась?


он тоже "вызывает нахмуренное лицо" (см. цитату ниже) и достаточно редкий, что бы его в удобные скобки оборачивать.

prefer to design away downcasting: Refactor or redesign your code so that it isn't needed ...


BDA>Ну так и сколько пустая студия у вас открывается в секундах?


Не на работе сейчас. На домашнем компе Intel Core i7 4GB RAM не SSD, VS Express 2013 for Destop — 24 секунды первый раз и 4 секунды второй и последующие. Но это если сразу запускать.

Вообще-то студия не очень хорошее сравнение. Там все еще много C++ и COM осталось, если не ошибаюсь, особенно во время старта.
Отредактировано 21.05.2015 2:23 greenpci . Предыдущая версия .
Re[7]: Кому ваще этот С++ нужен?
От: 0BD11A0D  
Дата: 21.05.15 14:49
Оценка:
Здравствуйте, greenpci, Вы писали:

G>Майкрософт другое дело. Я больше говорю про то время, когда гугл еще был стартапом. Там не то что, пенсии высиживали, а даже директора в служебной поездке, в другом городе, не брали таксти, а ехали на общественном транспорте. Дело не в карго культе, а в поведении, которое можно рационально объяснить.


Забавно, вы тоже читали старика Дага. А я его закончил неделю назад или около того. Тяжелое чтение, доложу я вам. Английский у него как у Эми из Футурамы. Но кое-что интересное нашлось.

Что касается рационального объяснения, то давайте с него и начинать.

G>Я предпочел бы отделить ToLower и Split от std::string. Они редко нужны и строку легче использовать без них. Я согласен с автором, строку легче использовать, когда в ней нет ToLower и друзей, а они лежат в другом месте отдельно и я про это место знаю. Проблемы еще и в следующем:


1. Так ведь нет их в языке вообще нигде. Даже в другом месте. Буст не часть языка. Вы не можете создать новый проект в IDE и скомпилировать вызовы из boost::algo. Поэтому его и любят — это багаж малополезных знаний (куда копировать, как собирать под нужную платформу), за которые можно попросить больше денег.
2. Что значит «Строку легче использовать без них»? Я второй раз задаю этот вопрос. Программист увидит ToLower и Split и будет вынужден разбираться, тратить время? Неправда: он видит эти концепции прямо в GUI. А гугловский программист вдобавок должен знать про ECMAScript. Сама строка легче станет? Не вызывайте, она и не утяжелится. Это C++.
3. Каждая из них, может быть, нужна редко, но все вместе они нужны часто. Вот еще один автор, который пишет на джюглише: http://www.joelonsoftware.com/articles/fog0000000020.html Обратите внимение на 'Unfortunately, it's never the same 20%'. С моей точки зрения, это характерная ошибка, которую допустили создатели C++ и вы, а умницы из команды FCL и Джоэл избежали. Себя к последним не добавляю по причине того, что я сначала увидел хорошее решение, а потом задумался, почему оно такое. Не факт, что я бы не наступил на эти же грабли.

G>std::string ::ToLower() это еще одно выделение памяти и копирование или move (который появился относительно недавно).


Это зависит от (им)мутабельности. Если строка мутабельная, зачем? Может, вызывающей стороне оригинал не нужен. Если нужен, пусть снимет копию сам.

G>std::vector<std::string> ::Split() вообще ужас. Сколько там выделений памяти, копирований? Насколько это все разбросано и не попадет в L2, я думаю, объяснять не надо.


Так к этому и надо относиться: дорогая, но удобная операция. Вы что, предлагаете вообще заставить программиста ее сочинять?

G>std::string ::printf, по моему мнению, уступает

G>
G>(ostringstream() << "Hello" << 123).str();
G>

G>printf нужен только в тех редких случаях, когда есть шаблоны сообщений, и их можно держать отдельно от кода.
G>[/list]

Неправда и это. Вы, скорее всего, никогда не делали то, что делал я: брали процессы и читали их string table в Process Explorer. Поделайте, и поищите там %d. Я иду прямо по списку: Classic Shell, Windows Explorer, MyHomeLib, Steam, Media Player Classic, дрова от звуковой карты — все они полны форматированием строк. Исключение в моем списке — Фотошоп и Фурифокс.

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

G>Я предпочитаю решать сам где я буду менять строку in place или copy.


Нормальный человек такое решение принимает в следующем виде:

String original = L"Blah-blah-blah";
String copy = original;
copy.ToLower();

String original = L"Blah-blah-blah";
original.ToLower();


И это только в том случае, когда иммутабельность не заенфорсена в языке. И лично я склоняюсь к тому, что строки должны быть иммутабельны по следующим причинам: http://stackoverflow.com/questions/2365272/why-net-string-is-immutable

G>Для Split, в большинстве случаев, программист захочет читать строку и получать указатели на каждый элемент по очереди. Во первых, для этого не нужно туда сюда копировать. Во вторых, можно остановиться после нахождения нужного значения и не парсить дальше.


Здравстуйте, а терминаторный ноль кто будет вписывать для каждого элемента? Зачем ему набор указателей с общим терминатором на всех? Короче, это никакое не большинство случаев, а самое редкое исключение.

BDA>>Я говорю, что за этим словом стоит неразумная теория. А значит слово не имеет права на существование. Что не мешает его употреблять даже мне самому, если проблему я вижу задолго до применения этой неразумной теории, например, как в случае с кастингами.


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


Ну, я уже понял, что вы джастификационист. Еще когда вы первый раз на гугл сослались. Дело ваше, но я не могу общаться с джастификационистами: ИМЕННО ЭТО непродуктивно. От них не получишь новых, напоминаю вам ваши же слова: «рациональных объяснений», а только ссылки на авторитеты.

Раз уж вы читаете примерно те же книжки, что и я, вот что я прежде каких бы то ни было приплюсов посоветовал: https://books.google.com/books/about/The_Beginning_of_Infinity.html?id=jZHanN5_KPgC&amp;hl=en

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


Если вы обратили внимание, выше я сделал именно это: дал ссылку на объяснение, почему строки должны быть иммутабельны. Своими словами переписывать не стал. Но это ссылка на ХОРОШЕЕ ОБЪЯСНЕНИЕ. Именно поэтому я и сослался. Более того, каждый пункт могу объяснить так, как если бы я сам его написал. А вот вы сослались на yada-yada, набор слов с большой вариативностью. Он не является хорошим объяснением. Сошлитесь на хорошее объяснение, и вопросов не будет. Дело же не в ссылках.

Что касается команд, создайте свою, где можно сослаться на гугл и заткнуть рты. А результаты мы потом сравним.

BDA>>Ну, вот это уже по существу. Я утверждаю: форматирование строк (String::Printf) или смена регистра (String::ToLower) это по своему характеру ГОРАЗДО БОЛЕЕ строковые операции, чем std::string::swap. Спрашивается, кто нарушает single responsibility — я или Степанов?


G>Не нужно воспринимать имя string так буквально. Это контейнер для управления памятью: std::memory_management_wrapper_for_text и swap прекрасно вписывается.


Да неужели? Смотрите сами. В std::string есть std::string::substr(), который является частью строки как строки. Не как контейнера (в обобщенных контейнерах такого нет). Даже in-place вам сделать не дадут, что примечательно. Так вот, это будет responsibility номер раз. А swap и прочая контейнерщина — это responsibility номер два. Значит принцип SR нарушен.

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

BDA>>2. Программисту не надо думать про взаимные преобразования, возникающие из-за того в п.1 разные программисты выбирает разные библиотеки. Например, про char*, wchar_t*, LPC(T)STR, OLECHAR*, _bstr_t, CString, std::string, std::wstring, QString... и продолжать могу еще долго.

G>Так это и есть одна из задач, которую выполняет STL. Он подходит для интерфейсов. А внутри блоков уже можно подбирать то, что лучше. С++ сделан для экономии места и времени. Для задач, требующих тонкой настройки. Каждый инструмент там надо подбирать под задачу. В геймдеве stl вообще не подходит, есть там ToLower или нет. А вообще, есть же QT действительно, там "богатые" строки и все все есть.


Напоминаю вам, что если бы в стандарт (который сам по себе мне мало интересен, но интересен из-за компиляторов и IDE) входили библиотеки с достаточно полным базовым функционалом, это был бы другой язык. Намного лучше, хотя вопросы по многословному синтаксису и нарушению инкапсуляции (и много других) остались бы.

BDA>>А, так значит dynamic_cast<T>(o), который вы пропустили — не «антипаттерн» (что бы это слово ни значило)? Тогда зачем ОН режет глаз? Чтоб жизнь медом не казалась?


G>он тоже "вызывает нахмуренное лицо" (см. цитату ниже) и достаточно редкий, что бы его в удобные скобки оборачивать.


Так он «антипаттерн» или нет? Если да, какой кастинг не? Если нет, зачем он такой уродливый? Мало ли что редкий.

Кстати, «антипаттерность» тоже не оправдание, чтобы делать вещи уродливыми. Не хочешь давать использовать — убери из языка или генерируй deprecation warning, хотя бы. Требуй unsafe, в конце концов. Но уж если оставляешь — не уродуй. Ну, представьте себе, есть магазин с задним входом. Нам не нравится, что покупатели через него проникают внутрь — это небезопасно, так как они проходят через склад и могут стырить товар. Мы не будем закрывать заднюю дверь, мы не будет ставить охранника, чтобы он следил за товаром, мы не будем не делать ничего (потери на товаре меньше, чем на уменьшении траффика), а будем каждого покупателя, зашедшего не оттуда, обливать молоком и поджигать, чтобы переучить. Вот это и есть ваш dynamic_cast<T>, а заодно и static. И что я думаю о таких языках, я уже сказал. После появления шаблонов он только деградирует.

G>Не на работе сейчас. На домашнем компе Intel Core i7 4GB RAM не SSD, VS Express 2013 for Destop — 24 секунды первый раз и 4 секунды второй и последующие. Но это если сразу запускать.


Жесть какая. Снять, что ли, как за 3 секунды запускается все и на ютуп выложить?
Re[7]: Кому ваще этот С++ нужен?
От: 0BD11A0D  
Дата: 21.05.15 14:57
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>>>Ой, ну что за кретинический бред. В STL все контейнеры тупые и понятные, там просто нечему тормозить, особенно после добавления move-конструкторов.

BDA>>Я вспомнил: это был ныне выпиленный gamedeff.com. Копия рассказа лежит тут: http://sim0nsays.livejournal.com/38116.html Там есть описание проблемы и конкретные цифры.
C>Ну и? Причина оказалась:
C>

C>Что vector::reserve(count) устанавливает capacity ровно в count, если ему вообще нужно ее менять.
C>Т.е. каждый следующий reserve() делает realloc, если reserve(24) а потом 24x push_back
C>Однако! Если bevels таки включены, то reserve-то на 24 а push_back-ов больше

C>Просто удивительно, всё ровно по Стандарту.

Назвать это «тупой и понятный контейнер», по-моему, нельзя.
Re[8]: Кому ваще этот С++ нужен?
От: Stanislav V. Zudin Россия  
Дата: 21.05.15 15:01
Оценка:
Здравствуйте, 0BD11A0D, Вы писали:

G>>Я предпочел бы отделить ToLower и Split от std::string. Они редко нужны и строку легче использовать без них. Я согласен с автором, строку легче использовать, когда в ней нет ToLower и друзей, а они лежат в другом месте отдельно и я про это место знаю. Проблемы еще и в следующем:


BDA>2. Что значит «Строку легче использовать без них»? Я второй раз задаю этот вопрос. Программист увидит ToLower и Split и будет вынужден разбираться, тратить время? Неправда: он видит эти концепции прямо в GUI.


Вопрос тебе на засыпку. А какая реализация должна быть у этих функций?
Мы не знаем, что хранится в std::string — ansii или utf-8 или 100500 других кодировок. Запихивая эти функции внутрь класса ты ограничиваешь его использование.
Этим функциям самое место где-то в хелперах.
_____________________
С уважением,
Stanislav V. Zudin
Re[9]: Кому ваще этот С++ нужен?
От: 0BD11A0D  
Дата: 21.05.15 15:56
Оценка:
Здравствуйте, Stanislav V. Zudin, Вы писали:

SVZ>Вопрос тебе на засыпку. А какая реализация должна быть у этих функций?

SVZ>Мы не знаем, что хранится в std::string — ansii или utf-8 или 100500 других кодировок. Запихивая эти функции внутрь класса ты ограничиваешь его использование.
SVZ>Этим функциям самое место где-то в хелперах.

Вы процитировали самый конец переписки. В начале я неявно жаловался, что до сих пор кодировки явным образом в строках отсутствуют. Это снимает ваш вопрос?
Re[10]: Кому ваще этот С++ нужен?
От: Stanislav V. Zudin Россия  
Дата: 21.05.15 16:18
Оценка:
Здравствуйте, 0BD11A0D, Вы писали:

SVZ>>Вопрос тебе на засыпку. А какая реализация должна быть у этих функций?

SVZ>>Мы не знаем, что хранится в std::string — ansii или utf-8 или 100500 других кодировок. Запихивая эти функции внутрь класса ты ограничиваешь его использование.
SVZ>>Этим функциям самое место где-то в хелперах.

BDA>Вы процитировали самый конец переписки. В начале я неявно жаловался, что до сих пор кодировки явным образом в строках отсутствуют. Это снимает ваш вопрос?


Я читал. Ну будем считать, то снимает.
На мой взгляд принятое решение очень разумно — жестко завязываться на конкретную кодировку (ATL/WTL, Qt) так же плохо, как и тащить внутрь класса строки всю ICU.
Универсального решения здесь нет.
_____________________
С уважением,
Stanislav V. Zudin
Re[8]: Кому ваще этот С++ нужен?
От: Cyberax Марс  
Дата: 21.05.15 16:30
Оценка: +4
Здравствуйте, 0BD11A0D, Вы писали:

C>>Просто удивительно, всё ровно по Стандарту.

BDA>Назвать это «тупой и понятный контейнер», по-моему, нельзя.
А что тут непонятного-то? Вектор — это непрерывный блок в памяти, который имеет размер равный capacity, а size указывает на реально используемый участок. Capacity автоматически экспоненциально увеличивается при исчерпании. Метод reserve() позволяет ей управлять вручную.

Куда конкретно проще?
Sapienti sat!
Re[11]: Кому ваще этот С++ нужен?
От: 0BD11A0D  
Дата: 21.05.15 16:37
Оценка:
Здравствуйте, Stanislav V. Zudin, Вы писали:

SVZ>Я читал. Ну будем считать, то снимает.

SVZ>На мой взгляд принятое решение очень разумно — жестко завязываться на конкретную кодировку (ATL/WTL, Qt) так же плохо, как и тащить внутрь класса строки всю ICU.
SVZ>Универсального решения здесь нет.

То же самое говорили про int16/int32/int64

А вообще, если хочется большего контроля, никто не запрещает кодировку задавать как для экземпляра (в конструкторе), так и по умолчанию для всего проекта (через проектный #define).
Re[12]: Кому ваще этот С++ нужен?
От: Cyberax Марс  
Дата: 21.05.15 16:44
Оценка:
Здравствуйте, 0BD11A0D, Вы писали:

SVZ>>Универсального решения здесь нет.

BDA>То же самое говорили про int16/int32/int64
Поэтому сейчас все используют int128 для всего, да?

BDA>А вообще, если хочется большего контроля, никто не запрещает кодировку задавать как для экземпляра (в конструкторе), так и по умолчанию для всего проекта (через проектный #define).

#define идёт в топку вместе с тем, кто предлагает такое решение. Задание кодировки в самой строке будет требовать дополнительные 4/8 байт на указатель и будет мешать Small String Optimization.

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

А потом будут чесать репу почему std::govnostring("ISTANBUL".ToLower()) != std::govnostring("istanbul").
Sapienti sat!
Re[12]: Кому ваще этот С++ нужен?
От: Stanislav V. Zudin Россия  
Дата: 21.05.15 16:59
Оценка:
Здравствуйте, 0BD11A0D, Вы писали:

BDA>А вообще, если хочется большего контроля, никто не запрещает кодировку задавать как для экземпляра (в конструкторе), так и по умолчанию для всего проекта (через проектный #define).


Для всего проекта получается неудобным, т.к. часто приходится работать сразу с несколькими кодировками.
Задавать для экземпляра тоже не шибко удобно. Какую ты ожидаешь реализацию? pimpl? Или делать что-то универсальное, сразу для всех кодировок?
Я бы предпочел разные классы для разных строк, но это вредно для здоровья кросс-платформенных приложений.

Поэтому std::string в качестве контейнера (с тем же успехом можно и std::vector использовать, но печатать больше) и набор функций для его трансформации это вполне разумный компромисс.
Где нужна высокая производительность будут использовать оптимизированные варианты.
_____________________
С уважением,
Stanislav V. Zudin
Re[13]: Кому ваще этот С++ нужен?
От: 0BD11A0D  
Дата: 21.05.15 17:54
Оценка:
Здравствуйте, Cyberax, Вы писали:

SVZ>>>Универсального решения здесь нет.

BDA>>То же самое говорили про int16/int32/int64
C>Поэтому сейчас все используют int128 для всего, да?

Речь, вообще-то, шла о введении менее абстрактных, но более полезных типов данных. То есть, fixed width integer types. Хотя бы как альтернативы более абстрактным.

BDA>>А вообще, если хочется большего контроля, никто не запрещает кодировку задавать как для экземпляра (в конструкторе), так и по умолчанию для всего проекта (через проектный #define).

C>#define идёт в топку вместе с тем, кто предлагает такое решение. Задание кодировки в самой строке будет требовать дополнительные 4/8 байт на указатель и будет мешать Small String Optimization.

Я же написал: если хочется большего контроля. Меня и жесткая кодировка устраивает.

C>Естественно, при этом не давая никаких преимуществ кроме того, что говноразработчики смогут втыкать ToLower, не удосужившись даже заглянуть в документацию.

C>А потом будут чесать репу почему std::govnostring("ISTANBUL".ToLower()) != std::govnostring("istanbul").

А почему это программисты на C# — говноразработчики, а не лично вы? По какому такому критерию определили? А то я, например, видал знатоков, которые день-деньской читали разные документации, но добиться от них пользы на три байта невозможно было. Я вот считаю, что это они бесполезное говно.
Re[2]: Кому ваще этот С++ нужен?
От: koandrew Канада http://thingselectronic.blogspot.ca/
Дата: 21.05.15 18:45
Оценка: :)))
Здравствуйте, Zenden, Вы писали:

Z>Люблю заниматься перекомпилированием библиотек под разные компиляторы, дебаг/релиз, статик/шаред,64 бит/32 бит

Z>Люблю получать странные ошибки линковки и медитировать над ними.
Z>Люблю собирать опен-сурс проекты под виндой (интересно проходить этот квест)
Z>Люблю многообразие систем сборки для С++.
Кстати да. Я в своё время от души намучился при попытках собрать опенсорсные либы bullet (с поддержкой double, особенно сборка примеров к нему доставляет!), CEGUI и v8 так, чтобы crt статически линковалась (т.к. не хочу заставлять юзеров ставить отдельный рантайм), и под 64 бита (дебаг/релиз). Для CEGUI полностью статическую линковку я так и не осилил (оно настаивает на том, чтобы рендер был в отдельной dllке), .lib файл для v8 в дебаге получился больше 600 МБ, а потому гитхаб его не захотел принимать (я все референсы держу в сорс-контроле для того, чтобы максимально облегчить билд — скачиваешь содержимое ветки, открываешь проект — и всё сразу билдится безо всяких танцев с бубном). v8 вообще удивил — чтобы его сбилдить, нужно поставить какую-то ихнюю утилиту, которая поставит питон (который, кстати, у меня почему-то не встал, потому пришлось вручную подсовывать его, предварительно выяснив, в какой именно папке и с каким именно именем оно хочет его видеть), который используется для генерации проектных файлов, которые уже можно использовать для билда (не забыв слегка подточить их напильником для того, чтобы использовали статическую crt).
[КУ] оккупировала армия.
Re[5]: Кому ваще этот С++ нужен?
От: vdimas Россия  
Дата: 21.05.15 19:40
Оценка:
Здравствуйте, Cyberax, Вы писали:

BDA>>Первые два пункта: это до тех пор, пока вы остаетесь в рамках старой парадигмы «Си с классами». Я встречал то ли на кремниевой тайге, то ли на геймдеффе (падонкавском, а не который .ру) душещипательный рассказ о неудовлетворительном падении перфоманса после попыток использовать (правильным образом, конечно) STL. То есть, при попытке использовать удобства, которые есть в других языках, в тех приложениях, которым перфоманс жизненно важен (3D-движках, например) результат будет принципиально неудовлетворительным.

C>Ой, ну что за кретинический бред. В STL все контейнеры тупые и понятные, там просто нечему тормозить, особенно после добавления move-конструкторов.

При довольно развесистом графе объектов может сказываться лишняя косвенность, если они, например, std::vector заюзали там, где достаточно std::array.

C>Из того, что я видел, чаще всего страдают из-за того, что в STL не так много всего. Т.е. если нужен контейнер указателей, то не думая берут vector<shared_ptr<...>>, а потому репу чешут и пишут на форумы о тормозах STL.


Есть такое. Это вечный выбор м/у shared_ptr и intrusive_ptr.
Увы, даже в новом стандарте нет ничего про intrusive_ptr.


C>Сейчас единственное улучшение в нашей внутренней STL — это специализация векторов для POD-объектов, которые можно сразу через memcpy копировать.


Это ты так пошутил??? ))
Например MS VC старается НЕ ВСТАВЛЯТЬ явный вызов memcpy для мест, где ему известен объем копирования, вместо этого просто генерит код, который перекачивает данные через MMX/SSE/AVX регистры (если были разрешены опциями компиляции). Библиотечный же memcpy работает через rep stos и это медленнее чем генерируемый компиллером код при разрешении использовать векторные регистры.

При копировании STL вектора для POD-типов в релизе он тоже перекачивает память через MMX/SSE/AVX точно так же, как в тех случаях, когда используются массивы заведомо известного размера.
Re[6]: Кому ваще этот С++ нужен?
От: Cyberax Марс  
Дата: 21.05.15 20:21
Оценка: :)
Здравствуйте, vdimas, Вы писали:

C>>Ой, ну что за кретинический бред. В STL все контейнеры тупые и понятные, там просто нечему тормозить, особенно после добавления move-конструкторов.

V>При довольно развесистом графе объектов может сказываться лишняя косвенность, если они, например, std::vector заюзали там, где достаточно std::array.
Не вижу проблем STL.

C>>Сейчас единственное улучшение в нашей внутренней STL — это специализация векторов для POD-объектов, которые можно сразу через memcpy копировать.

V>Это ты так пошутил??? ))
Нет.

V>Например MS VC старается НЕ ВСТАВЛЯТЬ явный вызов memcpy для мест, где ему известен объем копирования, вместо этого просто генерит код, который перекачивает данные через MMX/SSE/AVX регистры (если были разрешены опциями компиляции).

Это из-за того, что в MSVC CRT очень тормозной memcpy. А вот в glibc используется быстрая реализация с использованием всех возможных фич процессора. Причём она выбирается линкером динамически при загрузке библиотеки в зависимости от CPU (механизм ifunc).

Вот для самообразования её код для разных процессоров:
http://code.metager.de/source/xref/gnu/glibc/sysdeps/x86_64/multiarch/memcpy-avx-unaligned.S
http://code.metager.de/source/xref/gnu/glibc/sysdeps/x86_64/multiarch/memcpy-sse2-unaligned.S
http://code.metager.de/source/xref/gnu/glibc/sysdeps/x86_64/multiarch/memcpy-ssse3.S
Sapienti sat!
Re[14]: Кому ваще этот С++ нужен?
От: Cyberax Марс  
Дата: 21.05.15 20:29
Оценка:
Здравствуйте, 0BD11A0D, Вы писали:

C>>Поэтому сейчас все используют int128 для всего, да?

BDA>Речь, вообще-то, шла о введении менее абстрактных, но более полезных типов данных. То есть, fixed width integer types. Хотя бы как альтернативы более абстрактным.
Это скорее просто кодификация сложившейся практики.

C>>#define идёт в топку вместе с тем, кто предлагает такое решение. Задание кодировки в самой строке будет требовать дополнительные 4/8 байт на указатель и будет мешать Small String Optimization.

BDA>Я же написал: если хочется большего контроля. Меня и жесткая кодировка устраивает.
А меня нет.

C>>Естественно, при этом не давая никаких преимуществ кроме того, что говноразработчики смогут втыкать ToLower, не удосужившись даже заглянуть в документацию.

C>>А потом будут чесать репу почему std::govnostring("ISTANBUL".ToLower()) != std::govnostring("istanbul").
BDA>А почему это программисты на C# — говноразработчики, а не лично вы?
Говноразработчики — это дизайнеры С# 1.0, которые думали книгой по ООП вместо моска. ЧСХ, в версии 2.0 им пришлось добавить https://msdn.microsoft.com/en-us/library/system.string.tolowerinvariant%28v=vs.110%29.aspx

BDA>По какому такому критерию определили? А то я, например, видал знатоков, которые день-деньской читали разные документации, но добиться от них пользы на три байта невозможно было. Я вот считаю, что это они бесполезное говно.

По признаку нарушения SRP и использования глобального состояния, в самом ядре библиотечного кода.
Sapienti sat!
Re[3]: Кому ваще этот С++ нужен?
От: CreatorCray  
Дата: 21.05.15 20:43
Оценка:
Здравствуйте, koandrew, Вы писали:

Z>>Люблю многообразие систем сборки для С++.

K>Кстати да. Я в своё время от души намучился при попытках собрать опенсорсные либы bullet

Ну так это не С++ виноват а криворукие аффтары либы, которые её слепили как сумели.
Re[3]: Кому ваще этот С++ нужен?
От: Anton Batenev Россия https://github.com/abbat
Дата: 21.05.15 21:04
Оценка: +1 :))
Здравствуйте, koandrew, Вы писали:

k> Кстати да. Я в своё время от души намучился при попытках собрать опенсорсные либы


И только у басиста:

./configure
make
make install
Управляю вселенной не привлекая внимания санитаров.
Re: Кому ваще этот С++ нужен?
От: omgOnoz  
Дата: 21.05.15 21:39
Оценка:
Здравствуйте, кубик, Вы писали:

  Скрытый текст
К>Всем привет,
К>Я вощем то С++ программист, звезд с неба не хватаю, писал всяикий аккаунтинг в стиле С++ с классами.
К>Сейчас открыл книгу Effective Modern C++ про С++14,С++11 и думаю, блин, для кого они все это придумывают?! Для самих себя?

К>Напрмиер было:


К>typedef void (*FP)(int, const std::string&); // typedef


К>Стало:


К>using FP = void (*)(int, const std::string&);


К>Там, мля, целый комитет умников сидит, они что, сразу не могут примдумать как нормально сделать?

К>Конечно как бы все улучшилось, но это только потому что до этого все ухудшалось так что и компилер не сразу выпустишь.


Все понятно.
Re[2]: Кому ваще этот С++ нужен?
От: omgOnoz  
Дата: 21.05.15 21:52
Оценка:
Здравствуйте, Zenden, Вы писали:

  Скрытый текст
Z>Здравствуйте, кубик, Вы писали:

К>>Всем привет,

К>>Я вощем то С++ программист, звезд с неба не хватаю, писал всяикий аккаунтинг в стиле С++ с классами.
К>>Сейчас открыл книгу Effective Modern C++ про С++14,С++11 и думаю, блин, для кого они все это придумывают?! Для самих себя?

Z>Я люблю С++, в нем большой простор для творчества!

Z>Чтобы написать приложение, нужно уметь писать костыли под разные компиляторы и платформы,
Z>Люблю изучать информативные сообщения об ошибках (access violation at adresss 0xFFFFFFFF)
Z>Люблю С++ за скорость компиляции (можно сходить куда-нибудь по делам)
Z>Люблю препроцессор, особенно макросы, они делают код живым.
Z>Никогда не знаешь, что сломает компиляцию на этот раз (С++ любит удивлять!)
Z>Люблю заниматься перекомпилированием библиотек под разные компиляторы, дебаг/релиз, статик/шаред,64 бит/32 бит
Z>Люблю получать странные ошибки линковки и медитировать над ними.
Z>Люблю собирать опен-сурс проекты под виндой (интересно проходить этот квест)
Z>Люблю многообразие систем сборки для С++.


Z>Не то что эти всякие попсовые Сишарпы/жавы для слабаков. Написал код, а он просто работает. Скучно ведь!

Z>Чувствуешь себя ненужным.


А еще есть забавы с совместимости библиотек C++98 и C++11, когда огрызки STL светятся, как weak символы.
Отредактировано 22.05.2015 7:12 omgOnoz . Предыдущая версия . Еще …
Отредактировано 21.05.2015 21:52 omgOnoz . Предыдущая версия .
Re[8]: Кому ваще этот С++ нужен?
От: greenpci  
Дата: 22.05.15 09:53
Оценка:
Здравствуйте, 0BD11A0D, Вы писали:

BDA>Забавно, вы тоже читали старика Дага. А я его закончил неделю назад или около того. Тяжелое чтение, доложу я вам. Английский у него как у Эми из Футурамы. Но кое-что интересное нашлось.


Читается легко, но только когда в автобусе едешь и не чего делать. Вот Страуструпа читать в разы тяжелее. Я сейчас на середине его новой редакции для C++11. Ну хоть бы шутки какие вставлял, что ли. Но материал очень полезный, с другой стороны.

BDA>Что касается рационального объяснения, то давайте с него и начинать.


G>>Я предпочел бы отделить ToLower и Split от std::string. Они редко нужны и строку легче использовать без них. Я согласен с автором, строку легче использовать, когда в ней нет ToLower и друзей...


Ответившие на твой пост уже привели причины. Я еще могу добавить.
1. Чем меньше кода в классе, тем быстрее он компилируется. А стринг это темплейт, то есть будет добавлен в качестве хедера в множество файлов. Эти функции могут потянуть за собой целый граф зависимостей, в зависимости от их реализации.
2. Интеллисенс "загрязняет". Еще два элемента в выпадающем списке. Мелочь конечно, но все же. "Залог успеха это множество продуманных мелочей" Черчиль
3. Тяжелее читать хедер STL, если там больше всего. А когда ошибки с темплейтами сыпятся иногда приходится смотреть на его кишки. Чем их больше, тем хуже в них ориентироваться. Чем меньше размер отдельного класса, тем легче его читать и понять. Это и есть "разделяй и властвуй".
4. Разобравшись с детялями std::transform и to_upper, мне уже не нужно держать в голове то, что делает string::ToUpper(). А голова — это как чердак забитый хламом, как говорил Шерлок Хомс.

Я давно хотел привести тебе еще одну статью из той самой C++ Coding Standards. Она называется 44. Prefer writing nonmember nonfriend functions. Ты будешь смеяться, вот что там написано:

Examples
Example: basic_string. The standard basic_string is a needlessly monolithic class with
103 member functions—of which 71 could be written as nonmember nonfriends
without loss of efficiency. Many of them duplicate functionality already available as
algorithms, or are themselves algorithms that would be useful more widely if they
weren't buried inside basic_string. (See Items 5 and 32, and [SutterO4].)


Так что, там уже дохрена всего, и без того трудно с ней иметь дело.

BDA>1. Так ведь нет их в языке вообще нигде. Даже в другом месте. Буст не часть языка. Вы не можете создать новый проект в IDE и скомпилировать вызовы из boost::algo. Поэтому его и любят — это багаж малополезных знаний (куда копировать, как собирать под нужную платформу), за которые можно попросить больше денег.


Все делается алгоритмами. На stackoverflow есть способы сделать все это без буста и с высоким контролем над решением. Сплит делается с помощью std::find и цикла.

BDA>2. Что значит «Строку легче использовать без них»? Я второй раз задаю этот вопрос. Программист увидит ToLower и Split и будет вынужден разбираться, тратить время? Неправда: он видит эти концепции прямо в GUI. А гугловский программист вдобавок должен знать про ECMAScript. Сама строка легче станет? Не вызывайте, она и не утяжелится. Это C++.


Написал выше.

BDA>3. Каждая из них, может быть, нужна редко, но все вместе они нужны часто. Вот еще один автор, который пишет на джюглише: http://www.joelonsoftware.com/articles/fog0000000020.html Обратите внимение на 'Unfortunately, it's never the same 20%'. С моей точки зрения, это характерная ошибка, которую допустили создатели C++ и вы, а умницы из команды FCL и Джоэл избежали. Себя к последним не добавляю по причине того, что я сначала увидел хорошее решение, а потом задумался, почему оно такое. Не факт, что я бы не наступил на эти же грабли.


Вот оно идолопоклонничество!!! Только разочарую, у вас с ним не взаимно. В одном из своих знаменитых постов, Джоел заявил, что программистов, у которых английский не родной, надо отправлять на помоечку.

BDA>Это зависит от (им)мутабельности. Если строка мутабельная, зачем? Может, вызывающей стороне оригинал не нужен. Если нужен, пусть снимет копию сам.


Ну так вот. Уже сложности. Не такой он и простой этот ToUpper, оказывается.

BDA>Так к этому и надо относиться: дорогая, но удобная операция. Вы что, предлагаете вообще заставить программиста ее сочинять?


Так о том и речь. Если хочется удобств, то надо на джаву или дот нет сразу идти, а Си плюс плюс хорош тонкой настройкой решения.

BDA>Неправда и это. Вы, скорее всего, никогда не делали то, что делал я: брали процессы и читали их string table в Process Explorer. Поделайте, и поищите там %d. Я иду прямо по списку: Classic Shell, Windows Explorer, MyHomeLib, Steam, Media Player Classic, дрова от звуковой карты — все они полны форматированием строк. Исключение в моем списке — Фотошоп и Фурифокс.

BDA>Значит, их авторы не думают, что он нужен редко. Как минимум, несколько раз в проекте употребляют. Употребляют в виде какого-нибудь snwprintf, при всей неудобности такого вызова. Или пишут свои классы.

Конечно делал такое. Стринг тейбл это все, что можно там увидеть. Все остальное бнарное. Я же не против safe printf и не против его в отдельной функции.

G>>Для Split, в большинстве случаев, программист захочет читать строку и получать указатели на каждый элемент по очереди. Во первых, для этого не нужно туда сюда копировать. Во вторых, можно остановиться после нахождения нужного значения и не парсить дальше.


BDA>Здравстуйте, а терминаторный ноль кто будет вписывать для каждого элемента? Зачем ему набор указателей с общим терминатором на всех? Короче, это никакое не большинство случаев, а самое редкое исключение.


Имея пару итераторов и если нужна строка, то так:

std::string item(begin, end);


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


BDA>Ну, я уже понял, что вы джастификационист. Еще когда вы первый раз на гугл сослались. Дело ваше, но я не могу общаться с джастификационистами: ИМЕННО ЭТО непродуктивно. От них не получишь новых, напоминаю вам ваши же слова: «рациональных объяснений», а только ссылки на авторитеты.


Скорее то, что надо всем бежать на дотнет и джаву это и есть авторитетное мнение от лучших программисто-водов. И гугл тоже, кстати, предпочтет джаву для нового проекта, скорее всего.

BDA>Что касается команд, создайте свою, где можно сослаться на гугл и заткнуть рты. А результаты мы потом сравним.


Не на гугл, а на C++ Coding Standards 101 Rules ... или на Страуструпа или Сатера. С удовольствием поработал бы в такой команде. Только, к сожалению, больше встречаю "чукча не читатель, чукча писатель".

BDA>>>А, так значит dynamic_cast<T>(o), который вы пропустили — не «антипаттерн» (что бы это слово ни значило)? Тогда зачем ОН режет глаз? Чтоб жизнь медом не казалась?


BDA>Так он «антипаттерн» или нет? Если да, какой кастинг не? Если нет, зачем он такой уродливый? Мало ли что редкий.


Он ровно настолько уродлив, насколько он не желателен. Скобки убрали потому, что они захватывают в себе несколько операций, в то время, как нужна только одна. А какой бы синтаксис ты предпочел для этой группы, не объединяя их всех в одну операцию, как были сишные скобки?

BDA>Кстати, «антипаттерность» тоже не оправдание, чтобы делать вещи уродливыми. Не хочешь давать использовать — убери из языка или генерируй deprecation warning, хотя бы. Требуй unsafe, в конце концов. Но уж если оставляешь —


Я думаю когда их задумывали, то уродливость не ставилась как цель. Это случайный бонус. И, все таки, а как это сделать красивее?
Re[7]: Кому ваще этот С++ нужен?
От: vdimas Россия  
Дата: 22.05.15 13:01
Оценка: +1
Здравствуйте, Cyberax, Вы писали:

C>Это из-за того, что в MSVC CRT очень тормозной memcpy. А вот в glibc используется быстрая реализация с использованием всех возможных фич процессора. Причём она выбирается линкером динамически при загрузке библиотеки в зависимости от CPU (механизм ifunc).


Так это же отлично.
Но ты не объяснил мне, зачем вручную заставлять делать точно так же, если компилятор генерит такой же код при копировании вектора?

К тому же, MSVC вызывает библиотеку только для случая, когда количество копируемых байт на этапе компиляции неизвестно, а это достаточно редкий сценарий, который к тому же говорит, что в консерваитории что-то не так. ))

Голые байты на тех сценарий, в которых важно быстродействие memcpy, "перекачивают" блоками фиксированного размера. Это важно и это, действительно, даёт заметный профит (это по опыту разработок для VoIP в частности и обработчки сигнала в общем). Для интристика с известным на этапе компиляции размером можно сгенерить совсем другой код, чем для неизвестного. Например, объект размером ровно 256 байт MSVC копируется просто 4-мя подряд операциями перекачки double-регистров SSE2 прямо по месту в коде. Какая нафик библиотечная ф-ия? ))


C>Вот для самообразования её код для разных процессоров:


У ты, ах ты...
Разве у других сломался вывод в дизассемблированном виде при отладке?

И почему для разных процессоров, если у меня проц подерживает одновременно SSE2, AVX и AVX D?
Причем, эти наборы команд используют одни и те же регистры, хоть и "видят" их по-разному (SSE2 и AVX D видят данные одинаково).

Да еще ты дал код для копирования через memcpy невыровненных даных...
Какая боль... в обсуждении про то, как важен быстрый memcpy.
Умудриться так низко пасть и при этом писать "для самообразования".
От тебя всегда как привет из параллельной реальности ))
Re[8]: Кому ваще этот С++ нужен?
От: jahr  
Дата: 22.05.15 14:58
Оценка:
Здравствуйте, 0BD11A0D, Вы писали:

BDA>1. Так ведь нет их в языке вообще нигде. Даже в другом месте. Буст не часть языка. Вы не можете создать новый проект в IDE и скомпилировать вызовы из boost::algo. Поэтому его и любят — это багаж малополезных знаний (куда копировать, как собирать под нужную платформу), за которые можно попросить больше денег.


Qt дает вам как раз такие строки, как Вам хочется, со всеми свистелками и перделками, запускаете на любой платформе IDE (QtCreator), и эти строки вам доступны без каких-либо дополнительных телодвижений. С++ тем и хорош, что он может быть любым, в частности и таким, который Вам нравится.

BDA>2. Что значит «Строку легче использовать без них»? Я второй раз задаю этот вопрос. Программист увидит ToLower и Split и будет вынужден разбираться, тратить время? Неправда: он видит эти концепции прямо в GUI. А гугловский программист вдобавок должен знать про ECMAScript. Сама строка легче станет? Не вызывайте, она и не утяжелится. Это C++.


Мне кажется, путаница возникает из-за того, что Вы не различаете 2 типа строк — гуишную строку, которая нужна для работы с текстами в гуе, и строку-"универсальный контейнер текста", которая нужна на более низком уровне, например при работе с файлами. В первом случае все эти форматирования, ToUpper, Split и т.п. нужны, и поэтому есть во всех реализациях гуишных строк (QString, CString, etc.). Во второй реализации, эти операции не просто вредны, они часто просто не имеют смысла. Что такое ToUpper в строке иероглифов, и как корректно делать сплит в строке, состоящей их символов разного размера, как в ютф8? Я уже не говорю про строки, которые будут какой-то смесью разных вариантов. std::string будет корректно работать с самыми экзотическими текстовыми данными, какие только вы сможете придумать, даже такими, про которые вообще будет непонятно как их вообще отображать в гуе, и возможен ли для них хоть какой-то гуй. Когда к нам прилетят инопланетяне с каким-нибудь невообразимым языком, или когда какой-то безумный математик придумает еще более невообразимый язык для каких-то своих целей, std::string скорее всего сможет работать с текстовыми файлами на этих языках. Регистр символов или разбиение на символы или лексемы — это не базовые свойства текста, возможны тексты без этих понятий, поэтому работы с ними и нет в базовой, максимально универсальной std::string.

Все остальное мне кажется следствием неразличения этих двух типов строк, так что подробно разбирать остальные Ваши претензии к std::string я не буду.)
Re[8]: Кому ваще этот С++ нужен?
От: Cyberax Марс  
Дата: 22.05.15 16:32
Оценка:
Здравствуйте, vdimas, Вы писали:

V>Так это же отлично.

V>Но ты не объяснил мне, зачем вручную заставлять делать точно так же, если компилятор генерит такой же код при копировании вектора?
Быстрее.

V>К тому же, MSVC вызывает библиотеку только для случая, когда количество копируемых байт на этапе компиляции неизвестно, а это достаточно редкий сценарий, который к тому же говорит, что в консерваитории что-то не так. ))

memcpy из glibc работает быстрее нативного копирования во всех случаях, когда размер не известен статически и больше порядка 64 байт.

V>У ты, ах ты...

V>Разве у других сломался вывод в дизассемблированном виде при отладке?
Ну так покажи что там генерирует MSVC. Мы посмеёмся вместе.

V>И почему для разных процессоров, если у меня проц подерживает одновременно SSE2, AVX и AVX D?

А у меня не поддерживает AVX. А на другом процессоре SSSE3 быстрее. Что мне делать?

V>Умудриться так низко пасть и при этом писать "для самообразования".

V>От тебя всегда как привет из параллельной реальности ))
То что ты ничерта не знаешь, не хочешь знать, и являешься эталоном полного ламера — мы уже давно выяснили.
Sapienti sat!
Re[9]: Кому ваще этот С++ нужен?
От: 0BD11A0D  
Дата: 22.05.15 22:11
Оценка:
Здравствуйте, jahr, Вы писали:

J>Мне кажется, путаница возникает из-за того, что Вы не различаете 2 типа строк — гуишную строку, которая нужна для работы с текстами в гуе, и строку-"универсальный контейнер текста", которая нужна на более низком уровне, например при работе с файлами.


Надо ли говорить, что эти два типа строк существуют только в некоторой модели ЯП? Есть доказавшие свою жизнеспособность модели, в которых никакого разделения нет. Реально вопрос стоит так: в чем выигрыш от того, что введено подобное разделение?

Смотрим аргумент за аргументом.

>Что такое ToUpper в строке иероглифов,


Зачем брать иероглифы? Есть иллюстрация попроще: что такое "@#$%^&*".ToUpper()? Классический NoOp. Тем не менее, нужда в нем есть и безо всяких гуев: любая поисковая система нуждается в том, чтобы свести текст к наиболее общему виду, уничтожая регистр. Или возьмите компилятор Паскаля. Оттого, что в тексте есть символы, которые при преобразовании не меняются, нужда в таких преобразованиях не исчезает.

>и как корректно делать сплит в строке, состоящей их символов разного размера, как в ютф8?


Что значит «как»? Законы логики или физики не запрещают.

>Я уже не говорю про строки, которые будут какой-то смесью разных вариантов. std::string будет корректно работать с самыми экзотическими текстовыми данными, какие только вы сможете придумать, даже такими, про которые вообще будет непонятно как их вообще отображать в гуе, и возможен ли для них хоть какой-то гуй. Когда к нам прилетят инопланетяне с каким-нибудь невообразимым языком, или когда какой-то безумный математик придумает еще более невообразимый язык для каких-то своих целей, std::string скорее всего сможет работать с текстовыми файлами на этих языках.


Извините, это не я написал. Я просто присоединяюсь к написанному: язык для инопланетян и безумных математиков, совершенно верно. Таков его архитектурный идеал, начиная с эры степановских шаблонов.

>Регистр символов или разбиение на символы или лексемы — это не базовые свойства текста, возможны тексты без этих понятий, поэтому работы с ними и нет в базовой, максимально универсальной std::string.


Максимально универсальной? Ну, неправда же. Сами назовете примеры текста, с которым через интерфейс std::string работать нельзя, или подсказать? Что касается регистра, то это, как раз, способ построить универсальную модель: считать, что такое преобразование есть у каждого символа, но у некоторых оно нулевое. Дальше есть два пути: подсчитать общее число символов, с учетом неоткрытых языков и нашествия инопланетян, и долю ненулевых преобразований (путь архитектурных лунатиков) и частоту употребления символов с ненулевым преобразованием относительно остальных (путь прагматиков). По мере того, как прагматиками будет осознаваться, какие лунатики делали обсуждаемый язык, они все меньше будут к нему прибегать.

Проблема в том, что лунатизм плюсов, если разобраться, не такое уж большое зло. Проприетарность гораздо хуже. Иногда полезнее мириться с психами и их архитектурой. Это я, собственно, и написал изначально. Есть целые сектора и направления разработки, где кроме плюсов ничего толком не лезет. Но это не значит, что мы вам все забудем и простим.
Re[9]: Кому ваще этот С++ нужен?
От: 0BD11A0D  
Дата: 22.05.15 23:48
Оценка:
Здравствуйте, greenpci, Вы писали:

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


На этот предмет есть технологии типа precompiled headers. И вообще, забавно слышать это по адресу C++, языка, ОЧЕНЬ ПЛОХО ПОДХОДЯЩЕГО для быстрой компиляции. Им есть чего подкрутитть задолго до того, как строки уродовать, причем эффекта будет намного больше.

G>2. Интеллисенс "загрязняет". Еще два элемента в выпадающем списке.


А теперь послушайте другую интерпретацию вашего наблюдения. Чуть ли не единственное, но убойное преимущество ООП — возможность так организовать код, что он становится самодокументируемым. Как раз интеллисенс играет тут первую скрипку. Вы открываете его окошко и видите ВСЕ возможности некоторого класса. Альтернатива — курить маны. То есть, вышел новый стандарт, новый STL, новый boost и вы должны сразу прочитать, понять и запомнить все, что написано в сопроводиловке. Нормальные люди предпочитают осмотреть классы с высоты птичьего полета, чтобы знать, что вообще есть, а потом уже углубленно знакомиться с нюансами вызова методов (типа, почему пишется Манчестер, читается Истанбул).

Как раз вынесение алгоритмов за пределы классов принципиально и не дает воспользоваться этим преимуществом ООП. Процедурщина и хендловщина в полный рост.

G>3. Тяжелее читать хедер STL, если там больше всего. А когда ошибки с темплейтами сыпятся иногда приходится смотреть на его кишки. Чем их больше, тем хуже в них ориентироваться. Чем меньше размер отдельного класса, тем легче его читать и понять. Это и есть "разделяй и властвуй".


Не приведя примера такой ошибки, вы затрудняете обсуждение этого пункта. Например, шаблоны у вас, скорее всего, не к месту, но как я это покажу, не видя кода?

Однако по сути вы все равно не правы, и это видно даже без примеров. Мне лень объяснять детали и я сделаю проще: прибегну к специальной терминологии. Ошибка, которую вы допускаете, называется редукционизм. Что это значит и как понимать, вы узнаете из этой книги: https://books.google.ru/books/about/The_Fabric_of_Reality.html?id=2LqEPNf9jXsC&amp;hl=en В качестве бонуса каждому прочитавшему я готов дать один файлик всего лишь на 255 байт, который, по вашей теории, должно быть легко читать и понимать. Редкая птица долетала до его середины.

G>4. Разобравшись с детялями std::transform и to_upper, мне уже не нужно держать в голове то, что делает string::ToUpper().


И это тоже ошибка редукционизма. Концепт string::ToUpper() занимает в голове меньше места, чем применение std::transform в каждом конкретном случае.

G>Я давно хотел привести тебе еще одну статью из той самой C++ Coding Standards. Она называется 44. Prefer writing nonmember nonfriend functions. Ты будешь смеяться, вот что там написано:


G>

G>Examples
G>Example: basic_string. The standard basic_string is a needlessly monolithic class with
G>103 member functions—of which 71 could be written as nonmember nonfriends
G>without loss of efficiency. Many of them duplicate functionality already available as
G>algorithms, or are themselves algorithms that would be useful more widely if they
G>weren't buried inside basic_string. (See Items 5 and 32, and [SutterO4].)


Привели, и что? Смеяться я не буду, это просто ничем не обоснование утверждение, над чем же тут смеяться?

G>Так что, там уже дохрена всего, и без того трудно с ней иметь дело.


Короче, две книжки, которые я вам посоветовал, могут полностью перевернуть ваше миропонимание. На каждом шагу вылезает то, что объяснить проблемы сиплюсплюса и его архитектуры лучше всего в терминах типа редукционизма, но сначала же теория нужна. Образование. А своими словами пересказывать эти фундаментальные труды я не могу.

BDA>>1. Так ведь нет их в языке вообще нигде. Даже в другом месте. Буст не часть языка. Вы не можете создать новый проект в IDE и скомпилировать вызовы из boost::algo. Поэтому его и любят — это багаж малополезных знаний (куда копировать, как собирать под нужную платформу), за которые можно попросить больше денег.


G>Все делается алгоритмами. На stackoverflow есть способы сделать все это без буста и с высоким контролем над решением. Сплит делается с помощью std::find и цикла.


Все делается на ассемблере. Идите уже до конца. Остальное в глазах редукциониста должно быть просто ненужное повышение уровня.

BDA>>2. Что значит «Строку легче использовать без них»? Я второй раз задаю этот вопрос. Программист увидит ToLower и Split и будет вынужден разбираться, тратить время? Неправда: он видит эти концепции прямо в GUI. А гугловский программист вдобавок должен знать про ECMAScript. Сама строка легче станет? Не вызывайте, она и не утяжелится. Это C++.


G>Написал выше.


То есть, все-таки, место в голове. Как завещал Холмс. Так вот, а я тоже выше написал: это место в голове у вас и так потрачено. Учитывая, что операции с регистром вы видите в ГУИ, ECMAScript и еще ста местах, надрочиться на чтение std::transform(s.begin(), s.end(), s.begin(), ::toupper); как s.ToUpper() на самом деле только потратит лишние клетки. Хотя, конечно, проделав с собой такое очень обидно признавать, что все это было напрасно.

BDA>>3. Каждая из них, может быть, нужна редко, но все вместе они нужны часто. Вот еще один автор, который пишет на джюглише: http://www.joelonsoftware.com/articles/fog0000000020.html Обратите внимение на 'Unfortunately, it's never the same 20%'. С моей точки зрения, это характерная ошибка, которую допустили создатели C++ и вы, а умницы из команды FCL и Джоэл избежали. Себя к последним не добавляю по причине того, что я сначала увидел хорошее решение, а потом задумался, почему оно такое. Не факт, что я бы не наступил на эти же грабли.


G>Вот оно идолопоклонничество!!! Только разочарую, у вас с ним не взаимно. В одном из своих знаменитых постов, Джоел заявил, что программистов, у которых английский не родной, надо отправлять на помоечку.


Не припоминаю за ним таких постов, но я про него весьма невысокого мнения. А как человек он мне и вовсе не нравится.

Тем не менее, отдадим ему должное, он, в процитированной колонке, дает ХОРОШЕЕ ОБЪЯСНЕНИЕ, почему bloatware (не всякое, а такое, как System.String или MS Office 2000) — миф. И это хорошее объяснение хорошо изложено. Вы это объяснение проигнорировали, а прицепились к тому, кто его дал. И если это, по-вашему, продуктивное поведение, то от продукта вашего поведения не очень хорошо пахнет.

BDA>>Это зависит от (им)мутабельности. Если строка мутабельная, зачем? Может, вызывающей стороне оригинал не нужен. Если нужен, пусть снимет копию сам.

G>Ну так вот. Уже сложности. Не такой он и простой этот ToUpper, оказывается.

Нет, он простой. Сначала вы определяетесь, какие плюсы и минусы с какой стороны медали выбрать. Будете ли вы делать строку иммутабельной или нет. Это отдельное решение. Затем делаете ToUpper() в соответствии с принятым решением. Сложности в нем самом нет никакой.

BDA>>Так к этому и надо относиться: дорогая, но удобная операция. Вы что, предлагаете вообще заставить программиста ее сочинять?


G>Так о том и речь. Если хочется удобств, то надо на джаву или дот нет сразу идти


Сегодня жемчужины в этом форуме собираю горстями. Вот так вот, хочется удобств — вали отсюда. Прямо в FAQ просится, кроме шуток. Чтоб знать, с чем связываешься.

G>Я же не против safe printf ... в отдельной функции.


А я против. По причинам, изложенным в ответе на п.2.

G>>>Для Split, в большинстве случаев, программист захочет читать строку и получать указатели на каждый элемент по очереди. Во первых, для этого не нужно туда сюда копировать. Во вторых, можно остановиться после нахождения нужного значения и не парсить дальше.


BDA>>Здравстуйте, а терминаторный ноль кто будет вписывать для каждого элемента? Зачем ему набор указателей с общим терминатором на всех? Короче, это никакое не большинство случаев, а самое редкое исключение.


G>Имея пару итераторов и если нужна строка, то так:


G>
G>std::string item(begin, end);
G>


То есть, это не копирование, так получается?

G>Я думаю когда их задумывали, то уродливость не ставилась как цель. Это случайный бонус. И, все таки, а как это сделать красивее?


dynamic_cast — никак. Сама его идея — оператор, который будет работать только при заданных опциях сборки проекта — уродлива. В других языках, где RTTI неотключаем, это делается изящным оператором as. Для всего остального есть (T).
Re[15]: Кому ваще этот С++ нужен?
От: 0BD11A0D  
Дата: 23.05.15 00:14
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>>>Поэтому сейчас все используют int128 для всего, да?

BDA>>Речь, вообще-то, шла о введении менее абстрактных, но более полезных типов данных. То есть, fixed width integer types. Хотя бы как альтернативы более абстрактным.
C>Это скорее просто кодификация сложившейся практики.

При том, что такая кодификация — нарушение идеалов абстракции, заложенных в первые версии. (Это, конечно, если не считать, что неопределенность размера обусловлена банальной необдуманностью). И правильно, к черту эти идеалы. Одно из немногих правильных решений в эволюции этого чудовища.

C>>>Естественно, при этом не давая никаких преимуществ кроме того, что говноразработчики смогут втыкать ToLower, не удосужившись даже заглянуть в документацию.

C>>>А потом будут чесать репу почему std::govnostring("ISTANBUL".ToLower()) != std::govnostring("istanbul").
BDA>>А почему это программисты на C# — говноразработчики, а не лично вы?
C>Говноразработчики — это дизайнеры С# 1.0, которые думали книгой по ООП вместо моска. ЧСХ, в версии 2.0 им пришлось добавить https://msdn.microsoft.com/en-us/library/system.string.tolowerinvariant%28v=vs.110%29.aspx

Я бы, скорее, подумал, что это было сдуто с setlocale(). А потом доведено до ума.

BDA>>По какому такому критерию определили? А то я, например, видал знатоков, которые день-деньской читали разные документации, но добиться от них пользы на три байта невозможно было. Я вот считаю, что это они бесполезное говно.

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

Давайте пересчитаем R. Я вижу ровно одну — представлять типичные операции с кусками текста. В отличие от C++, где их смешано две — контейнерные операции и substr() (как представитель чисто строковых функций).
Re[13]: Кому ваще этот С++ нужен?
От: 0BD11A0D  
Дата: 23.05.15 00:15
Оценка:
Здравствуйте, Stanislav V. Zudin, Вы писали:

SVZ>Я бы предпочел разные классы для разных строк, но это вредно для здоровья кросс-платформенных приложений.


В чем вред?
Re[5]: Кому ваще этот С++ нужен?
От: 0BD11A0D  
Дата: 23.05.15 00:22
Оценка:
Здравствуйте, Константин, Вы писали:

К>Стандарт сильно волнует только студентов, преподавателей, и ещё глупых разработчиков каких-то SDK. Всем остальным на него пофигу.


К сожалению, разработчики компиляторов и IDE зачем-то ориентируются на него. А их продукты волнуют уже и прагматиков.

К>Для игр однако это не очень критично, по следующим причинам: (1) Программисты всё равно обходятся в разы дешевле, чем арт (2) Код игр уже давно разделили на ядро (обычно С++) и скрипты (часто LUA). (3) Развитый рынок middleware, заточенный в основном на C++ клиентов, усложняет миграцию.


Да, движки превратились в commodity.
Re[10]: Кому ваще этот С++ нужен?
От: watchyourinfo Аргентина  
Дата: 23.05.15 00:23
Оценка: +2
BDA> Сама его идея — оператор, который будет работать только при заданных опциях сборки проекта — уродлива. В других языках, где RTTI неотключаем, это делается изящным оператором as. Для всего остального есть (T).

эээ... ты о чем??
dynamic_cast это обязательная часть стандарта, он "неотключаем".
В стандарте есть понятие "polymorphic type", dynamic_cast работает только на них, а программист понимает, что делая класс polymorphic он может платить определеннубю цену.

Это исключительно расширение компилятора -- позволить отключить RTTI. Компилятор с такой опцией включенной не удовлетворяет стандарту.
Re[9]: Кому ваще этот С++ нужен?
От: Evgeny.Panasyuk Россия  
Дата: 23.05.15 00:27
Оценка:
Здравствуйте, greenpci, Вы писали:

G>Я думаю когда их задумывали, то уродливость не ставилась как цель. Это случайный бонус. И, все таки, а как это сделать красивее?


Виды кастов вполне согласованны с видом шаблонов функций. И даже можно написать свои касты с точно таким же синтаксисом (бывает необходимо для чего-то типа COM-like).
Re[2]: Кому ваще этот С++ нужен?
От: eskimo82  
Дата: 23.05.15 02:40
Оценка: :)
М>Subj: Кому ваще этот С++ нужен?
Как кому ? Микрософтам!
У них же компилятор до сих пор нормальный Си не поддерживает.
Вот и извращаются, пишут workaround-ы на С++.
А вот кому они свои продукты жизнедеятельности впаривают — загадка.


Казалось бы, такая мелоч:
static const struct partition part = {
    .name = "Boot",
    .start = 100 MBYTE,
    ...
};


а нет, надо обязательно С++ конструкторы творить и инициализировать все в реал-тайме...


Впрочем, в последнем стандарте C++ стали о чем то подозревать и ввели списки инициализации.
Отредактировано 23.05.2015 2:47 eskimo82 . Предыдущая версия . Еще …
Отредактировано 23.05.2015 2:46 eskimo82 . Предыдущая версия .
Отредактировано 23.05.2015 2:42 eskimo82 . Предыдущая версия .
Re[14]: Кому ваще этот С++ нужен?
От: Stanislav V. Zudin Россия  
Дата: 23.05.15 06:40
Оценка:
Здравствуйте, 0BD11A0D, Вы писали:

SVZ>>Я бы предпочел разные классы для разных строк, но это вредно для здоровья кросс-платформенных приложений.


BDA>В чем вред?


Нужно ли объяснять, что методы работы с символами фиксированнной и переменной ширины различаются?
Методы разные, интерфейсы разные.
Делать универсальный интерфейс неэффективно.

Поэтому для кроссплатформенного проекта одним дефайном не обойтись.
Под каждую платформу придется писать целый набор методов для работы со строками достаточно высокого уровня.
_____________________
С уважением,
Stanislav V. Zudin
Re[2]: Кому ваще этот С++ нужен?
От: kr510  
Дата: 23.05.15 07:07
Оценка:
Здравствуйте, мыщъх, Вы писали:

М>а винда... ну она как бы есть. в магазине. но хз кто под нее что разрабатывает и почему.


Многие разрабатывают и успешно под Винду. Все security: антивирь, оптимизаторы, FW и пр. Корпоративный софт тоже под ней сидит. ИГРЫ!
В принципе, Винды никуда не делись. Просто Эппловская горячка всё затмила. Посмотрим если это надолго.
Re[3]: Кому ваще этот С++ нужен?
От: Mamut Швеция http://dmitriid.com
Дата: 23.05.15 07:54
Оценка:
K>В принципе, Винды никуда не делись. Просто Эппловская горячка всё затмила. Посмотрим если это надолго.

Можно дать определение «надолго»? Так, для справки, iPod'у (первая волна «горячки») — 14 лет. iPhone'у (главная волна «горячки») — 8 лет.

Или это в стиле Шеридана — называть однодневками все подряд, невзирая на возраст?


dmitriid.comGitHubLinkedIn
Re[4]: Кому ваще этот С++ нужен?
От: kr510  
Дата: 23.05.15 08:09
Оценка:
Здравствуйте, Mamut, Вы писали:


K>>В принципе, Винды никуда не делись. Просто Эппловская горячка всё затмила. Посмотрим если это надолго.


M>Можно дать определение «надолго»? Так, для справки, iPod'у (первая волна «горячки») — 14 лет. iPhone'у (главная волна «горячки») — 8 лет.


Рано или подно каюк придёт. Ведь это очевидно тупик эволюции: всё что движет их экосистему — лояльность пользователей, которые сделали им имидж (некоторые говорят секту). Ничего технологически уникального яблочники не делают, тогда откуда сверх доходы? В недавном мире подобных было много: Япония и недвижимость, 00 и дотком, нефть. И это всё было очищено рынком.
Re[5]: Кому ваще этот С++ нужен?
От: Константин Черногория  
Дата: 23.05.15 09:01
Оценка:
Здравствуйте, kr510, Вы писали:

K>Ничего технологически уникального яблочники не делают

Рынок не про технологии, он про продукты.
Навскидку, уникальные продукты:
1. Интернет-магазин цифровой музыки
2. Безлимитный мобильный интернет в кармане + web browser к нему
3. Магазин мобильных приложений
4. Планшет для безделья
Re[6]: Кому ваще этот С++ нужен?
От: kr510  
Дата: 23.05.15 09:08
Оценка:
Здравствуйте, Константин, Вы писали:

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


K>>Ничего технологически уникального яблочники не делают

К>Рынок не про технологии, он про продукты.
К>Навскидку, уникальные продукты:
К>1. Интернет-магазин цифровой музыки
К>2. Безлимитный мобильный интернет в кармане + web browser к нему
К>3. Магазин мобильных приложений
К>4. Планшет для безделья

И что тут уникального? Обычная "картошка" — большинство этого было еще в Ovi, ну а уж современных поставщиков (Play, Win appstore) всё это "цветёт и пахнет".
Re[7]: Кому ваще этот С++ нужен?
От: Константин Черногория  
Дата: 23.05.15 09:24
Оценка:
Здравствуйте, kr510, Вы писали:

К>>Рынок не про технологии, он про продукты.

К>>Навскидку, уникальные продукты:
К>>1. Интернет-магазин цифровой музыки
К>>2. Безлимитный мобильный интернет в кармане + web browser к нему
К>>3. Магазин мобильных приложений
К>>4. Планшет для безделья

K>большинство этого было еще в Ovi

Этот твой Ovi был сильно позже.

iTunes store с музыкой для iPod — 2003.
Ойфон, в комплекте с первым на рынке безлимитным мобильным интернетом — 2007.
iTunes store с iOS приложениями — 2008 (обрати внимание, что в момент запуска iPhone ещё даже не был смартфоном, был просто телефон с музычкой, безлимитным EDGE интернетом и web-браузером).

И только в 2009 был запущен Ovi Store. На котором кстати даже музыки по-моему не было, рингтоны только.
Отредактировано 23.05.2015 9:27 Константин . Предыдущая версия .
Re[15]: Кому ваще этот С++ нужен?
От: Ops Россия  
Дата: 23.05.15 13:08
Оценка:
Здравствуйте, Stanislav V. Zudin, Вы писали:

SVZ>Нужно ли объяснять, что методы работы с символами фиксированнной и переменной ширины различаются?

SVZ>Методы разные, интерфейсы разные.
SVZ>Делать универсальный интерфейс неэффективно.

SVZ>Поэтому для кроссплатформенного проекта одним дефайном не обойтись.

SVZ>Под каждую платформу придется писать целый набор методов для работы со строками достаточно высокого уровня.

А мне нравится идея шаблона, параметризованного кодировкой. Даже без частных специализаций можно обойтись, перенеся специфичный функционал в класс кодировки.
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Re[5]: Кому ваще этот С++ нужен?
От: Igor Karablin Россия  
Дата: 23.05.15 19:18
Оценка: +2
Здравствуйте, Cyberax, Вы писали:

C>Ой, ну что за кретинический бред. В STL все контейнеры тупые и понятные, там просто нечему тормозить, особенно после добавления move-конструкторов.


К сожалению (почти) нечему тормозить только у vector, с остальными контейнерами не всё так гладко.
Если найдется время, советую просмотреть пару выступлений с cppcon'14. на мой взгляд — поучительные истории о том, что бывает, когда не учитывают реальное железо в процессе разработки софта и спецификаций библиотек.

https://youtube.com/watch?v=fHNmRkzxHWs

https://youtube.com/watch?v=rX0ItVEVjHc
Re[6]: Кому ваще этот С++ нужен?
От: Evgeny.Panasyuk Россия  
Дата: 23.05.15 19:33
Оценка:
Здравствуйте, Igor Karablin, Вы писали:

IK>К сожалению (почти) нечему тормозить только у vector, с остальными контейнерами не всё так гладко.

IK>Если найдется время, советую просмотреть пару выступлений с cppcon'14. на мой взгляд — поучительные истории о том, что бывает, когда не учитывают реальное железо в процессе разработки софта и спецификаций библиотек.

Степанов реальное железо всегда учитывал. Даже больше, эффективность (во всех её проявлениях) это главный лейтмотив всех его статей, книг и выступлений.
Re[10]: Кому ваще этот С++ нужен?
От: greenpci  
Дата: 24.05.15 00:52
Оценка:
Здравствуйте, 0BD11A0D, Вы писали:

BDA>На этот предмет есть технологии типа precompiled headers. И вообще, забавно слышать это по адресу C++, языка, ОЧЕНЬ ПЛОХО ПОДХОДЯЩЕГО для быстрой компиляции. Им есть чего подкрутитть задолго до того, как строки уродовать, причем эффекта будет намного больше.


Если я правильно понимаю, на некоторых платформах и при некоторых условиях эта фича не доступна.

BDA>А теперь послушайте другую интерпретацию вашего наблюдения. Чуть ли не единственное, но убойное преимущество ООП — возможность так организовать код, что он становится самодокументируемым. Как раз интеллисенс играет тут первую скрипку. Вы открываете его окошко и видите ВСЕ возможности некоторого класса. Альтернатива — курить маны. То есть, вышел новый стандарт, новый STL, новый boost и вы должны сразу прочитать, понять и запомнить все, что написано в сопроводиловке. Нормальные люди предпочитают осмотреть классы с высоты птичьего полета, чтобы знать, что вообще есть, а потом уже углубленно знакомиться с нюансами вызова методов (типа, почему пишется Манчестер, читается Истанбул).


Мне кажется, это негативная сторона, так же, как и Google Driven Development. Находя метод в интеллисенсе, программисты переоценивают свое понимание того, что и как он делает. Страшно подумать, сколько раз программисты очищали память с помощью std::ostringstream::clear(). Множество моих знакомых говорили, что они уже не читают книги по программированию, так как в интеллисенсе и гугле все есть. Мне кажется, даже хороший дотнет программист должен знать не только инструкцию к методу фреймворка, но и, иногда, смотреть на его код. Си плюс плюс, как язык "тонкой настройки", тем более требует знания деталей глубже, чем интеллисенс. И я лично за то, чтобы специалисты читали книжки, прежде чем, что-либо делать. Хотя, это и не популярная точка зрения. А новые платформы, как дотнет, настолько быстро меняются, что людям не когда что-то изучать, и это еще одна причина, по которой интеллисенс там так нужен. Создали проблему, решили проблему.

Это я еще не упомянул научную книгу "Антимозг", исходя из которой, можно сделать вывод, что интеллисенс также "разрушает" гиппокамус и ухудшает память.

Но это только моя точка зрения. Большинство все равно его используют и пара лишних, для кого-то ненужных методов будет слегка вредна.

BDA>Как раз вынесение алгоритмов за пределы классов принципиально и не дает воспользоваться этим преимуществом ООП. Процедурщина и хендловщина в полный рост.


Ты, прямо, анти-сатер и анти-александреску и еще много людей, как Steve Yegge (да, для меня существую авторитеты), которые говорили, что нахрена создавать класс на каждый чих, когда функция, это вполне самостоятельная единица.
class SomethingDoer
{
  static void DoSomething();
}


Вот и дотнет программисты ломают голову, когда им нужен глагол, они почему-то должны придумывать существительное.

BDA>Не приведя примера такой ошибки, вы затрудняете обсуждение этого пункта. Например, шаблоны у вас, скорее всего, не к месту, но как я это покажу, не видя кода?


Да бог с ним. Вы когда-нибудь смотрели или отлаживали код СТЛ темплейтов? Я да и много раз. Это касается не только строки.

BDA>Однако по сути вы все равно не правы, и это видно даже без примеров. Мне лень объяснять детали и я сделаю проще: прибегну к специальной терминологии. Ошибка, которую вы допускаете, называется редукционизм. Что это значит и как понимать, вы узнаете из этой книги: https://books.google.ru/books/about/The_Fabric_of_Reality.html?id=2LqEPNf9jXsC&amp;hl=en В качестве бонуса каждому прочитавшему я готов дать один файлик всего лишь на 255 байт, который, по вашей теории, должно быть легко читать и понимать. Редкая птица долетала до его середины.


За ссылки, конечно, спасибо и я постараюсь почитать, но для этого разговора, хотелось бы книжек или блогов по программированию и именно по теме поддерживающих твою точку зрения. Неужели никто ничего такого не написал? Ну, может, Мартин Фаулер, корпоративный любимчик, строитель больших ООП иерархий?

BDA>И это тоже ошибка редукционизма. Концепт string::ToUpper() занимает в голове меньше места, чем применение std::transform в каждом конкретном случае.


Я говорил о внутренностях и особенностях реализации этих методов, а не о знании их наличия.

BDA>Привели, и что? Смеяться я не буду, это просто ничем не обоснование утверждение, над чем же тут смеяться?


Для меня то, что эти люди написали (а ведь каждое правило в этой книжке содержит ссылки на более толстые книжки) и есть обоснование. Хотя я понимаю, что ты не согласен с этим.

BDA>Короче, две книжки, которые я вам посоветовал, могут полностью перевернуть ваше миропонимание. На каждом шагу вылезает то, что объяснить проблемы сиплюсплюса и его архитектуры лучше всего в терминах типа редукционизма, но сначала же теория нужна. Образование. А своими словами пересказывать эти фундаментальные труды я не могу.


Может быть почитаю. Только не факт, что я сделаю такие же выводы. Такое тоже бывают.

G>>Все делается алгоритмами. На stackoverflow есть способы сделать все это без буста и с высоким контролем над решением. Сплит делается с помощью std::find и цикла.


BDA>Все делается на ассемблере. Идите уже до конца. Остальное в глазах редукциониста должно быть просто ненужное повышение уровня.


Зачем же в крайности бросаться.

BDA>Тем не менее, отдадим ему должное, он, в процитированной колонке, дает ХОРОШЕЕ ОБЪЯСНЕНИЕ, почему bloatware (не всякое, а такое, как System.String или MS Office 2000) — миф. И это хорошее объяснение хорошо изложено. Вы это объяснение проигнорировали, а прицепились к тому, кто его дал. И если это, по-вашему, продуктивное поведение, то от продукта вашего поведения не очень хорошо пахнет.


Это зависит от пользователя и от ситуации. Кому-то notepad++, vim, а кому то раздутый ворд нужен в разные промежутки времени. Так что он и прав и не прав одновременно. Так же и со строкой. Кому-то Кьют строка нужна, а потом СТЛ строка. Но зачем же делать так, чтобы Кьютная строка была везде. Об этом ведь речь.

G>>Так о том и речь. Если хочется удобств, то надо на джаву или дот нет сразу идти


BDA>Сегодня жемчужины в этом форуме собираю горстями. Вот так вот, хочется удобств — вали отсюда. Прямо в FAQ просится, кроме шуток. Чтоб знать, с чем связываешься.


Почему же "вали"?! Я и сам на дотнете работал дохрена времени и еще буду работать. Это же как айфон и зеркалочка с киллограммовой линзой. Вот ты жалуешься, "тяжелая", надо апертуру настраивать. А я и говорю, ну не хочется, возьми айфон. Он и цвет подберет нужный и подрисует что-то. А потом когда тебе захочется что-то особенного, реальности или тонкой настройки, возьмешь зеркалку и потерпишь ее размеры и тяжесть.

BDA>>>Здравстуйте, а терминаторный ноль кто будет вписывать для каждого элемента? Зачем ему набор указателей с общим терминатором на всех? Короче, это никакое не большинство случаев, а самое редкое исключение.


BDA>То есть, это не копирование, так получается?


Ну так это, как просил, если терминаторный ноль нужен. Мне бы он не нужен был, скорее всего. С двумя итераторами тоже можно много чего сделать. std::equal, например.

BDA>dynamic_cast — никак. Сама его идея — оператор, который будет работать только при заданных опциях сборки проекта — уродлива. В других языках, где RTTI неотключаем, это делается изящным оператором as. Для всего остального есть (T).


Я не думаю, что as изящен. Ведь сразу после него надо проверять на null. Множество дотнетчиков повторяют эту ошибку изо дня в день.

string s = o as string;
if(s == null)
{
  throw ...
}

ну ведь глупость же

string s = (string)o;


сам бросит исключение, если надо.
Re[10]: Кому ваще этот С++ нужен?
От: Evgeny.Panasyuk Россия  
Дата: 24.05.15 01:41
Оценка:
Здравствуйте, 0BD11A0D, Вы писали:

BDA>А теперь послушайте другую интерпретацию вашего наблюдения. Чуть ли не единственное, но убойное преимущество ООП — возможность так организовать код, что он становится самодокументируемым. Как раз интеллисенс играет тут первую скрипку. Вы открываете его окошко и видите ВСЕ возможности некоторого класса.


Нет, далеко не все. Например он не покажет что этот объект может быть аргументом у метода другого объекта
А вот если складывать внутрь класса всё то что может быть реализовано через его публичный интерфейс — то это уже ухудшение инкапсуляции и усложнение поддержки.
Да и например в D можно вызывать non-member функцию через "точку", такое может и к C++ добавят (была даже статья от Страуструпа об этом (как и об обратом — вызов метода с синтаксисом функции)) — так что IntelliSense это слабый аргумент (это скорее вопрос к IDE — пусть делают новые формы дополнения, а не только "через точку").

BDA>Альтернатива — курить маны. То есть, вышел новый стандарт, новый STL, новый boost и вы должны сразу прочитать, понять и запомнить все, что написано в сопроводиловке.


Читать документацию придётся в любом случае, чтобы знать контракты.

BDA>Нормальные люди предпочитают осмотреть классы с высоты птичьего полета, чтобы знать, что вообще есть, а потом уже углубленно знакомиться с нюансами вызова методов (типа, почему пишется Манчестер, читается Истанбул).


А это вообще ортогонально. Декомпозицию на контейнеры и алгоритмы можно делать и в что называется в "true OO style". То есть смотришь ты "с высоты птичьего полета" на класс UTF-8 строки, и видишь что она реализует IBidirectionalSequence, далее смотришь на алгоритмы которые принимают IBidirectionalSequence — и находишь там to_lower, split или что там нужно.

Или ты против такой декомпозиции вообще? Тогда например для каждой строки (и контейнера в общем) придётся придётся реализовывать каждый алгоритм — M контейнеров * N алгоритмов

BDA>Как раз вынесение алгоритмов за пределы классов принципиально и не дает воспользоваться этим преимуществом ООП. Процедурщина и хендловщина в полный рост.


Ты так говоришь как будто "true OOP" это всегда хорошо, а "процедурщина" плохо.
Отредактировано 24.05.2015 2:16 Evgeny.Panasyuk . Предыдущая версия .
Re[11]: Кому ваще этот С++ нужен?
От: Evgeny.Panasyuk Россия  
Дата: 24.05.15 01:52
Оценка: 1 (1) +1
Здравствуйте, greenpci, Вы писали:

BDA>>Как раз вынесение алгоритмов за пределы классов принципиально и не дает воспользоваться этим преимуществом ООП. Процедурщина и хендловщина в полный рост.

G>Ты, прямо, анти-сатер и анти-александреску и еще много людей

Практически у всех must-read C++ авторов есть что-нибудь на эту тему. Я кстати делал подборку(что-то уже было выше):
1. Alexander Stepanov. Notes on Programming:

While we could make a member function to return length, it is better to make it a global friend function. If we do that, we will be able eventually to define the same function to work on built-in arrays and achieve greater uniformity of design. I made size into a member function in STL in an attempt to please the standard committee. I knew that begin, end and size should be global functions but was not willing to risk another fight with the committee. In general, there were many compromises of which I am ashamed. It would have been harder to succeed without making them, but I still get a metallic taste in my mouth when I encounter all the things that I did wrong while knowing full how to do them right. Success, after all, is much overrated. I will be pointing to the incorrect designs in STL here and there: some were done because of political considerations, but many were mistakes caused by my inability to discern general principles.)

2. Bjarne Stroustrup. The C++ Programming Language:

10.3.2 Helper Functions
Typically, a class has a number of functions associated with it that need not be defined in the class itself because they don’t need direct access to the representation. For example:

int diff(Date a,Date b); // number of days in the range [a,b) or [b,a)
bool leapyear(int y);
Date next_weekday(Date d);
Date next_saturday(Date d);

Defining such functions in the class itself would complicate the class interface and increase the number of functions that would potentially need to be examined when a change to the representation was considered. How are such functions "associated" with class Date? Traditionally, their declarations were simply placed in the same file as the declaration of class Date, and users who needed Dates would make them all available by including the file that defined the interface.

3. Andrei Alexandrescu. Comment:

Basically my belief is that nonvirtual member functions in general are an unnecessary cutesy in C++ that wahses people's brains, leads to bad programs, and will take many years to wear off. For smart pointers in particular, they can do even more harm.

4. Andrei Alexandrescu and Herb Sutter. C++ Coding Standards: 44. Prefer writing nonmember nonfriend functions
5. Scott Meyers. How Non-Member Functions Improve Encapsulation:

I'll start with the punchline: If you're writing a function that can be implemented as either a member or as a non-friend non-member, you should prefer to implement it as a non-member function. That decision increases class encapsulation. When you think encapsulation, you should think non-member functions.
Surprised? Read on.

Re[6]: Кому ваще этот С++ нужен?
От: greenpci  
Дата: 24.05.15 07:58
Оценка:
Здравствуйте, Igor Karablin, Вы писали:

IK>К сожалению (почти) нечему тормозить только у vector, с остальными контейнерами не всё так гладко.


Могу подтвердить. Производил замеры памяти и скорости, и пришлось отказаться от std::map и std::vector<bool> (отдельная спецификация вектора) в нашем продукте в пользу других реализаций, хотя очень хотелось использовать СТЛевские. Надо сказать, что создатели и не претендавали на самую быструю реализацию. Задача была выбрать меньшее из зол и удовлетворить большинство.
Re[6]: Кому ваще этот С++ нужен?
От: Константин Черногория  
Дата: 24.05.15 08:01
Оценка: +1
Здравствуйте, Igor Karablin, Вы писали:

Спасибо, интересно.

IK>https://youtube.com/watch?v=fHNmRkzxHWs

На слайде "A good hash table design" он прям повторяет дизайн CAtlMap, который появился в ATL 7.0 в 2003 году.
И сам же афтар признаёт, что в мире open source до сих пор нет годных аналогов.
Re[7]: Кому ваще этот С++ нужен?
От: Evgeny.Panasyuk Россия  
Дата: 24.05.15 08:16
Оценка:
Здравствуйте, greenpci, Вы писали:

IK>>К сожалению (почти) нечему тормозить только у vector, с остальными контейнерами не всё так гладко.

G>Могу подтвердить. Производил замеры памяти и скорости, и пришлось отказаться от std::map

std::map на что заменили? На дерево со встроенным free-list?
Re[8]: Кому ваще этот С++ нужен?
От: greenpci  
Дата: 24.05.15 08:36
Оценка: :)
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>std::map на что заменили? На дерево со встроенным free-list?


Сам полностью написал хэш мэп. Под наши специфические данные нужно было память экономить.
Re[9]: Кому ваще этот С++ нужен?
От: Evgeny.Panasyuk Россия  
Дата: 24.05.15 08:46
Оценка: +1
Здравствуйте, greenpci, Вы писали:

EP>>std::map на что заменили? На дерево со встроенным free-list?

G>Сам полностью написал хэш мэп. Под наши специфические данные нужно было память экономить.

То есть ты заменил одну структуру данных, на совершенно другую, с другой алгоритмической сложностью и с другими требованиями к типу данных, и на основе этих опытов пришёл к выводу что std::map тормозит?
Re[10]: Кому ваще этот С++ нужен?
От: greenpci  
Дата: 24.05.15 09:03
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>То есть ты заменил одну структуру данных, на совершенно другую, с другой алгоритмической сложностью и с другими требованиями к типу данных, и на основе этих опытов пришёл к выводу что std::map тормозит?


Этож не я говорил, что тормозит. Я подтвердил, что "с остальными контейнерами не всё так гладко". Ну я еще unordered_map замерял. А так да, действительно совсем другая структура и требования к данным. Их не корректно сравнивать с этой точки зрения.
Re[9]: Кому ваще этот С++ нужен?
От: Nuzhny Россия https://github.com/Nuzhny007
Дата: 24.05.15 09:07
Оценка:
Здравствуйте, greenpci, Вы писали:

EP>>std::map на что заменили? На дерево со встроенным free-list?

G>Сам полностью написал хэш мэп. Под наши специфические данные нужно было память экономить.

И как он по памяти и скорости выигрывает у std'шного hashmap? Неужели так заметно?
Re[10]: Кому ваще этот С++ нужен?
От: greenpci  
Дата: 24.05.15 09:34
Оценка: +1 -1
Здравствуйте, Nuzhny, Вы писали:

N>И как он по памяти и скорости выигрывает у std'шного hashmap? Неужели так заметно?


Да. При большом количестве итераций. Сейчас цифр не помню, да и бесполезны они здесь, так как наших данных и контекста все равно ни у кого не будет. А с коллегами я это все обсудил.
Re[11]: Кому ваще этот С++ нужен?
От: greenpci  
Дата: 24.05.15 09:48
Оценка:
Здравствуйте, greenpci, Вы писали:

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


Проясню ситуацию. Тот хэш мап, что я сделал, не подойдет как замена СТЛьному, так как он был неразрывно связан с нашими данными. Как уже верно заметили выше, его не корректно сравнивать, так как он не заменит СТЛьный хэш мап.
Re[9]: Кому ваще этот С++ нужен?
От: vdimas Россия  
Дата: 25.05.15 06:11
Оценка: 1 (1) +1
Здравствуйте, Cyberax, Вы писали:

V>>Так это же отлично.

V>>Но ты не объяснил мне, зачем вручную заставлять делать точно так же, если компилятор генерит такой же код при копировании вектора?
C>Быстрее.

Нет.
Т.е. совсем совсем нет.
Тот код, что ты показал — работает заведомо медленнее.

V>>К тому же, MSVC вызывает библиотеку только для случая, когда количество копируемых байт на этапе компиляции неизвестно, а это достаточно редкий сценарий, который к тому же говорит, что в консерваитории что-то не так. ))

C>memcpy из glibc работает быстрее нативного копирования во всех случаях, когда размер не известен статически и больше порядка 64 байт.

Опять нет. ))
Вот не везет тебе.
Для вектора генерится код, копирующий данные блоками по 128 байт. Самое важное отличие от кода по твоим ссылкам я опишу чуть ниже (т.к. там один и тот же принцип, что для достаточно больших размеров даже известных данных, что для общего случая — практически идентичный код генерится).

И ты не ответил на самое важное:

Голые байты на тех сценариях, в которых важно быстродействие memcpy, "перекачивают" блоками фиксированного размера. Это важно и это, действительно, даёт заметный профит

Т.е. за счет косметических модификаций процесса обработки данных можно снизить затраты на "голые копирования" в 3-5 раз.
Это если, действительно, выделенное имеет значение в тех алгоритмах.
Но то, что ты описал:

Сейчас единственное улучшение в нашей внутренней STL — это специализация векторов для POD-объектов, которые можно сразу через memcpy копировать.

Это непонимание основы основ в плане "перекачки" данных и вообще — как надо писать матан или эффективный сетевой диспатчинг.
И я объяснял — почему:

Да еще ты дал код для копирования через memcpy невыровненных даных...
Какая боль... в обсуждении про то, как важен быстрый memcpy.

Жесть ))

V>>Разве у других сломался вывод в дизассемблированном виде при отладке?

C>Ну так покажи что там генерирует MSVC. Мы посмеёмся вместе.

Я же тебе сказал уже:
Раз:

При копировании STL вектора для POD-типов в релизе он тоже перекачивает память через MMX/SSE/AVX точно так же, как в тех случаях, когда используются массивы заведомо известного размера.

Для SSE2 код похож на вот этот:

http://code.metager.de/source/xref/gnu/glibc/sysdeps/x86_64/multiarch/memcpy-sse2-unaligned.S

С тем важным отличием, что нет 4-х лишних ветвлений, начинающихся в коде от метки L31 и еще 4-х ветвлений в L(less_16). Ты изучи те отрезки повнимательнее. Поймешь, чем именно ты вызвал столько улыбок. ))

И да. Я оч много писал на асме в своё время. Читай в другой раз код, который мне кидаешь, чтобы не было как в этот раз.

Нормальный компилятор на этапе компиляции ЗАВЕДОМО знает кратность размера данных, поэтому НЕ ГЕНЕРИТ лишних ветвлений и процессор по ним не гуляет. А что такое лишнее ветвление в "критичном memcpy"? Да это приговор, собсно.

Далее, он точно так же выполняет "раскрутку" цикла, т.е. тело цикла за раз перекидывает 128 байт (как по твоей ссылке в основном теле алгоритма), но нет кучи сравнений и переходов для копирования всевозможных "хвостиков-остатков" данных, т.к. размер, либо кратность данных (в случае STL-вектора) заведомо известны:
    S1 s2;
    memcpy(&s2, s1, sizeof(S1));
000000013F8D1360  lea         rcx, [s2]
000000013F8D1365  mov         r8d, 2
000000013F8D136B  nop         dword ptr[rax + rax]
000000013F8D1370  vmovups     ymm0, ymmword ptr[rax]
000000013F8D1374  vmovups     ymmword ptr[rcx], ymm0
000000013F8D1378  vmovups     ymm0, ymmword ptr[rax + 20h]
000000013F8D137D  vmovups     ymmword ptr[rcx + 20h], ymm0
000000013F8D1382  vmovups     ymm0, ymmword ptr[rax + 40h]
000000013F8D1387  vmovups     ymmword ptr[rcx + 40h], ymm0
000000013F8D138C  vmovups     xmm0, xmmword ptr[rax + 60h]
000000013F8D1391  vmovups     xmmword ptr[rcx + 60h], xmm0
000000013F8D1396  lea         rcx, [rcx + 80h]
000000013F8D139D  vmovups     xmm1, xmmword ptr[rax + 70h]
000000013F8D13A2  vmovups     xmmword ptr[rcx - 10h], xmm1
000000013F8D13A7  lea         rax, [rax + 80h]
000000013F8D13AE  dec         r8
000000013F8D13B1  jne         main + 100h (013F8D1370h)
/* смотреть сюда: ниже идет прямой код для копирования остатка-хвостика данных, не кратных 128. */
000000013F8D13B3  vmovups     ymm0, ymmword ptr[rax]
000000013F8D13B7  vmovups     ymmword ptr[rcx], ymm0

В коде sizeof(S1) == 288. Специально взял некратную величину для демонстрации того, что происходит, когда кратность данных заведомо известна (а она в ТВОЁМ случае таки была заведомо известна).

Если на вашей платформе MSVC недоступен — откройте для себя Intel Compiler. Тоже офигенно управляется с интристиками. Всячески рекомендую.

Ну и, модифицировав алгоритм таким образом, чтобы на каждом этапе обрабатывались данные фиксированного размера (пакеты), вместо всего того мусора по твоей ссылке, и даже вместо приведенного куска с одним ветвлением и счетчиком "оборотов" в r8, будет просто 4 пересылки, если взять буфер в 128 байт или построить на "шаблонной раскрутке" кратный по размерам буфер. Т.е. будет вообще БЕЗ ВЕТВЛЕНИЙ. Именно на прокапсенном затраты на конкретно операции копирование падают в 3-5 раз (в зависимости от размера "пакета".. например, если речь идет о десятках килобайт простого копирования за раз, то тут уже что-то не то и на матан или кодеки это не тянет и там уже многое будет пофиг, бо с таким загрязнением кеша данных сильнее всего будет тормозить уже кеш, чем что бы то ни было).

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


V>>И почему для разных процессоров, если у меня проц подерживает одновременно SSE2, AVX и AVX D?

C>А у меня не поддерживает AVX. А на другом процессоре SSSE3 быстрее. Что мне делать?

SSE3 быстрее в копировании... Это уже предел падения, коллега. Курить отличие SSE3 от SSE2.

Как домашнее задание — попытаться найти в SSE3 хоть инструкцию, которая может загружать в регистры более "широкие" данные или выгружать более широкие.
Еще домашнее задание — попытаться найти проц БЕЗ поддержки SSE2 на x64 — архитектуре (AMD64 которая).

Как говорят украинские политики, "ты уже на 15 лет наговорил". Натурально. ))


V>>От тебя всегда как привет из параллельной реальности ))

C>То что ты ничерта не знаешь, не хочешь знать, и являешься эталоном полного ламера — мы уже давно выяснили.

Хосподя, конкретно ты далеко не всегда понимаешь о чем даже речь.
Это из-за лени, ИМХО, потому что никакой "закрытой" инфы я не даю, всё всегда можно проверить самому. Было бы желание.
Re[9]: Кому ваще этот С++ нужен?
От: vdimas Россия  
Дата: 25.05.15 06:30
Оценка:
Здравствуйте, Cyberax, Вы писали:

Вдогонку.
Обратил внимание, что по одной из ссылок (для SSE3) есть еще дополнительная возня и дополнительные ветвления в попытках применить MOVAPS вместо MOVUPS.

Всем валяться!!! )))
В процессорах с 2008-го года скорость MOVAPS и MOVUPS идентичная для выровненных по границе 16 байт данных.
А для твоего случая, если вы там не намудрили со своими аллокаторами, в x64-режиме под STL-вектор (твой случай) ВСЕГДА будут выделяться данные, выровненные на границе 16 байт.

Занавес...
Re[11]: Кому ваще этот С++ нужен?
От: 0BD11A0D  
Дата: 25.05.15 15:10
Оценка:
Здравствуйте, watchyourinfo, Вы писали:

W>Компилятор с такой опцией включенной не удовлетворяет стандарту.


Не знал. Я думал, это дизайн такой упоротый. Ну ладно, ОК, проблемы начинаются где-то после стандартизации. Когда создатели всех промышленных компиляторов добавляют такую фичу. И знаете, если подумать еще, это, наверное, все-таки проблема языка — насильно включенный RTTI идет вразрез с изначальными ценностями, неудивительно, что потом его дают отключать.
Re[15]: Кому ваще этот С++ нужен?
От: 0BD11A0D  
Дата: 25.05.15 15:27
Оценка:
Здравствуйте, Stanislav V. Zudin, Вы писали:

Мало что понял, честно сказать. Пример бы помог (наверное).
Re[11]: Кому ваще этот С++ нужен?
От: 0BD11A0D  
Дата: 27.05.15 16:03
Оценка:
Здравствуйте, greenpci, Вы писали:

G>Мне кажется, это негативная сторона, так же, как и Google Driven Development. Находя метод в интеллисенсе, программисты переоценивают свое понимание того, что и как он делает. Страшно подумать, сколько раз программисты очищали память с помощью std::ostringstream::clear(). Множество моих знакомых говорили, что они уже не читают книги по программированию, так как в интеллисенсе и гугле все есть. Мне кажется, даже хороший дотнет программист должен знать не только инструкцию к методу фреймворка, но и, иногда, смотреть на его код. Си плюс плюс, как язык "тонкой настройки", тем более требует знания деталей глубже, чем интеллисенс. И я лично за то, чтобы специалисты читали книжки, прежде чем, что-либо делать. Хотя, это и не популярная точка зрения. А новые платформы, как дотнет, настолько быстро меняются, что людям не когда что-то изучать, и это еще одна причина, по которой интеллисенс там так нужен. Создали проблему, решили проблему.


Благодаря гуглу (+ стековерфлоу) это, как раз, у буста (как вынесенных кишок сиплюсплюсных строк) пока еще есть какие-то шансы. ОК, гугл, std string make lower case, понятно, boost::algo, код написан. С FCL же можно работать и автономно, благодаря интеллисенсу и общей эрудиции.

Разбираться затем бывает нужно (или не нужно) и с тем, и с тем, но начинается у нормальных людей все так, как описано выше.

Хуже всего то, что язык форматирует мышление, в результате бОльшая часть архитекторов, которых я видел, предпочитает дикий процедурный подход, не затрудняя себя классификацией более тонкой, чем неймспейсы. Я могу понять, когда это (под?)сознательная защита от новичков на проекте, стремление сохранить рабочее место, но когда это по образцу стандартной библиотеки сделано...

G>Это я еще не упомянул научную книгу "Антимозг", исходя из которой, можно сделать вывод, что интеллисенс также "разрушает" гиппокамус и ухудшает память.

G>Но это только моя точка зрения. Большинство все равно его используют и пара лишних, для кого-то ненужных методов будет слегка вредна.

Начал читать, выглядит очень толково. Поэтому ваш вывод меня удивляет сверх всякой меры. Интеллисенс ЗАСТАВЛЯЕТ вас думать и принимать решение, но дает набор сведений, которые можно уподобить дорожным указателям. Их полное отсутствие (как в C++) это экстремальная езда по улицам, лишенным указателей, и возможная только при заучивании наизусть карты города. Мозг от этого упражнения лучше не становится, как и езда безопаснее. Аналогия с GPS из книжки неполная, ибо в программировании просто нет такого, чтобы какая-то программа тебе диктовала, а ты рулил, как крыса в лабиринте. Отсюда мой вывод: книжка эта тут не при чем, а если при чем, то процитируйте явно кусок, который можно применить к интеллисенсу.

BDA>>Как раз вынесение алгоритмов за пределы классов принципиально и не дает воспользоваться этим преимуществом ООП. Процедурщина и хендловщина в полный рост.


G>Ты, прямо, анти-сатер и анти-александреску и еще много людей, как Steve Yegge (да, для меня существую авторитеты)


Хорошо, но тогда общаться с вами настолько же полезно, насколько с любыми другими фанатиками. То есть, бесполезно. Простой пример:

, которые говорили, что нахрена создавать класс на каждый чих, когда функция, это вполне самостоятельная единица.
G>
G>class SomethingDoer
G>{
G>  static void DoSomething();
G>}
G>


Если бы вы рассуждали на уровне аргументов, вас бы можно было убедить, что пример лажовый, абсолютно не в кассу. Но раз его написал Steve Yegge...
Re[11]: Кому ваще этот С++ нужен?
От: 0BD11A0D  
Дата: 27.05.15 17:28
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Нет, далеко не все. Например он не покажет что этот объект может быть аргументом у метода другого объекта


Потому, что это информация не об объекте.

EP>это скорее вопрос к IDE — пусть делают новые формы дополнения, а не только "через точку"


Это принципиально невозможно.

BDA>>Альтернатива — курить маны. То есть, вышел новый стандарт, новый STL, новый boost и вы должны сразу прочитать, понять и запомнить все, что написано в сопроводиловке.

EP>Читать документацию придётся в любом случае, чтобы знать контракты.

В хорошем коде контракты выражены через него же. Но даже если нет, индекс контрактов нужен как отдельный инструмент всегда.

EP>А это вообще ортогонально. Декомпозицию на контейнеры и алгоритмы можно делать и в что называется в "true OO style". То есть смотришь ты "с высоты птичьего полета" на класс UTF-8 строки, и видишь что она реализует IBidirectionalSequence, далее смотришь на алгоритмы которые принимают IBidirectionalSequence — и находишь там to_lower, split или что там нужно.


Когда вы покажете, что в IDE можно сделать интеллисенс, не основанный на инкапсуляции, я соглашусь. Но выше я утверждаю, что это невозможно. Однако бремя доказательства обратного я возлагаю на вас — ведь это вы написали «пусть делают новые формы дополнения», вам и показывать, КАК ИМЕННО.

EP>Или ты против такой декомпозиции вообще? Тогда например для каждой строки (и контейнера в общем) придётся придётся реализовывать каждый алгоритм — M контейнеров * N алгоритмов


Зачем? Если алгоритму не важен тип контейнера, он может быть реализован в классе АбстрактныйКонтейнер, а затем переопределен в более специфическом классе. Никакого комбинаторного взрыва.

BDA>>Как раз вынесение алгоритмов за пределы классов принципиально и не дает воспользоваться этим преимуществом ООП. Процедурщина и хендловщина в полный рост.


EP>Ты так говоришь как будто "true OOP" это всегда хорошо, а "процедурщина" плохо.


С меня будет достаточно, если вы подтвердите, что стандартная библиотека C++ — не true OOP. Хорошо это или плохо, мы поговорим в другой раз.
Re[7]: Кому ваще этот С++ нужен?
От: Eugeny__ Украина  
Дата: 28.05.15 13:50
Оценка:
Здравствуйте, greenpci, Вы писали:


G>std::string ::ToLower() это еще одно выделение памяти и копирование или move (который появился относительно недавно).


Хотел бы я знать, как ты собираешься делать ToLower или ToUpper без перевыделения памяти. Учитывая, что ascii давно на помоечке, а в юникоде эта операция запросто может привести к увеличению фактической длины строки в байтах — и как ее затокать назад в исходный буфер?
Новости очень смешные. Зря вы не смотрите. Как будто за наркоманами подсматриваешь. Только тетка с погодой в завязке.
There is no such thing as a winnable war.
Re[8]: Кому ваще этот С++ нужен?
От: greenpci  
Дата: 28.05.15 14:45
Оценка:
Здравствуйте, Eugeny__, Вы писали:

G>>std::string ::ToLower() это еще одно выделение памяти и копирование или move (который появился относительно недавно).


E__>Хотел бы я знать, как ты собираешься делать ToLower или ToUpper без перевыделения памяти. Учитывая, что ascii давно на помоечке, а в юникоде эта операция запросто может привести к увеличению фактической длины строки в байтах — и как ее затокать назад в исходный буфер?


Во первых, я сказал "еще одно".

std::string ::ToLower()
{
  ...
  return buffer; // вот оно то, которое можно избежать
}



Во вторых, смотри char16_t и char32_t, которые были добавлены в С++11 с целью обеспечить фиксированную длину символа.
Re[9]: Кому ваще этот С++ нужен?
От: McQwerty Россия  
Дата: 28.05.15 21:21
Оценка: +1
Здравствуйте, greenpci, Вы писали:

G>>>std::string ::ToLower() это еще одно выделение памяти и копирование или move (который появился относительно недавно).

E__>>Хотел бы я знать, как ты собираешься делать ToLower или ToUpper без перевыделения памяти. Учитывая, что ascii давно на помоечке, а в юникоде эта операция запросто может привести к увеличению фактической длины строки в байтах — и как ее затокать назад в исходный буфер?
G>Во вторых, смотри char16_t и char32_t, которые были добавлены в С++11 с целью обеспечить фиксированную длину символа.
В некоторых языках есть некоторые извраты. Например для немецкого: ToUpper ("ß") == "SS".
Re[12]: Кому ваще этот С++ нужен?
От: Cyberax Марс  
Дата: 28.05.15 22:32
Оценка: +1
Здравствуйте, 0BD11A0D, Вы писали:

BDA>Когда вы покажете, что в IDE можно сделать интеллисенс, не основанный на инкапсуляции, я соглашусь. Но выше я утверждаю, что это невозможно.

Т.е. основная причина для толстых классов — чтобы говнопрограммисты через "ctrl-tab" могли код дополнять? LOL.

Meanwhile in IDEA: http://blog.jetbrains.com/idea/2012/08/complete-static-methods-and-fields-with-the-new-intellij-idea-12-eap-build-12229/
Sapienti sat!
Re[13]: Кому ваще этот С++ нужен?
От: 0BD11A0D  
Дата: 28.05.15 23:14
Оценка:
Здравствуйте, Cyberax, Вы писали:

BDA>>Когда вы покажете, что в IDE можно сделать интеллисенс, не основанный на инкапсуляции, я соглашусь. Но выше я утверждаю, что это невозможно.

C>Т.е. основная причина для толстых классов — чтобы говнопрограммисты через "ctrl-tab" могли код дополнять? LOL.

C>Meanwhile in IDEA: http://blog.jetbrains.com/idea/2012/08/complete-static-methods-and-fields-with-the-new-intellij-idea-12-eap-build-12229/


Талант у человека — что ни напишет, все не в тему. Взять IDE от Java вместо CLion, притянуть поиск по именам в статических методах вместо ПОДБОРА ВСЕХ ПОДДЕРЖИВАЕМЫХ АЛГОРИТМОВ ПО ОБЪЕКТУ, а потом ололокать — это не говнопрограммистом надо быть, а я не знаю, кем.

К сведению тех, у кого смех без причины: если что-то не может делать интеллисенс, это означает, что операция — в данном случае, составление списка всех подходящих алгоритмов — является неавтоматизируемой. Интеллисенс просто служит маркером. И хотя по сути своей, это не творческая, а рутинная задача, она никак не автоматизируется, пока не прибегнешь к инкапсуляции. В том числе поэтому FCL такой, какой он есть.
Re[10]: Кому ваще этот С++ нужен?
От: greenpci  
Дата: 29.05.15 01:23
Оценка:
Здравствуйте, McQwerty, Вы писали:

G>>Во вторых, смотри char16_t и char32_t, которые были добавлены в С++11 с целью обеспечить фиксированную длину символа.

MQ>В некоторых языках есть некоторые извраты. Например для немецкого: ToUpper ("ß") == "SS".

Так а в чем проблема? "ß" и "SS" оба будут занимать 16 и 32 бита в char16_t и char32_t соответственно. Почему нельзя их in-place заменить?
Отредактировано 29.05.2015 1:51 greenpci . Предыдущая версия .
Re[11]: Кому ваще этот С++ нужен?
От: Eugeny__ Украина  
Дата: 29.05.15 07:17
Оценка:
Здравствуйте, greenpci, Вы писали:

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


G>>>Во вторых, смотри char16_t и char32_t, которые были добавлены в С++11 с целью обеспечить фиксированную длину символа.

MQ>>В некоторых языках есть некоторые извраты. Например для немецкого: ToUpper ("ß") == "SS".

G>Так а в чем проблема? "ß" и "SS" оба будут занимать 16 и 32 бита в char16_t и char32_t соответственно. Почему нельзя их in-place заменить?


Неа. "SS" — это два символа, т.е. 2 чара — это не компаунд, а именно что две стандартных буквы S(которые будут занимать 32 и 64 бита в втоем случае). А "ß" — один символ, один чар. И это далеко не единственный подобный изврат в юникоде. Хотя, может, С++11 умеет как-то хитро компоновать чары, что-то вроде utf-8, но не utf-8(иначе на кой хрен нужны 16 и 32 бита на чар?), но тогда работа с этим обернется адовым геморроем.
Не, ну можно воспринимать строку просто как контейнер каких-то-там байтов, которые желательно интерпритировать как строку, но в 21 веке это звучит диковато. А все из-за того, что кому-то очень хочется сэкономить на выделении памяти под модифицированную строку(вообще, имхо, строки должны быть иммутабельны, да и вообще иммутабельность желательна для подавляющего количества объектов кроме специальных случаев — решается сразу куча проблем).
Новости очень смешные. Зря вы не смотрите. Как будто за наркоманами подсматриваешь. Только тетка с погодой в завязке.
There is no such thing as a winnable war.
Re[8]: Кому ваще этот С++ нужен?
От: Eugeny__ Украина  
Дата: 29.05.15 07:29
Оценка:
Здравствуйте, vdimas, Вы писали:


V>К тому же, MSVC вызывает библиотеку только для случая, когда количество копируемых байт на этапе компиляции неизвестно, а это достаточно редкий сценарий, который к тому же говорит, что в консерваитории что-то не так. ))


Что значит "редкий сценарий"? Программы работают с внешними данными, характер которых и размер на этапе компиляции по определению неизвестен. Иначе на кой хрен та программа вообще нужна?
Новости очень смешные. Зря вы не смотрите. Как будто за наркоманами подсматриваешь. Только тетка с погодой в завязке.
There is no such thing as a winnable war.
Re[14]: Кому ваще этот С++ нужен?
От: Cyberax Марс  
Дата: 29.05.15 07:35
Оценка: -2
Здравствуйте, 0BD11A0D, Вы писали:

C>>Meanwhile in IDEA: http://blog.jetbrains.com/idea/2012/08/complete-static-methods-and-fields-with-the-new-intellij-idea-12-eap-build-12229/

BDA>Талант у человека — что ни напишет, все не в тему. Взять IDE от Java вместо CLion, притянуть поиск по именам в статических методах вместо ПОДБОРА ВСЕХ ПОДДЕРЖИВАЕМЫХ АЛГОРИТМОВ ПО ОБЪЕКТУ, а потом ололокать — это не говнопрограммистом надо быть, а я не знаю, кем.
Я понимаю, у вас в String запиханы ВСЕ методы, которые когда-либо работают со строкой. Для тех методов, которые со строками не работают по каким-то надуманным причинам — сделаны строковые обёртки.

А программы пишутся выбором методов после "MyNameIsVasja".ctrl-space. При этом заранее неизвестно что за метод нужен, программист всегда пробегает по всему списку методов и выбирает наиболее интересный.

Ну типа, надо вызвать disk.getInfo() и программист пишет "MyNameIsVasja".getDiskBlockInfo(disk). При этом интеллисенс очен вежливо подсказывает, какой именно disk должен попасть в параметр!

Да, я начинаю понимать всю всемогущность такой техники! Завтра же переписываю все свои программы!
Sapienti sat!
Re[12]: Кому ваще этот С++ нужен?
От: greenpci  
Дата: 29.05.15 09:17
Оценка:
Здравствуйте, Eugeny__, Вы писали:

G>>Так а в чем проблема? "ß" и "SS" оба будут занимать 16 и 32 бита в char16_t и char32_t соответственно. Почему нельзя их in-place заменить?


E__>Неа. "SS" — это два символа, т.е. 2 чара — это не компаунд, а именно что две стандартных буквы S(которые будут занимать 32 и 64 бита в втоем случае). А "ß" — один символ, один чар. И это далеко не единственный подобный изврат в юникоде. Хотя, может, С++11 умеет как-то хитро компоновать чары, что-то вроде utf-8, но не utf-8(иначе на кой хрен нужны 16 и 32 бита на чар?), но тогда работа с этим обернется адовым геморроем.


В таком случае, можно будет избежать только копирования из пункта 1.

E__>Не, ну можно воспринимать строку просто как контейнер каких-то-там байтов, которые желательно интерпритировать как строку, но в 21 веке это звучит диковато. А все из-за того, что кому-то очень хочется сэкономить на выделении памяти под модифицированную строку(вообще, имхо, строки должны быть иммутабельны, да и вообще иммутабельность желательна для подавляющего количества объектов кроме специальных случаев — решается сразу куча проблем).


Мне кажется С++ и остался для таких вот специфических вещей, если кому-то что-то особенное надо в 21 веке. Кому нужно все самому настроить, а не из коробки: High Frequency Trading, игры и наш случай.
Re[15]: Кому ваще этот С++ нужен?
От: 0BD11A0D  
Дата: 29.05.15 11:46
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>>>Meanwhile in IDEA: http://blog.jetbrains.com/idea/2012/08/complete-static-methods-and-fields-with-the-new-intellij-idea-12-eap-build-12229/

BDA>>Талант у человека — что ни напишет, все не в тему. Взять IDE от Java вместо CLion, притянуть поиск по именам в статических методах вместо ПОДБОРА ВСЕХ ПОДДЕРЖИВАЕМЫХ АЛГОРИТМОВ ПО ОБЪЕКТУ, а потом ололокать — это не говнопрограммистом надо быть, а я не знаю, кем.
C>Я понимаю, у вас в String запиханы ВСЕ методы, которые когда-либо работают со строкой. Для тех методов, которые со строками не работают по каким-то надуманным причинам — сделаны строковые обёртки.

C>А программы пишутся выбором методов после "MyNameIsVasja".ctrl-space. При этом заранее неизвестно что за метод нужен, программист всегда пробегает по всему списку методов и выбирает наиболее интересный.


C>Ну типа, надо вызвать disk.getInfo() и программист пишет "MyNameIsVasja".getDiskBlockInfo(disk). При этом интеллисенс очен вежливо подсказывает, какой именно disk должен попасть в параметр!


C>Да, я начинаю понимать всю всемогущность такой техники! Завтра же переписываю все свои программы!


Ядовитость и острота хороши тогда, когда ими приправлен хорошо продуманный и полезный ответ. Когда ответ как у вас — тупой бесформенный пельмень из сои — а вы его еще и поливаете уксусом, впечатление совсем другое.

Я написал, что в Джаве найти по части имени статические методы всех известных классов — это не то же самое, что найти все алгоритмы в C++, которые могут быть применены к объекту o типа T. Не находите в себе сил признать, что пример притянут за уши и другие внешние органы — не пишите ничего.
Re[16]: Кому ваще этот С++ нужен?
От: Cyberax Марс  
Дата: 29.05.15 16:27
Оценка: +1
Здравствуйте, 0BD11A0D, Вы писали:

C>>Ну типа, надо вызвать disk.getInfo() и программист пишет "MyNameIsVasja".getDiskBlockInfo(disk). При этом интеллисенс очен вежливо подсказывает, какой именно disk должен попасть в параметр!

C>>Да, я начинаю понимать всю всемогущность такой техники! Завтра же переписываю все свои программы!
BDA>Я написал, что в Джаве найти по части имени статические методы всех известных классов — это не то же самое, что найти все алгоритмы в C++, которые могут быть применены к объекту o типа T.
Что конкретно "не так"? Это ровно та же задача, для С++ она только немного сложнее. Принципиальной разницы нет.

BDA>Не находите в себе сил признать, что пример притянут за уши и другие внешние органы — не пишите ничего.

Ну я понимаю, у тебя интеллисенс головного мозга, осложнённый двусторонним ООП, и всё такое.
Sapienti sat!
Re[17]: Кому ваще этот С++ нужен?
От: 0BD11A0D  
Дата: 29.05.15 16:43
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>Что конкретно "не так"? Это ровно та же задача, для С++ она только немного сложнее. Принципиальной разницы нет.


Если разницы нет, почему бы не привести сразу «правильный» пример? Хотя бы одну IDE, которая решает поставленную мною задачу. Это же так легко — р-раз, и я понимаю, что кругом неправ.
Re[9]: Кому ваще этот С++ нужен?
От: IID Россия  
Дата: 29.05.15 17:19
Оценка:
Здравствуйте, Eugeny__, Вы писали:

E__>Что значит "редкий сценарий"? Программы работают с внешними данными, характер которых и размер на этапе компиляции по определению неизвестен. Иначе на кой хрен та программа вообще нужна?


Почему нельзя поставить оценку "фейспалм" ?
kalsarikännit
Re[12]: Кому ваще этот С++ нужен?
От: IID Россия  
Дата: 29.05.15 17:24
Оценка:
Здравствуйте, greenpci, Вы писали:

G>так как он был неразрывно связан с нашими данными.


Тогда вам бы вообще ничего не подошло. Зная характер и особенности данных всегда можно придумать более оптимальную их обработку. Ты демки в 90е не писал ? Обалдел бы, что и как можно выжать из убогенького 8битного камня. Просто хитрой организацией обрабатываемых данных. Даже не в сотни, в тысячи и десятки тысяч раз ускорение.
kalsarikännit
Re[18]: Кому ваще этот С++ нужен?
От: 0BD11A0D  
Дата: 29.05.15 18:32
Оценка:
Очень показательно, что Cyberax даже не попытался зафиксировать меня в рамки, потребовав формализовать задачу (поставленную мною). Хотя я бы первым делом это потребовал. Поскольку победить Cyberax'а мне неинтересно (по причинам, которые ему показались бы обидными, если бы я их озвучил), я сделаю необходимое уточнение сам, добровольно: вдруг кто-то еще покажет мне, что C++ вовсе не так ужасен (а вот это будет интересно).

std::wstring s = L"Москва,Новосибирск,Париж,Лондон,Владивосток";


Панасюк выше написал (про IDE):

>пусть делают новые формы дополнения, а не только "через точку"


Окей, мы не будем ставить точку и ждать интеллисенса. Мы нажмем любую комбинация клавиш и будем ждать вывода в любой форме, пусть хоть в консоль, а вывестись должно следующее: какие операции (алгоритмы) нам вообще доступны для объекта s? То есть, то, что я назвал индексом контрактов. Что нас интересует (так уж сформулирована задача), это получение списка городов, заданного строкой, как коллекции. Чтобы сложить с другим списком-коллекцией, например.

В C++ мы должны написать что-то типа такого:

std::vector<std::wstring> cities;
boost::split(cities, s, boost::is_any_of(L","));


Спрашивается, КАК IDE должна понять, что это типичный алгоритм, применимый к s? Что это за «новая форма дополнения»? Разумеется, это просто невозможно. Мы или будем искать статику, куда можно отдать строку, и погрязнем в куче бесполезных вхождений, или пропустим полезное.

Хорошо, а как это понимает человек? Человек читает мануалы, спрашивает у других человеков и Гугла и опирается на неявное знание. Которое можно сделать явным, сжулив и научив IDE понимать, что такому-то классу соответствует такой-то набор алгоритмов. И вся эта схема идет по звезде, потому, что boost не часть языка. Если он не подключен, компилятор должен ругаться на include, а не советовать вызвать неподключенный метод. Хорошо, определяем, подключен boost или нет. А ЧТО ЕСЛИ ПОДКЛЮЧИТЬ ЕГО, А ЗАТЕМ УДАЛИТЬ split? Все, тут мы приплываем окончательно.

В случае с FCL студии жулить смысла нет, поскольку проблему и невозможность его создатели понимали отлично. Поэтому там принято соглашение неявное знание делать явным другим путем: универсальным путем вписывания алгоритмов в классы. Чуть позже создатели языка формализовали синтаксис extension, чтобы алгоритмы можно было дописывать, оставаясь в рамках того же способа явно привязать алгоритм к классу.

К чему это ведет, я показал. Задача посмотреть список контрактов принципиально неавтоматизируема ни в каком виде. Например, если у какого-то... товарища смех без причины при виде интеллисенса, можно было бы попросить IDE построить диаграмму. В случае со стандартной библиотекой беда не так страшна. Есть три инструмента — StackOverflow, Google и много-много нейронных сетей — которые приготовили тебе список на блюде, задай только вопрос на английском языке (такой вот интеллисенс). Но когда человек с забустованным мозгом садится писать свою систему, он воспроизводит тот же паттерн, да еще считает, что делает хорошее дело. ЕГО библиотеку, однако, использует три с половиной анонима, вопросы на СО не задаются, Гугл про это ничего не знает. А значит, есть только один способ не прошляпить то, что нужно — выкурить ВЕСЬ код от начала до конца. Что, конечно, писуну этого кода очень нравится. Но не способствует популярности ни библиотеки, ни языка, на котором она создавалась.
Re[10]: Кому ваще этот С++ нужен?
От: Eugeny__ Украина  
Дата: 29.05.15 19:20
Оценка: +1
Здравствуйте, IID, Вы писали:

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


E__>>Что значит "редкий сценарий"? Программы работают с внешними данными, характер которых и размер на этапе компиляции по определению неизвестен. Иначе на кой хрен та программа вообще нужна?


IID>Почему нельзя поставить оценку "фейспалм" ?


Объясни, пожалуйста.
Внешние данные могут занимать килобайты, мегабайты, и терабайты, а также сотни тысяч терабайт, приходить порциями от нескольких байт до терабайт. В чем фейспалм?
Новости очень смешные. Зря вы не смотрите. Как будто за наркоманами подсматриваешь. Только тетка с погодой в завязке.
There is no such thing as a winnable war.
Re[12]: Кому ваще этот С++ нужен?
От: Evgeny.Panasyuk Россия  
Дата: 30.05.15 08:58
Оценка:
Здравствуйте, 0BD11A0D, Вы писали:

BDA>>>Как раз интеллисенс играет тут первую скрипку. Вы открываете его окошко и видите ВСЕ возможности некоторого класса.

EP>>Нет, далеко не все. Например он не покажет что этот объект может быть аргументом у метода другого объекта
BDA>Потому, что это информация не об объекте.

То есть ты считаешь что эта информация настолько незначительная, что её можно не показывать, а вот информация о методах — это must-have?

EP>>это скорее вопрос к IDE — пусть делают новые формы дополнения, а не только "через точку"

BDA>Это принципиально невозможно.

Что невозможно? Получить список функций для которых данный объект может быть аргументом? Не считая случаи какого-нибудь сильного TMP/duck-typing — то всё возможно.
В любом случае "дополнение через точку" не стоит того чтобы уродовать язык и код — да и главным преимуществом ООП уж точно не является.

BDA>>>Альтернатива — курить маны. То есть, вышел новый стандарт, новый STL, новый boost и вы должны сразу прочитать, понять и запомнить все, что написано в сопроводиловке.

EP>>Читать документацию придётся в любом случае, чтобы знать контракты.
BDA>В хорошем коде контракты выражены через него же.

А как например выражается алгоритмическая сложность, список возможных исключений, и exception safety guarantee? Не говоря уже о том, что на последовательность вызова методов могут быть наложены некоторые ограничения.
IntelliSense Oriented Development возможен только в примитивнейших случаях типа установки свойств формы и т.п. В общем же случае от него польза только в качестве подсказки правильного имени метода/поля.

EP>>А это вообще ортогонально. Декомпозицию на контейнеры и алгоритмы можно делать и в что называется в "true OO style". То есть смотришь ты "с высоты птичьего полета" на класс UTF-8 строки, и видишь что она реализует IBidirectionalSequence, далее смотришь на алгоритмы которые принимают IBidirectionalSequence — и находишь там to_lower, split или что там нужно.

BDA>Когда вы покажете, что в IDE можно сделать интеллисенс, не основанный на инкапсуляции, я соглашусь.

* глобальные функции дополняются без всякой инкапсуляции.

* MSVS C# умеет дополнять extension method'ы — которые по сути те же внешние функции. Думаю очевидно что такое же дополнение возможно без ключевого слова this и без специального синтаксиса вызова глобальной функции.

BDA>Но выше я утверждаю, что это невозможно. Однако бремя доказательства обратного я возлагаю на вас — ведь это вы написали «пусть делают новые формы дополнения», вам и показывать, КАК ИМЕННО.


А что конкретно не понятно? Как найти список функций? Или как инициировать такое дополнение?

EP>>Или ты против такой декомпозиции вообще? Тогда например для каждой строки (и контейнера в общем) придётся придётся реализовывать каждый алгоритм — M контейнеров * N алгоритмов

BDA>Зачем? Если алгоритму не важен тип контейнера, он может быть реализован в классе АбстрактныйКонтейнер, а затем переопределен в более специфическом классе. Никакого комбинаторного взрыва.

Предлагаешь наследовать реализацию? Сразу получаем проблемы в языках без множественного наследования.
Да и как расширять? Как добавить новый алгоритм без изменения?

BDA>>>Как раз вынесение алгоритмов за пределы классов принципиально и не дает воспользоваться этим преимуществом ООП. Процедурщина и хендловщина в полный рост.

EP>>Ты так говоришь как будто "true OOP" это всегда хорошо, а "процедурщина" плохо.
BDA>С меня будет достаточно, если вы подтвердите, что стандартная библиотека C++ — не true OOP.

Она не true OOP ни в каких смыслах.

BDA>Хорошо это или плохо, мы поговорим в другой раз.


Конечно же это хорошо, я бы сказал что это большая удача что C++ пошёл по этому пути.
Re[13]: Кому ваще этот С++ нужен?
От: 0BD11A0D  
Дата: 30.05.15 16:10
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

BDA>>>>Как раз интеллисенс играет тут первую скрипку. Вы открываете его окошко и видите ВСЕ возможности некоторого класса.

EP>>>Нет, далеко не все. Например он не покажет что этот объект может быть аргументом у метода другого объекта
BDA>>Потому, что это информация не об объекте.

EP>То есть ты считаешь что эта информация настолько незначительная, что её можно не показывать, а вот информация о методах — это must-have?


Да, она менее значительна (вплоть до полной незначительности).

Пример: File OpenFile(String name); — это незначительно в контексте String s, если s = "Мама мыла раму", а не "/etc/www/blah-blah-blah.htm".

И вот такого мусора вывалится ГОРА. И ничего с этим не сделать. Поэтому все значительное умные люди инкапсулируют либо маскируют под инкапсуляцию (extension). Это прямо вот такой способ указать на значительность. Которую все равно надо указывать явно.

EP>>>это скорее вопрос к IDE — пусть делают новые формы дополнения, а не только "через точку"

BDA>>Это принципиально невозможно.

EP>Что невозможно? Получить список функций для которых данный объект может быть аргументом? Не считая случаи какого-нибудь сильного TMP/duck-typing — то всё возможно.


Вот что невозможно:

http://rsdn.ru/forum/flame.comp/6063107.1
Автор: 0BD11A0D
Дата: 29.05.15


EP>В любом случае "дополнение через точку" не стоит того чтобы уродовать язык и код — да и главным преимуществом ООП уж точно не является.


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

Все. А какие еще у него есть преимущества, по-вашему? Сокрытие и защита данных? Так хендлы давно это делают. Безопасность? Смешно. Какие?

BDA>>>>Альтернатива — курить маны. То есть, вышел новый стандарт, новый STL, новый boost и вы должны сразу прочитать, понять и запомнить все, что написано в сопроводиловке.

EP>>>Читать документацию придётся в любом случае, чтобы знать контракты.
BDA>>В хорошем коде контракты выражены через него же.

EP>А как например выражается алгоритмическая сложность, список возможных исключений, и exception safety guarantee? Не говоря уже о том, что на последовательность вызова методов могут быть наложены некоторые ограничения.

EP>IntelliSense Oriented Development возможен только в примитивнейших случаях типа установки свойств формы и т.п. В общем же случае от него польза только в качестве подсказки правильного имени метода/поля.

Как например? Так вам надо поискать примеры. Они есть.

EP>>>А это вообще ортогонально. Декомпозицию на контейнеры и алгоритмы можно делать и в что называется в "true OO style". То есть смотришь ты "с высоты птичьего полета" на класс UTF-8 строки, и видишь что она реализует IBidirectionalSequence, далее смотришь на алгоритмы которые принимают IBidirectionalSequence — и находишь там to_lower, split или что там нужно.

BDA>>Когда вы покажете, что в IDE можно сделать интеллисенс, не основанный на инкапсуляции, я соглашусь.

EP>* глобальные функции дополняются без всякой инкапсуляции.


Нет, это невозможно, я показал это на примере с boost::split по ссылке выше.

EP>* MSVS C# умеет дополнять extension method'ы — которые по сути те же внешние функции. Думаю очевидно что такое же дополнение возможно без ключевого слова this и без специального синтаксиса вызова глобальной функции.


Ага, ехали Ландау с Лившицем в такси...

Не только не очевидно, но и ложно. C# потому и C#, что в нем не стали повторять ошибок C++. Вся роль extension'ов сводится к тому, чтобы маркировать статику в явном виде, как предназначенную для классов, в тех случаях, когда это невозможно сделать при помощи инкапсуляции (кастомизация или разделение во времени). Если их НЕ маркировать, получим (в этом отношении) C++, в котором знания о привязке просто ТЕРЯЮТСЯ. И уж точно автоматизировать эту работу будет нельзя.

В следующий раз, когда захочется написать «очевидно», опишите сразу как и почему.

BDA>>Но выше я утверждаю, что это невозможно. Однако бремя доказательства обратного я возлагаю на вас — ведь это вы написали «пусть делают новые формы дополнения», вам и показывать, КАК ИМЕННО.


EP>А что конкретно не понятно? Как найти список функций? Или как инициировать такое дополнение?


Вот это продуктивный подход, уважаю. Ответ по той же самой ссылке.

EP>>>Или ты против такой декомпозиции вообще? Тогда например для каждой строки (и контейнера в общем) придётся придётся реализовывать каждый алгоритм — M контейнеров * N алгоритмов

BDA>>Зачем? Если алгоритму не важен тип контейнера, он может быть реализован в классе АбстрактныйКонтейнер, а затем переопределен в более специфическом классе. Никакого комбинаторного взрыва.

EP>Предлагаешь наследовать реализацию? Сразу получаем проблемы в языках без множественного наследования.

EP>Да и как расширять? Как добавить новый алгоритм без изменения?

Вы слишком уводите тему в сторону. В этой теме, в этой ее ветке, речь идет о способе организации стандартной библиотеки, которая содержит в себе конечный набор алгоритмов. Что делать, когда нужен свой, новый, предлагаю обсудить на примере.
Re[14]: Кому ваще этот С++ нужен?
От: Evgeny.Panasyuk Россия  
Дата: 01.06.15 00:09
Оценка: +1
Здравствуйте, 0BD11A0D, Вы писали:

EP>>То есть ты считаешь что эта информация настолько незначительная, что её можно не показывать, а вот информация о методах — это must-have?

BDA>Да, она менее значительна (вплоть до полной незначительности).
BDA>Пример: File OpenFile(String name); — это незначительно в контексте String s, если s = "Мама мыла раму", а не "/etc/www/blah-blah-blah.htm".
BDA>И вот такого мусора вывалится ГОРА. И ничего с этим не сделать. Поэтому все значительное умные люди инкапсулируют либо маскируют под инкапсуляцию (extension).
BDA>Это прямо вот такой способ указать на значительность. Которую все равно надо указывать явно.

Во-первых нужно правильно сортировать варианты. Например функции из того же namespace — более приоритетные. В более общем виде — чем меньше расстояние в дереве namespace'ов — тем выше приоритет.
Во-вторых рулит type-rich programming. Например path вместо string.

EP>>>>это скорее вопрос к IDE — пусть делают новые формы дополнения, а не только "через точку"

BDA>>>Это принципиально невозможно.
EP>>Что невозможно? Получить список функций для которых данный объект может быть аргументом? Не считая случаи какого-нибудь сильного TMP/duck-typing — то всё возможно.
BDA>Вот что невозможно:
BDA>http://rsdn.ru/forum/flame.comp/6063107.1
Автор: 0BD11A0D
Дата: 29.05.15


Там говорится про "типичный" алгоритм — но если у класса сотни методов то как IDE должна выбрать из них "типичные"?

EP>>В любом случае "дополнение через точку" не стоит того чтобы уродовать язык и код — да и главным преимуществом ООП уж точно не является.

BDA>Не просто главным, а единственным (известным мне). Конечно, не само по себе, а как маркер.

Всё же "единственным" или просто "маркер"?
Вот если бы не было авто-дополнения — ты бы вообще использовал ООП?

BDA>Я могу писать в блокноте без интеллисенса, предварительно осмотрев класс, но не могу, не изучив проект досконально, понять, что полагается делать с некоторым набором данных, если автор это не формализовал. То есть, на моделирование проекта в голове уйдет времени намного больше и оно будет потрачено неэффективно — мне придется рутинную работу делать как творческую.


И как тут помогает ООП? Ты моделируешь проект бегая по коду с IntelliSense'ом?

BDA>Все. А какие еще у него есть преимущества, по-вашему? Сокрытие и защита данных? Так хендлы давно это делают. Безопасность? Смешно. Какие?


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

EP>>>>Читать документацию придётся в любом случае, чтобы знать контракты.

BDA>>>В хорошем коде контракты выражены через него же.
EP>>А как например выражается алгоритмическая сложность, список возможных исключений, и exception safety guarantee? Не говоря уже о том, что на последовательность вызова методов могут быть наложены некоторые ограничения.
EP>>IntelliSense Oriented Development возможен только в примитивнейших случаях типа установки свойств формы и т.п. В общем же случае от него польза только в качестве подсказки правильного имени метода/поля.
BDA>Как например? Так вам надо поискать примеры. Они есть.

Примеры IntelliSense Oriented Development я действительно видел — "нужно добавить элементы. что тут у нас есть? ага — add, его и заюзаем — клац" — и в итоге получаем квадратическую сложность на ровном месте, потому что в контракт не смотрели. Что характерно, я фиксил подобное с помощью документации и "блокнота", даже без возможности скомпилировать.

EP>>>>А это вообще ортогонально. Декомпозицию на контейнеры и алгоритмы можно делать и в что называется в "true OO style". То есть смотришь ты "с высоты птичьего полета" на класс UTF-8 строки, и видишь что она реализует IBidirectionalSequence, далее смотришь на алгоритмы которые принимают IBidirectionalSequence — и находишь там to_lower, split или что там нужно.

BDA>>>Когда вы покажете, что в IDE можно сделать интеллисенс, не основанный на инкапсуляции, я соглашусь.
EP>>* глобальные функции дополняются без всякой инкапсуляции.
BDA>Нет, это невозможно, я показал это на примере с boost::split по ссылке выше.

Конкретно здесь речь об дополнении имени функции по части её имени, а не по типам аргументов.
"IntelliSense не основанный на инкапсуляции" в чистом виде

EP>>* MSVS C# умеет дополнять extension method'ы — которые по сути те же внешние функции. Думаю очевидно что такое же дополнение возможно без ключевого слова this и без специального синтаксиса вызова глобальной функции.

BDA>Ага, ехали Ландау с Лившицем в такси...
BDA>Не только не очевидно, но и ложно. C# потому и C#, что в нем не стали повторять ошибок C++. Вся роль extension'ов сводится к тому, чтобы маркировать статику в явном виде, как предназначенную для классов, в тех случаях, когда это невозможно сделать при помощи инкапсуляции (кастомизация или разделение во времени). Если их НЕ маркировать, получим (в этом отношении) C++, в котором знания о привязке просто ТЕРЯЮТСЯ. И уж точно автоматизировать эту работу будет нельзя.
BDA>В следующий раз, когда захочется написать «очевидно», опишите сразу как и почему.

А я и описал. Непонятно с чем конкртено ты не согласен. Могу ещё раз повторить: убери ключевое слово this из extension method'ов в C# и специальный синтаксис вызова — как ты думаешь, будет ли технически возможно автодополнение в таком случае, и если нет то почему.

EP>>Предлагаешь наследовать реализацию? Сразу получаем проблемы в языках без множественного наследования.

EP>>Да и как расширять? Как добавить новый алгоритм без изменения?
BDA>Вы слишком уводите тему в сторону. В этой теме, в этой ее ветке, речь идет о способе организации стандартной библиотеки, которая содержит в себе конечный набор алгоритмов. Что делать, когда нужен свой, новый, предлагаю обсудить на примере.

1. Не вижу смысла ограничиваться стандартной библиотекой, да и не думал что в этой ветке такое ограничение.
2. Не вижу смысла уродовать код библиотеки (тем более стандартной) и сваливать внешние по сути алгоритмы во внутрь всех контейнеров, только из-за возможности получить автодополнение через точку.
3. Алгоритмов очень много, далеко не все есть в стандартной библиотеке, расширять набор алгоритмов рано или поздно всё равно придётся.
Re[7]: Кому ваще этот С++ нужен?
От: Aртём Австралия жж
Дата: 01.06.15 04:22
Оценка:
Здравствуйте, greenpci, Вы писали:

G>Могу подтвердить. Производил замеры памяти и скорости, и пришлось отказаться от std::map и std::vector<bool> (отдельная спецификация вектора) в нашем продукте в пользу других реализаций, хотя очень хотелось использовать СТЛевские. Надо сказать, что создатели и не претендавали на самую быструю реализацию. Задача была выбрать меньшее из зол и удовлетворить большинство.


http://www.cplusplus.com/reference/unordered_map/unordered_map/ не подошёл?
Re[8]: Кому ваще этот С++ нужен?
От: greenpci  
Дата: 01.06.15 07:27
Оценка:
Здравствуйте, Aртём, Вы писали:

Aё>http://www.cplusplus.com/reference/unordered_map/unordered_map/ не подошёл?


Упоминалось здесь
Автор: greenpci
Дата: 24.05.15
Re[12]: Кому ваще этот С++ нужен?
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 01.06.15 07:51
Оценка:
Здравствуйте, 0BD11A0D, Вы писали:


EP>>это скорее вопрос к IDE — пусть делают новые формы дополнения, а не только "через точку"

BDA>Это принципиально невозможно.

Принципиально это возможно, всего лишь небольшое изменение в язык. Только это не нужно. Дополнения должны вызываться точно так же, как и основные методы, что бы не было никакой разницы с тз. синтаксиса.
x.Method(y)
x.ExtensionMethod(y)
x `Method` y
x `ExtensionMethod` y


BDA>Когда вы покажете, что в IDE можно сделать интеллисенс, не основанный на инкапсуляции, я соглашусь. Но выше я утверждаю, что это невозможно. Однако бремя доказательства обратного я возлагаю на вас — ведь это вы написали «пусть делают новые формы дополнения», вам и показывать, КАК ИМЕННО.


Ужос. Экстншны в шарпе сделаны как раз не на инкапсуляции и отлично поддерживаются IDE.
Отредактировано 01.06.2015 7:57 Pauel . Предыдущая версия .
Re[13]: Кому ваще этот С++ нужен?
От: Evgeny.Panasyuk Россия  
Дата: 01.06.15 08:38
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Дополнения должны вызываться точно так же, как и основные методы, что бы не было никакой разницы с тз. синтаксиса.


1. Чем плоха эта разница?
2. Почему внешние функции должны вызываться как внутренние, а не наоборот?
3. Extension методы работают только по первому параметру, в то время когда автодополнение возможно по любому — и в этом случае синтаксис "через точку" пролетает.

Вызовы через точку хороши только когда нужно делать method chaining — то есть эдакая инфиксность.

P.S. Вот статья
Автор: Qbit86
Дата: 21.10.14
от Страуструпа на эту тему и обсуждение.
Re[14]: Кому ваще этот С++ нужен?
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 01.06.15 09:51
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

I>>Дополнения должны вызываться точно так же, как и основные методы, что бы не было никакой разницы с тз. синтаксиса.


EP>1. Чем плоха эта разница?


Ломает полиморфизм.

EP>2. Почему внешние функции должны вызываться как внутренние, а не наоборот?


Смотри внимательно пример кода, там оба варианта.

EP>3. Extension методы работают только по первому параметру, в то время когда автодополнение возможно по любому — и в этом случае синтаксис "через точку" пролетает.


"через точку" это специальный случай

EP>P.S. Вот статья
Автор: Qbit86
Дата: 21.10.14
от Страуструпа на эту тему и обсуждение.


Так себе идея и здесь вроде как нет ничего про "автодополнение возможно по любому".
Гораздо полезнее сделать чтото навроде x `f` y
Re[14]: Кому ваще этот С++ нужен?
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 01.06.15 10:23
Оценка:
Здравствуйте, 0BD11A0D, Вы писали:

EP>>* MSVS C# умеет дополнять extension method'ы — которые по сути те же внешние функции. Думаю очевидно что такое же дополнение возможно без ключевого слова this и без специального синтаксиса вызова глобальной функции.


BDA>Не только не очевидно, но и ложно. C# потому и C#, что в нем не стали повторять ошибок C++. Вся роль extension'ов сводится к тому, чтобы маркировать статику в явном виде, как предназначенную для классов, в тех случаях, когда это невозможно сделать при помощи инкапсуляции (кастомизация или разделение во времени). Если их НЕ маркировать, получим (в этом отношении) C++, в котором знания о привязке просто ТЕРЯЮТСЯ. И уж точно автоматизировать эту работу будет нельзя.


Роль экстеншнов это вобщем инкапсуляция + полиморфизм, как это странно ни звучит.
Re[18]: Кому ваще этот С++ нужен?
От: Cyberax Марс  
Дата: 01.06.15 10:27
Оценка:
Здравствуйте, 0BD11A0D, Вы писали:

C>>Что конкретно "не так"? Это ровно та же задача, для С++ она только немного сложнее. Принципиальной разницы нет.

BDA>Если разницы нет, почему бы не привести сразу «правильный» пример? Хотя бы одну IDE, которая решает поставленную мною задачу. Это же так легко — р-раз, и я понимаю, что кругом неправ.
Clion. Запусти и посмотри, БЛДЖАД. Не для всех случаев пока что, но уже вполне нормально.

Я уж не говорю о том, что слегка кретинично ставить во главу угла то, что через intellisense говнодебил сможет найти метод с примерно подходящим названием.
Sapienti sat!
Re[15]: Кому ваще этот С++ нужен?
От: 0BD11A0D  
Дата: 01.06.15 11:00
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Во-первых нужно правильно сортировать варианты. Например функции из того же namespace — более приоритетные. В более общем виде — чем меньше расстояние в дереве namespace'ов — тем выше приоритет.


Еще чуть-чуть, и окажется, что class — САМЫЙ приоритетный namespace. Просто доведите свою мысль до конца.

EP>Во-вторых рулит type-rich programming. Например path вместо string.


Про path я думал, идея неплохая. Если добавить поддержку частей пути как списка и неявное преобразование в строки, я бы одобрил.

Ну хорошо — конструктор нового исключения. Предельно близок по неймсейсам, тип однозначно строковый. Будет вылезать всегда. И?

EP>>>>>это скорее вопрос к IDE — пусть делают новые формы дополнения, а не только "через точку"

BDA>>>>Это принципиально невозможно.
EP>>>Что невозможно? Получить список функций для которых данный объект может быть аргументом? Не считая случаи какого-нибудь сильного TMP/duck-typing — то всё возможно.
BDA>>Вот что невозможно:
BDA>>http://rsdn.ru/forum/flame.comp/6063107.1
Автор: 0BD11A0D
Дата: 29.05.15


EP>Там говорится про "типичный" алгоритм — но если у класса сотни методов то как IDE должна выбрать из них "типичные"?


Все методы, явно помещеные в класс — типичные. Типичными их делает как раз помещение туда. Дура-IDE должна показывать все молча. И, конечно, это авторский замысел, то есть, некая модель программистских представлений о сущностях. Например, регексы в FCL лежат отдельно, хотя ничего не мешало бы... То есть, не надо искать тут закономерностей, это удачное (или не очень) представление авторов кода о типичности.

EP>>>В любом случае "дополнение через точку" не стоит того чтобы уродовать язык и код — да и главным преимуществом ООП уж точно не является.

BDA>>Не просто главным, а единственным (известным мне). Конечно, не само по себе, а как маркер.

EP>Всё же "единственным" или просто "маркер"?

EP>Вот если бы не было авто-дополнения — ты бы вообще использовал ООП?

Удивительно вы разбиваете текст, который читаете. Ниже ответ, стоило ли задавать вопрос?

BDA>>Я могу писать в блокноте без интеллисенса, предварительно осмотрев класс, но не могу, не изучив проект досконально, понять, что полагается делать с некоторым набором данных, если автор это не формализовал. То есть, на моделирование проекта в голове уйдет времени намного больше и оно будет потрачено неэффективно — мне придется рутинную работу делать как творческую.


EP>И как тут помогает ООП? Ты моделируешь проект бегая по коду с IntelliSense'ом?


По-моему, я все понятно написал и на все ответил.

BDA>>Все. А какие еще у него есть преимущества, по-вашему? Сокрытие и защита данных? Так хендлы давно это делают. Безопасность? Смешно. Какие?


EP>Например иерархичность — в некоторых областях это действительно удобно и естественно, правда далеко не во всех.


Ну, это долгая песня — является ли иерархичность непременным атрибутом ООП. Тратить время на нее не хочу, скажу просто, что с моей точки зрения она очень рульная вещь, но вторичная.

EP>>>А как например выражается алгоритмическая сложность, список возможных исключений, и exception safety guarantee? Не говоря уже о том, что на последовательность вызова методов могут быть наложены некоторые ограничения.

EP>>>IntelliSense Oriented Development возможен только в примитивнейших случаях типа установки свойств формы и т.п. В общем же случае от него польза только в качестве подсказки правильного имени метода/поля.
BDA>>Как например? Так вам надо поискать примеры. Они есть.

EP>Примеры IntelliSense Oriented Development я действительно видел — "нужно добавить элементы. что тут у нас есть? ага — add, его и заюзаем — клац" — и в итоге получаем квадратическую сложность на ровном месте, потому что в контракт не смотрели. Что характерно, я фиксил подобное с помощью документации и "блокнота", даже без возможности скомпилировать.


Я тоже много чего видел. Например, площадь Сан-Марко, как мне тут с утра напомнили. Но я же не пишу обо всем об этом, а пишу только о том, что имеет отношение к вопросам и ответам. Вопрос был — «А как например выражается алгоритмическая сложность, список возможных исключений». Я говорю: есть такие примеры и вы можете их найти самостоятельно. Незачем зацикливаться на C++.

EP>Конкретно здесь речь об дополнении имени функции по части её имени, а не по типам аргументов.

EP>"IntelliSense не основанный на инкапсуляции" в чистом виде

Ну конечно, сейчас уже речь пойдет о том, чтобы часть имени указывать. Как иначе гору мусора фильтровать. Вы мне покажите ВСЕ операции. И чтобы мусора не было. В FCL все это есть и упаковано в вызывающий у некоторых смех интеллисенс. На меньшее не согласен. И никто, кто его видел вживую, а не в книжках с картинками и без, обратно к std возвращаться не хочет.

BDA>>Не только не очевидно, но и ложно. C# потому и C#, что в нем не стали повторять ошибок C++. Вся роль extension'ов сводится к тому, чтобы маркировать статику в явном виде, как предназначенную для классов, в тех случаях, когда это невозможно сделать при помощи инкапсуляции (кастомизация или разделение во времени). Если их НЕ маркировать, получим (в этом отношении) C++, в котором знания о привязке просто ТЕРЯЮТСЯ. И уж точно автоматизировать эту работу будет нельзя.

BDA>>В следующий раз, когда захочется написать «очевидно», опишите сразу как и почему.

EP>А я и описал. Непонятно с чем конкртено ты не согласен. Могу ещё раз повторить: убери ключевое слово this из extension method'ов в C# и специальный синтаксис вызова — как ты думаешь, будет ли технически возможно автодополнение в таком случае, и если нет то почему.


Нет, не будет. Потому, что ни IDE, ни компилятор в вашу голову залезть не может и понять, что это за функция — случайно совместимая по сигнатуре или задизайненная как extension — тоже не может. Вы там вверху начали предлагать косвенно указывать на близость к телу, например, поощрять избыточную типизацию или рулить неймспейсами. Зачем косвенно, когда можно все это делать прямо?

Я хотел найти описание необходимости this от создателей языка, но все, что нашел, это вот такую болтологию:

http://stackoverflow.com/questions/3510964/why-is-the-this-keyword-required-to-call-an-extension-method-from-within-the-e

Первый НЕудачный ответ Эрика Липперта на моей памяти. Он просто уходит от ответа. Чем-то же они думали, когда вводили this, а не перебирали совместимые сигнатуры. Вот и надо было написать, зачем и почему было принято такое решение. Ответ, как ни крути, сводится к явной маркировке, но что мешало ответить по существу?

EP>1. Не вижу смысла ограничиваться стандартной библиотекой, да и не думал что в этой ветке такое ограничение.

EP>2. Не вижу смысла уродовать код библиотеки (тем более стандартной) и сваливать внешние по сути алгоритмы во внутрь всех контейнеров, только из-за возможности получить автодополнение через точку.
EP>3. Алгоритмов очень много, далеко не все есть в стандартной библиотеке, расширять набор алгоритмов рано или поздно всё равно придётся.

1. А я вижу и объяснил почему.
2. А я вижу и объяснил почему.
3. Я предложил привести пример, чтобы его разобрать, но вместо примера получил общие рассуждения.
Re[13]: Кому ваще этот С++ нужен?
От: 0BD11A0D  
Дата: 01.06.15 11:09
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Ужос. Экстншны в шарпе сделаны как раз не на инкапсуляции и отлично поддерживаются IDE.


Они сделаны на псевдоинкапсуляции, отложенной инкапсуляции, называйте как хотите. Суть в том, что и при включении метода в класс, и при написании extension'ов, требуется явно указывать принадлежность к классу. Это — суть. А если вам хочется формально до чего-нибудь доковыряться, пожалуйста: да, согласен, экстншны в шарпе сделаны как раз не на инкапсуляции и отлично поддерживаются IDE, +100500, вы правы, абсолютно справедливое утверждение, еще или хватит?
Re[19]: Кому ваще этот С++ нужен?
От: 0BD11A0D  
Дата: 01.06.15 11:13
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>Clion. Запусти и посмотри, БЛДЖАД. Не для всех случаев пока что, но уже вполне нормально.


Понятно с вами все. Я написал Clion — через постинг получаю Clion. Элиза какая-то просто.
Re[20]: Кому ваще этот С++ нужен?
От: Cyberax Марс  
Дата: 01.06.15 11:28
Оценка:
Здравствуйте, 0BD11A0D, Вы писали:

C>>Clion. Запусти и посмотри, БЛДЖАД. Не для всех случаев пока что, но уже вполне нормально.

BDA>Понятно с вами все. Я написал Clion — через постинг получаю Clion. Элиза какая-то просто.
Ну так запусти и посмотри.
Sapienti sat!
Re[16]: Кому ваще этот С++ нужен?
От: Cyberax Марс  
Дата: 01.06.15 11:40
Оценка:
Здравствуйте, 0BD11A0D, Вы писали:

BDA>>>http://rsdn.ru/forum/flame.comp/6063107.1
Автор: 0BD11A0D
Дата: 29.05.15

EP>>Там говорится про "типичный" алгоритм — но если у класса сотни методов то как IDE должна выбрать из них "типичные"?
BDA>Все методы, явно помещеные в класс — типичные. Типичными их делает как раз помещение туда.
То есть, в классе строки будут методы для:
1) Base64-кодирования
2) URL-кодирования
3) escape'а для shell'а
4) escape'а для другого shell'а
5) Санитизации строк для SQL injection'а
6) Случайной перестановки букв
7) Проверки пароля с помощью PBKDF2
8) Приготовления кофе.

BDA>Дура-IDE должна показывать все молча. И, конечно, это авторский замысел, то есть, некая модель программистских представлений о сущностях. Например, регексы в FCL лежат отдельно, хотя ничего не мешало бы... То есть, не надо искать тут закономерностей, это удачное (или не очень) представление авторов кода о типичности.

Вот и надо убрать это кретиническое представление вообще.

BDA>Я тоже много чего видел. Например, площадь Сан-Марко, как мне тут с утра напомнили. Но я же не пишу обо всем об этом, а пишу только о том, что имеет отношение к вопросам и ответам. Вопрос был — «А как например выражается алгоритмическая сложность, список возможных исключений». Я говорю: есть такие примеры и вы можете их найти самостоятельно. Незачем зацикливаться на C++.

Тебе говорят, что твой ООП головного моска, осложнённый intellisense'ом, приводит только к говнокоду.

Интеллисенс — это инструмент, которым надо уметь пользоваться, а не заменять им всё.

BDA>2. А я вижу и объяснил почему.

BDA>3. Я предложил привести пример, чтобы его разобрать, но вместо примера получил общие рассуждения.
Ничерта ты не объяснил.

Тебя уже ткнули носом в твои же какашки. Несколько раз.

Минимальная модель проистекает из фундаментальнейшего принципа дизайна ПО — Single Responsibility Principle. Каждый логический модуль занимается только тем, что ему необходимо и не более.

В случае с классами и ООП правильный дизайн приводит к тому, что имеем небольшой компактный класс, доступ к состоянию которого ведётся через минимальный интерфейс. Этот интерфейс проектируется так, что с его помощью нельзя нарушить инварианты класса.

Всё остальное делается внешним кодом, который гарантированно не может нарушить инварианты, так как просто технически вынужден работать через безопасный интерфейс.

В реальности от этого иногда приходится отступать, но это не повод начинать пихать в класс непонятно что.
Sapienti sat!
Re[15]: Кому ваще этот С++ нужен?
От: Evgeny.Panasyuk Россия  
Дата: 01.06.15 12:17
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>>>Дополнения должны вызываться точно так же, как и основные методы, что бы не было никакой разницы с тз. синтаксиса.

EP>>1. Чем плоха эта разница?
I>Ломает полиморфизм.

Да, согласен, это главный аргумент за унификацию синтаксиса (только не обязательно в сторону "вызова через точку").

EP>>2. Почему внешние функции должны вызываться как внутренние, а не наоборот?

I>Смотри внимательно пример кода, там оба варианта.

Там оба варианта инфиксные, и нет синтаксиса вызова метода как обычной внешней функции — method(obj, x).

EP>>3. Extension методы работают только по первому параметру, в то время когда автодополнение возможно по любому — и в этом случае синтаксис "через точку" пролетает.

I>"через точку" это специальный случай

Я о том и говорю — что для общего случая оно не подходит.

EP>>P.S. Вот статья
Автор: Qbit86
Дата: 21.10.14
от Страуструпа на эту тему и обсуждение.

I>Так себе идея и здесь вроде как нет ничего про "автодополнение возможно по любому".

Синтаксис вызова ортогонален возможности дополнения. Разве что "точка" может служить триггером дополнения, а без неё будет специальный хоткей или таймер.

I>Гораздо полезнее сделать чтото навроде x `f` y


Это мало чем отличается от x.f(y). Да и как например расширить этот синтаксис на мультиметоды, или просто методы с несколькими параметрами?
Re[17]: Кому ваще этот С++ нужен?
От: 0BD11A0D  
Дата: 01.06.15 12:49
Оценка:
Здравствуйте, Cyberax, Вы писали:

BDA>>Все методы, явно помещеные в класс — типичные. Типичными их делает как раз помещение туда.


C>То есть, в классе строки будут методы для:

C>1) Base64-кодирования
C>2) URL-кодирования
C>3) escape'а для shell'а
C>4) escape'а для другого shell'а
C>5) Санитизации строк для SQL injection'а
C>6) Случайной перестановки букв
C>7) Проверки пароля с помощью PBKDF2
C>8) Приготовления кофе.

Они будут у идиота, чье представление о строках и типичных операциях с ними — идиотское. И заметьте, тут только один человек такое предлагает.
Отредактировано 01.06.2015 12:50 0BD11A0D . Предыдущая версия .
Re[14]: Кому ваще этот С++ нужен?
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 01.06.15 13:11
Оценка:
Здравствуйте, 0BD11A0D, Вы писали:

I>>Ужос. Экстншны в шарпе сделаны как раз не на инкапсуляции и отлично поддерживаются IDE.


BDA>Они сделаны на псевдоинкапсуляции, отложенной инкапсуляции, называйте как хотите. Суть в том, что и при включении метода в класс, и при написании extension'ов, требуется явно указывать принадлежность к классу. Это — суть.


Во-первых, Это язык со статической типизацией. Как ни крути, а тип будет задан явно.
Во-вторых, расширения улучшают и инкапсуляцию и полиморфизм.
Re[16]: Кому ваще этот С++ нужен?
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 01.06.15 13:19
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>>>2. Почему внешние функции должны вызываться как внутренние, а не наоборот?

I>>Смотри внимательно пример кода, там оба варианта.

EP>Там оба варианта инфиксные, и нет синтаксиса вызова метода как обычной внешней функции — method(obj, x).


Ты хотел вызывать внутреннюю как внешнюю, сейчас ты хочешь другой сорт вызова. Ты определись, чего же тебе надо.

I>>Гораздо полезнее сделать чтото навроде x `f` y


EP>Это мало чем отличается от x.f(y). Да и как например расширить этот синтаксис на мультиметоды, или просто методы с несколькими параметрами?


Никак. Вместо мултиметодов нужен паттерн-матчинг.
Re[16]: Кому ваще этот С++ нужен?
От: Evgeny.Panasyuk Россия  
Дата: 01.06.15 13:29
Оценка:
Здравствуйте, 0BD11A0D, Вы писали:

EP>>Во-первых нужно правильно сортировать варианты. Например функции из того же namespace — более приоритетные. В более общем виде — чем меньше расстояние в дереве namespace'ов — тем выше приоритет.

BDA>Еще чуть-чуть, и окажется, что class — САМЫЙ приоритетный namespace. Просто доведите свою мысль до конца.

Да, и что? Из этого никак не следует что IDE должна подсказывать методы только из этого самого приоритетного namespace.

EP>>Во-вторых рулит type-rich programming. Например path вместо string.

BDA>Про path я думал, идея неплохая. Если добавить поддержку частей пути как списка и неявное преобразование в строки, я бы одобрил.

boost::filesystem::path.

BDA>Ну хорошо — конструктор нового исключения. Предельно близок по неймсейсам, тип однозначно строковый. Будет вылезать всегда. И?


1. И пусть вылезает. Типичный use-case дополнения предполагает ввод нескольких букв из имени метода.
2. Желательно иметь чуть больше namespace'ов чем один std::*, да.

EP>>>>Что невозможно? Получить список функций для которых данный объект может быть аргументом? Не считая случаи какого-нибудь сильного TMP/duck-typing — то всё возможно.

BDA>>>Вот что невозможно:
BDA>>>http://rsdn.ru/forum/flame.comp/6063107.1
Автор: 0BD11A0D
Дата: 29.05.15

EP>>Там говорится про "типичный" алгоритм — но если у класса сотни методов то как IDE должна выбрать из них "типичные"?
BDA>Все методы, явно помещеные в класс — типичные. Типичными их делает как раз помещение туда.

Типичные для кого? Если у класса сотни методов, то множества "типичных" для разных разработчиков будут слабо пересекаться в общем случае.

BDA>Дура-IDE должна показывать все молча. И, конечно, это авторский замысел, то есть, некая модель программистских представлений о сущностях.


То есть автор что-то захотел положить в класс, а что-то нет, исключительно по его представлениям о "типичности", а не например по соображениям инкапсуляции
Что делать в случае когда нужна та функция, которая оказалась вне класса? Ты разве против того, чтобы введя имя объекта была возможность получить список в котором будут в том числе и эти внешние функции?

BDA>>>Все. А какие еще у него есть преимущества, по-вашему? Сокрытие и защита данных? Так хендлы давно это делают. Безопасность? Смешно. Какие?

EP>>Например иерархичность — в некоторых областях это действительно удобно и естественно, правда далеко не во всех.
BDA>Ну, это долгая песня — является ли иерархичность непременным атрибутом ООП. Тратить время на нее не хочу, скажу просто, что с моей точки зрения она очень рульная вещь, но вторичная.

В целом я не в восторге от ООП — оно конечно отлично подходит для некоторых областей, но к сожалению на протяжении последних лет двадцати его пихают куда ни попадя.
Тем не менее, главным и единственным преимуществом "дополнение через точку" уж точно не является.
Из такого утверждения практически следует что не учитывая авто-дополнения, код без ООП строго не хуже, а во многих случаях и лучше чем с ООП. Фактически получается что по-твоему ООП это всего лишь уродование кода ради авто-дополнения

EP>>>>А как например выражается алгоритмическая сложность, список возможных исключений, и exception safety guarantee? Не говоря уже о том, что на последовательность вызова методов могут быть наложены некоторые ограничения.

EP>>>>IntelliSense Oriented Development возможен только в примитивнейших случаях типа установки свойств формы и т.п. В общем же случае от него польза только в качестве подсказки правильного имени метода/поля.
BDA>>>Как например? Так вам надо поискать примеры. Они есть.
EP>>Примеры IntelliSense Oriented Development я действительно видел — "нужно добавить элементы. что тут у нас есть? ага — add, его и заюзаем — клац" — и в итоге получаем квадратическую сложность на ровном месте, потому что в контракт не смотрели. Что характерно, я фиксил подобное с помощью документации и "блокнота", даже без возможности скомпилировать.
BDA>Я тоже много чего видел. Например, площадь Сан-Марко, как мне тут с утра напомнили. Но я же не пишу обо всем об этом, а пишу только о том, что имеет отношение к вопросам и ответам.

Здесь в общем обсуждается IntelliSense и т.п. — мой пример как раз про это

BDA>Вопрос был — «А как например выражается алгоритмическая сложность, список возможных исключений». Я говорю: есть такие примеры и вы можете их найти самостоятельно. Незачем зацикливаться на C++.


Уже во втором сообщении ты отсылаешь к каким-то примерам без всякой конкретики. "примеры есть, сам ищи"

EP>>Конкретно здесь речь об дополнении имени функции по части её имени, а не по типам аргументов.

EP>>"IntelliSense не основанный на инкапсуляции" в чистом виде
BDA>Ну конечно, сейчас уже речь пойдет о том, чтобы часть имени указывать.

Ты спрашивал "IntelliSense не основанный на инкапсуляции", я его показал

EP>>А я и описал. Непонятно с чем конкртено ты не согласен. Могу ещё раз повторить: убери ключевое слово this из extension method'ов в C# и специальный синтаксис вызова — как ты думаешь, будет ли технически возможно автодополнение в таком случае, и если нет то почему.

BDA>Нет, не будет. Потому, что ни IDE, ни компилятор в вашу голову залезть не может и понять, что это за функция — случайно совместимая по сигнатуре или задизайненная как extension — тоже не может.

Что значит "случайно совместимая по сигнатуре"? Я говорю о том что нужно выводить как раз список всех таких функций.

BDA>Вы там вверху начали предлагать косвенно указывать на близость к телу,


В ISO C++ есть даже явные особенности использования функций "близких к телу" — Argument-Dependent Lookup.
Если IDE будет также учитывать эту близость — то это решение будет в духе самого языка.

BDA>например, поощрять избыточную типизацию


Я за type-rich programming даже не учитывая возможное авто-дополнение, это просто косвенный бонус. Но вводить дополнительные типы только из-за авто-дополнения не предлагаю.

BDA>или рулить неймспейсами.


Вполне естественно.

BDA>Зачем косвенно, когда можно все это делать прямо?


То что ты называешь "прямо":
1. Даёт намного меньше информации.
2. Ухудшает инкапсуляцию.

BDA>Я хотел найти описание необходимости this от создателей языка, но все, что нашел, это вот такую болтологию:

BDA>http://stackoverflow.com/questions/3510964/why-is-the-this-keyword-required-to-call-an-extension-method-from-within-the-e
BDA>Первый НЕудачный ответ Эрика Липперта на моей памяти. Он просто уходит от ответа. Чем-то же они думали, когда вводили this, а не перебирали совместимые сигнатуры. Вот и надо было написать, зачем и почему было принято такое решение. Ответ, как ни крути, сводится к явной маркировке, но что мешало ответить по существу?

Там вообще-то вопрос про другой this. Не про this в сигнатуре, а про this значение внутри метода расширяемого класса

EP>>3. Алгоритмов очень много, далеко не все есть в стандартной библиотеке, расширять набор алгоритмов рано или поздно всё равно придётся.

BDA>3. Я предложил привести пример, чтобы его разобрать,

Например нам потребовалась поразрядная сортировка.

BDA>но вместо примера получил общие рассуждения.


С которыми ты согласен/не согласен/...?
Re[17]: Кому ваще этот С++ нужен?
От: Evgeny.Panasyuk Россия  
Дата: 01.06.15 13:35
Оценка:
Здравствуйте, Ikemefula, Вы писали:

EP>>>>2. Почему внешние функции должны вызываться как внутренние, а не наоборот?

I>>>Смотри внимательно пример кода, там оба варианта.
EP>>Там оба варианта инфиксные, и нет синтаксиса вызова метода как обычной внешней функции — method(obj, x).
I>Ты хотел вызывать внутреннюю как внешнюю, сейчас ты хочешь другой сорт вызова. Ты определись, чего же тебе надо.

Под вызовом внешней функции подразумевается f(x,y,z).

I>>>Гораздо полезнее сделать чтото навроде x `f` y

EP>>Это мало чем отличается от x.f(y). Да и как например расширить этот синтаксис на мультиметоды, или просто методы с несколькими параметрами?
I>Никак. Вместо мултиметодов нужен паттерн-матчинг.

Ок, допустим. Но всё равно не понятно:
1. Чем x `f` y полезнее x.f(y)?
2. Как вызывать f(x,y,z) с таким синтаксисом? Через currying?
Re[15]: Кому ваще этот С++ нужен?
От: 0BD11A0D  
Дата: 01.06.15 13:45
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Во-первых, Это язык со статической типизацией. Как ни крути, а тип будет задан явно.


Речь идет о необходимости добавлять this. Почему бы просто не автодополнять и комипилировать любую статику с первым параметром соответствующего типа, даже если он не помечен this?
Re[18]: Кому ваще этот С++ нужен?
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 01.06.15 14:02
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>>>Это мало чем отличается от x.f(y). Да и как например расширить этот синтаксис на мультиметоды, или просто методы с несколькими параметрами?

I>>Никак. Вместо мултиметодов нужен паттерн-матчинг.

EP>Ок, допустим. Но всё равно не понятно:

EP>1. Чем x `f` y полезнее x.f(y)?

Чище. Здесь нет привязки к методу. f может быть чем угодно.

EP>2. Как вызывать f(x,y,z) с таким синтаксисом? Через currying?


Точно так же, как и сейчас.
Re[16]: Кому ваще этот С++ нужен?
От: Evgeny.Panasyuk Россия  
Дата: 01.06.15 14:05
Оценка:
Здравствуйте, 0BD11A0D, Вы писали:

I>>Во-первых, Это язык со статической типизацией. Как ни крути, а тип будет задан явно.

BDA>Речь идет о необходимости добавлять this.

В языке D не такой необходимости — там можно вызывать f(x,y), как x.f(y).
Насколько D вообще поддерживается IDE — не знаю
Re[16]: Кому ваще этот С++ нужен?
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 01.06.15 14:26
Оценка:
Здравствуйте, 0BD11A0D, Вы писали:

I>>Во-первых, Это язык со статической типизацией. Как ни крути, а тип будет задан явно.


BDA>Речь идет о необходимости добавлять this. Почему бы просто не автодополнять и комипилировать любую статику с первым параметром соответствующего типа, даже если он не помечен this?


Ты хочешь сомнительную реализацию сомнительной фичи "что я могу сделать с ЭТИМ".
Как правило, не нужны сразу все возможные методы. Всегда ровно один, всё остальное мусор. Кроме того, гораздо эффективнее решать другую задачу — "как из x попасть в y".

this как штемсель, который говорит о том, что ты выполнил/прошел определенные проверки. Т.е. тебе даётся список того, что спроектировано целенаправленно, а не получилось случайно.

Скажем, для файла будет более менее нормально file.SendTo('deviceId'), если функция отсылает файла на девайс.
Но если эта функция отсылает не файл, а какую то хрень, [не]основываясь на содержимом файла, получится непойми что.
Re[18]: Кому ваще этот С++ нужен?
От: Cyberax Марс  
Дата: 01.06.15 19:52
Оценка:
Здравствуйте, 0BD11A0D, Вы писали:

C>>То есть, в классе строки будут методы для:

C>>1) Base64-кодирования
C>>2) URL-кодирования
C>>3) escape'а для shell'а
C>>4) escape'а для другого shell'а
C>>5) Санитизации строк для SQL injection'а
C>>6) Случайной перестановки букв
C>>7) Проверки пароля с помощью PBKDF2
C>>8) Приготовления кофе.
BDA>Они будут у идиота, чье представление о строках и типичных операциях с ними — идиотское. И заметьте, тут только один человек такое предлагает.
Какой именно из этих пунктов — идиотский? Они все имеют смысл в рамках определённых проектов.
Sapienti sat!
Re[17]: Кому ваще этот С++ нужен?
От: 0BD11A0D  
Дата: 02.06.15 15:22
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>1. И пусть вылезает. Типичный use-case дополнения предполагает ввод нескольких букв из имени метода.


Так ведь он не один вылезает. Вы посчитайте сами, сколько в бусте всего могло бы повылазить. И сколько нужного не вылазит.

EP>Типичные для кого? Если у класса сотни методов, то множества "типичных" для разных разработчиков будут слабо пересекаться в общем случае.


Для пользователей библиотеки, разумеется.

Откуда вы все берете эти «сотни»? Ни одна реализация строкового класса не содержит сотни методов. Ну, есть удвоение-утроение числа за счет перегрузок, но даже в этом случае о сотнях методов речи не идет. На практике их очень мало и как-то так получается, что пересечение множеств у продуманной библиотеки близко к 100%.

BDA>>Дура-IDE должна показывать все молча. И, конечно, это авторский замысел, то есть, некая модель программистских представлений о сущностях.


EP>То есть автор что-то захотел положить в класс, а что-то нет, исключительно по его представлениям о "типичности", а не например по соображениям инкапсуляции


А что такое «соображения инкапсуляции»? Например, в случае с мутабельной строкой в плюсах сырой буфер доступен всем, и это неизбежно для низкоуровневого языка с прицелом на перфоманс. Какие соображения еще надо принимать во внимание?

EP>Что делать в случае когда нужна та функция, которая оказалась вне класса? Ты разве против того, чтобы введя имя объекта была возможность получить список в котором будут в том числе и эти внешние функции?


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

Да, я против того, чтобы вылезал неотфильтрованный список, потому, что это не то, что нужно. Когда вы просите секретаршу подготовить список потенциальных клиентов, вам что надо — список тех, кто реально у вас мог бы что-то заказать, или список всех кого попало, у кого какой-нибудь левый признак более-менее совпадает? Или как вам поисковая SEO — не приходилось сталкиваться? Чтобы этого не было, надо налагать нормальный фильтр. У секретарши есть мозг, а у IDE его нет. И, вроде бы, пока еще не дошло до такой острой конкуренции у разработчиков библиотек за клиентский вызов, чтобы SEO устраивать. Может, в будущем, при работе в облаках будет, а сейчас — нет. Значит, лучшее решение — задействовать мозг автора библиотеки и положиться на его суждение, что относится к объекту, а что нет.

EP>В целом я не в восторге от ООП — оно конечно отлично подходит для некоторых областей, но к сожалению на протяжении последних лет двадцати его пихают куда ни попадя.

EP>Тем не менее, главным и единственным преимуществом "дополнение через точку" уж точно не является.
EP>Из такого утверждения практически следует что не учитывая авто-дополнения, код без ООП строго не хуже, а во многих случаях и лучше чем с ООП. Фактически получается что по-твоему ООП это всего лишь уродование кода ради авто-дополнения

Во-первых, это по-вашему уродование. По-моему, уродование — забустовать без задней мысли.

Во-вторых, что вы приковырялись к автодополнению как таковому? Автодополнение показывает, насколько явно авторы пометили привязки в коде. И да, это (привязки алгоритмов к объектам) главное и единственное преимущество, если разобраться. Вывод выглядит неожиданно? Ну а что делать. Be open-minded. Вы же сами пишете, что суют ООП куда ни попадя. Обещают, что от использования будут миллионы денег, все бабы дадут, а потом прилетит Санта-Клаус и покажет кино. Я реалистично вам говорю — ничего такого не будет, вы просто структурируете код, делаете его понятнее, главным образом за счет привязок алгоритмов к данным. Делаете настолько понятным, что даже IDE может показать вам вменяемый список возможных действий с объектом. Что уж говорить о человеке — тот ТОЖЕ сможет гораздо лучше его найти и осознать. Это не так уж мало, согласитесь.

BDA>>Вопрос был — «А как например выражается алгоритмическая сложность, список возможных исключений». Я говорю: есть такие примеры и вы можете их найти самостоятельно. Незачем зацикливаться на C++.

EP>Уже во втором сообщении ты отсылаешь к каким-то примерам без всякой конкретики. "примеры есть, сам ищи"

Да, именно так. Ну хорошо, есть такой широко известный пример, как выражается кодом список возможных исключений:

https://docs.oracle.com/javase/tutorial/essential/exceptions/declaring.html

Мне не нравится, кстати. Но выражается. Непонятно зачем.

EP>Ты спрашивал "IntelliSense не основанный на инкапсуляции", я его показал


Я же вам дал ссылку на полную постановку задачи? Которую вы запросили, хоть и с опозданием? Дал. Какие проблемы? Что-то на то сообщение никто не берется отвечать. Потому, что нечего ответить. Если есть, давайте, не надо ходить вокруг да около.

EP>>>А я и описал. Непонятно с чем конкртено ты не согласен. Могу ещё раз повторить: убери ключевое слово this из extension method'ов в C# и специальный синтаксис вызова — как ты думаешь, будет ли технически возможно автодополнение в таком случае, и если нет то почему.

BDA>>Нет, не будет. Потому, что ни IDE, ни компилятор в вашу голову залезть не может и понять, что это за функция — случайно совместимая по сигнатуре или задизайненная как extension — тоже не может.

EP>Что значит "случайно совместимая по сигнатуре"? Я говорю о том что нужно выводить как раз список всех таких функций.


Вам нужно видеть OpenFile, когда у вас на руках строка "Москва,Париж"? Ну так большинству не нужно.

EP>Там вообще-то вопрос про другой this. Не про this в сигнатуре, а про this значение внутри метода расширяемого класса


Хе-хе-хе, вот это скрюапчик. Невнимательно вопрос прочитал.

EP>>>3. Алгоритмов очень много, далеко не все есть в стандартной библиотеке, расширять набор алгоритмов рано или поздно всё равно придётся.

BDA>>3. Я предложил привести пример, чтобы его разобрать,

EP>Например нам потребовалась поразрядная сортировка.


Если нам потребовалась (в одном месте) поразрядная сортировка, мне абсолютно пофиг, как вы ее оформите — хоть глобальной функцией. Моделировать проект это не помешает. Если она требуется много раз, это говорит о том, что, возможно, имеется некоторая сущность, которую, может быть, следует оформить как таковую. Если она требуется много где, это превращает алгоритм в стандартный, после чего с ним надо начать обращаться как со стандартным алгоритмом и мимикрировать под стандартную библиотеку. С учетом констрейнтов на тип параметра коллекции.
Re[17]: Кому ваще этот С++ нужен?
От: 0BD11A0D  
Дата: 02.06.15 15:27
Оценка: :)
Здравствуйте, Ikemefula, Вы писали:

BDA>>Речь идет о необходимости добавлять this. Почему бы просто не автодополнять и комипилировать любую статику с первым параметром соответствующего типа, даже если он не помечен this?


I>Ты хочешь сомнительную реализацию сомнительной фичи "что я могу сделать с ЭТИМ".

I>Как правило, не нужны сразу все возможные методы. Всегда ровно один, всё остальное мусор. Кроме того, гораздо эффективнее решать другую задачу — "как из x попасть в y".

I>this как штемсель, который говорит о том, что ты выполнил/прошел определенные проверки. Т.е. тебе даётся список того, что спроектировано целенаправленно, а не получилось случайно.


I>Скажем, для файла будет более менее нормально file.SendTo('deviceId'), если функция отсылает файла на девайс.

I>Но если эта функция отсылает не файл, а какую то хрень, [не]основываясь на содержимом файла, получится непойми что.

Вы не могли бы это все >> Evgeny.Panasyuk? Потому, что я все это уже несколько раз написал. Главное, как объяснить, что this не только с extension'ами эту роль выполняет, но и с обычными классами. Потому и this.
Re[17]: Кому ваще этот С++ нужен?
От: 0BD11A0D  
Дата: 02.06.15 15:28
Оценка: +1 :)
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>В языке D не такой необходимости — там можно вызывать f(x,y), как x.f(y).


Спасибо за информацию. Не знал. Давно хотел посмотреть на этот Дэ, теперь желание поумерилось.
Re[18]: Кому ваще этот С++ нужен?
От: Evgeny.Panasyuk Россия  
Дата: 02.06.15 16:37
Оценка:
Здравствуйте, 0BD11A0D, Вы писали:

EP>>Типичные для кого? Если у класса сотни методов, то множества "типичных" для разных разработчиков будут слабо пересекаться в общем случае.

BDA>Для пользователей библиотеки, разумеется.
BDA>Откуда вы все берете эти «сотни»? Ни одна реализация строкового класса не содержит сотни методов. Ну, есть удвоение-утроение числа за счет перегрузок, но даже в этом случае о сотнях методов речи не идет.

У std::string сотни методов. А если засунуть туда ещё и алгоритмы STL — то будет несколько сотен.

EP>>То есть автор что-то захотел положить в класс, а что-то нет, исключительно по его представлениям о "типичности", а не например по соображениям инкапсуляции

BDA>А что такое «соображения инкапсуляции»? Например, в случае с мутабельной строкой в плюсах сырой буфер доступен всем, и это неизбежно для низкоуровневого языка с прицелом на перфоманс. Какие соображения еще надо принимать во внимание?

Внутренние инварианты строки недоступны из вне. Например внутренний указатель должен указывать на валидный буфер, либо быть нулевым, capacity должен быть не меньше size и т.п.
Все методы имеют доступ к этим инвариантам и могут их поломать.

EP>>Что делать в случае когда нужна та функция, которая оказалась вне класса? Ты разве против того, чтобы введя имя объекта была возможность получить список в котором будут в том числе и эти внешние функции?

BDA>Вызывать ее как функцию.

И как ты это сделаешь без настолько "важного" IntelliSense?

BDA>Да, я против того, чтобы вылезал неотфильтрованный список, потому, что это не то, что нужно. Когда вы просите секретаршу подготовить список потенциальных клиентов, вам что надо — список тех, кто реально у вас мог бы что-то заказать, или список всех кого попало, у кого какой-нибудь левый признак более-менее совпадает?


Не просто список "всех кого попало", а отсортированный по приоритетам. Это большая разница.
Я хочу чтобы поисковой движок а-ля Google/Yandex выдавал как можно больше результатов, при этом они должны быть отсортированы по приоритетам. Да, часто нужны только первые несколько элементов, но бывает что нужно несколько страниц, а иногда даже все.
И меня совершенно не напрягает то что в тех случаях когда мне нужны только первые результаты, поисковик выдает много страниц.

EP>>В целом я не в восторге от ООП — оно конечно отлично подходит для некоторых областей, но к сожалению на протяжении последних лет двадцати его пихают куда ни попадя.

EP>>Тем не менее, главным и единственным преимуществом "дополнение через точку" уж точно не является.
EP>>Из такого утверждения практически следует что не учитывая авто-дополнения, код без ООП строго не хуже, а во многих случаях и лучше чем с ООП. Фактически получается что по-твоему ООП это всего лишь уродование кода ради авто-дополнения
BDA>Во-первых, это по-вашему уродование. По-моему, уродование — забустовать без задней мысли.

А причём тут вообще "забустовать"? Какие-то конкретные библиотеки ортогональны обсуждению о том нужно ли складывать внутрь класса методы, которые спокойно могли быть реализованы как внешние функции
По твоим (тут вроде все на "ты") же словам получается что ООП стоит использовать исключительно только из-за дополнения, разве не так? То есть код без ООП не хуже, а то и лучше чем код с ним.

BDA>Во-вторых, что вы приковырялись к автодополнению как таковому? Автодополнение показывает, насколько явно авторы пометили привязки в коде. И да, это (привязки алгоритмов к объектам) главное и единственное преимущество, если разобраться. Вывод выглядит неожиданно? Ну а что делать. Be open-minded. Вы же сами пишете, что суют ООП куда ни попадя


Да, суют. Но при этом это не означает у ООП нет никаких преимуществ кроме автодополнения.

BDA>Обещают, что от использования будут миллионы денег, все бабы дадут, а потом прилетит Санта-Клаус и покажет кино. Я реалистично вам говорю — ничего такого не будет, вы просто структурируете код, делаете его понятнее, главным образом за счет привязок алгоритмов к данным. Делаете настолько понятным, что даже IDE может показать вам вменяемый список возможных действий с объектом. Что уж говорить о человеке — тот ТОЖЕ сможет гораздо лучше его найти и осознать. Это не так уж мало, согласитесь.


1. Этого мало чтобы только из-за этого менять свой код. Я без проблем пишу код без всякого Intellisense, при этом да — с поддержкой IDE удобнее, но отнюдь не настолько чтобы это заставило меня писать код как-то по-другому (по сути портить) только ради этой возможности.
2. Подобный список можно выводить и без всякого ООП, ограничившись namespace'ами. Причём это будет более мощное средство — так как можно ввести несколько аргументов и по их типам подобрать подходящие варианты.

BDA>>>Вопрос был — «А как например выражается алгоритмическая сложность, список возможных исключений». Я говорю: есть такие примеры и вы можете их найти самостоятельно. Незачем зацикливаться на C++.

EP>>Уже во втором сообщении ты отсылаешь к каким-то примерам без всякой конкретики. "примеры есть, сам ищи"
BDA>Да, именно так. Ну хорошо, есть такой широко известный пример, как выражается кодом список возможных исключений:
BDA>https://docs.oracle.com/javase/tutorial/essential/exceptions/declaring.html

Так-то зачёт, и в C++ есть подобная возможность. Но, тут нет информации об условиях при которых вылетают эти исключения (хотя я её и забыл запросить).
Тем не менее — алгоритмическая сложность, и прочие описанные мной ограничения никак не указываются.

EP>>Ты спрашивал "IntelliSense не основанный на инкапсуляции", я его показал

BDA>Я же вам дал ссылку на полную постановку задачи? Которую вы запросили, хоть и с опозданием? Дал. Какие проблемы? Что-то на то сообщение никто не берется отвечать. Потому, что нечего ответить. Если есть, давайте, не надо ходить вокруг да около.

Я уже здесь частично ответил. Ок, тогда отвечу на то сообщение, точнее на темы которые не обсуждались.

EP>>Что значит "случайно совместимая по сигнатуре"? Я говорю о том что нужно выводить как раз список всех таких функций.

BDA>Вам нужно видеть OpenFile, когда у вас на руках строка "Москва,Париж"? Ну так большинству не нужно.

OpenFile где-то в хвосте списка ничем не повредит

EP>>Например нам потребовалась поразрядная сортировка.

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

1. И как произойдёт это "мимикрирование"?
2. Почему вызов редко используемого алгоритма должен синтаксически отличаться от часто используемого?
Re[18]: Кому ваще этот С++ нужен?
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 03.06.15 09:38
Оценка:
Здравствуйте, 0BD11A0D, Вы писали:

BDA>Вы не могли бы это все >> Evgeny.Panasyuk? Потому, что я все это уже несколько раз написал. Главное, как объяснить, что this не только с extension'ами эту роль выполняет, но и с обычными классами. Потому и this.


Вроде как именно ты предлагаешь вываливать на юзера вообще всё, т.е. решать все проблемы одним интелисенсом.
Re[19]: Кому ваще этот С++ нужен?
От: 0BD11A0D  
Дата: 03.06.15 10:31
Оценка:
Здравствуйте, Ikemefula, Вы писали:

BDA>>Вы не могли бы это все >> Evgeny.Panasyuk? Потому, что я все это уже несколько раз написал. Главное, как объяснить, что this не только с extension'ами эту роль выполняет, но и с обычными классами. Потому и this.


I>Вроде как именно ты предлагаешь вываливать на юзера вообще всё, т.е. решать все проблемы одним интелисенсом.


Что я тут делаю... А ведь несколько часов убил. Сейчас меня месяц жаба душить будет.
Re[2]: Кому ваще этот С++ нужен?
От: Дрободан Фрилич СССР  
Дата: 19.06.15 21:52
Оценка: -1
DreamMaker:

DM>и вообще. если все маразмы из С++ убрать, а все чего не хватает — сделать, получится С#

Чтобы на родных плюсах вместо new/delete была б-гомерзкая сборка мусора?

Работает прога с миллионами экземпляров объектов, никого не трогает и тут как начинается уборка
А виноват кто окажется? Программист вестимо.
Модератор-националист Kerk преследует оппонентов по политическим мотивам.
Re[3]: Кому ваще этот С++ нужен?
От: watchyourinfo Аргентина  
Дата: 19.06.15 21:57
Оценка:
ДФ>Работает прога с миллионами экземпляров объектов, никого не трогает и тут как начинается уборка
ДФ>А виноват кто окажется? Программист вестимо.


Работает прога с миллионами экземпляров объектов, никого не трогает, и тут jemalloc как начнет madvise вызывать.
А виноват кто окажется? Программист вестимо.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.