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 секунды запускается все и на ютуп выложить?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.