LINUX.ORG.RU

Оправдывайтесь, плюсодрочеры! (a.k.a. есть что-то хуже C++?)

 ,


0

4

Решил проверить, вдруг со времён С++98/03 что-то поменялось и язык стал вменяемым языком, а не набором костылей.

Спиратил Effective Modern C++ Мейерса. Дочитал до 6-го item'а. Там облом с auto: возвращается прокси-объект вместо ожидаемого программистом типа. Как обойти? (барабанная дробь) ЯВНЫМ ПРИВЕДЕНИЕМ ТИПА!

Нафига нужен тогда auto, если от явного приведения типа никуда не деться?

Сейчас фанбои закудахтают что мол «ну это же исключение, обычно auto ведёт себя так как надо». Предлагаю им представить типичную ситуацию в проэкте на 99M loc: объект возвращал что-то такое, что было совместимо с нашими представлениями и убогим type inference и мы использовали auto и ни о чём не думали. А потом решили для оптимизации или чего ещё заменить возвращаемое значение на прокси.

Что предложат нам фанбои? Перелопачивать 99M loc и явно кастовать/заменять auto на нужный тип?

Ладно, не шмагли запилить нормальный type inference, как в человеческих языках семейства ML. Ну могли бы запилить что-нибудь вроде оператора приведения к auto:

class ProxyClass {
    operator auto() { return ExpectedType; }
}
Компилятор использовал бы эту конструкцию для вывода типа для auto-переменной.

Конечно, теперь нам нужен костыль для случая когда мы хотим, чтобы auto выводилось не в ExpectedType, а в ProxyClass. Но это меньшее зло: этот костыль будет нужен только в ограниченном объёме кода и с ним будет работать малое число посвящённых, вроде написателей библиотеки. Огромные же пласты пользовательского кода будут безболезненно и незаметно переносить замену ExpectedType на ProxyClass и обратно.

Ладно, я тут со своими рационализаторскими предложениями отклонился от главной мысли. Прошёл десяток лет. Вышли новые стандарты. Но язык по прежнему остался кривым и убогим нагромождением правил и исключений (одно из которых я привёл выше). Затхлым прудом, под тиной которого скрыты завалы подводных камней. И с новым стандартом камней стало только больше.

Есть что-то иезуитское в названиях вида «Effective C++», когда в самой книге описываются методы как при движении по полю не подорваться на минах, которые рандомно разбросали полоумные создатели стандарта. Можно ли «эффективно» (быстро) двигаться по минному полю и не подрываться? Нет, это взаимоисключающие параграфы.

На C++ можно писать либо эффективно и проект быстро станет бажным и дорогим в поддержке. Можно писать корректно, что значит сверять каждую введённую строчку с кучей правил и исключений в страхе ошибиться в каких-то предположениях — то есть писать медленно и опять же дорого.

Плюсодрочеры, начинайте каяться!



Последнее исправление: SystemD-hater (всего исправлений: 5)

Мейерс не торт. А ты какое-то бла-бла-бла написал. C++ говно, но C еще хуже, а остальное(Rust, D) в продакшене не айс. Да и вообще.

anonymous
()

На C++ можно писать либо эффективно и проект быстро станет бажным и дорогим в поддержке, либо корректно, что значит медленно и опять же дорого.

Можно подумать есть альтернативы.

Deleted
()

На C++ можно писать либо эффективно и проект быстро станет бажным и дорогим в поддержке, либо корректно, что значит медленно и опять же дорого.

Да, не, нормально=)

anonymous
()

Дочитал до 6-го item'а

Дальше не читал.

EXL ★★★★★
()

Стандарты вышли новые, но суть то осталась прежней.
Правила придумали для переносимости.
Ну и чтобы ты себе в ногу не выстрелил
Зачем ныть то?

Cactus64k
()

С++, конечно, царь зверей в зоопарке бессмысленных и беспощадных технологий. Но большая часть остальной индустрии недалеко ушла: Delphi, Java, C#, Scala. Сбрасываем ещё один слой ненужности с нашей луковицы и получаем Ruby, Lua, Haskell, OCaml. А в конце две наинеизбыточнейшие на сегодняшний день технологии общего назначения: coffeescript/nodejs и python. Это, конечно, очень утрированно, надо же и про прошивки для чайников подумать, и про загрузчики ОС. Тут всё просто: есть минимальный си, и есть движуха по внедрению веселья в этот простой, уютный, и счастливый мир:

fn unzip<A, B, FromA, FromB>(self) -> (FromA, FromB) where Self: Iterator<Item=(A, B)>, FromA: Default + Extend<A>, FromB: Default + Extend<B> { ... }

fn sum<S = Self::Item>(self) -> S where S: Add<Self::Item, Output=S> + Zero { ... }

pub trait IndexMut<Idx: ?Sized>: Index<Idx> {
    fn index_mut<'a>(&'a mut self, index: Idx) -> &'a mut Self::Output;
}

aemxdp
()
Ответ на: комментарий от anonymous

Мейерс не торт.

Ты вообще понял о чём я писал? Дело не в Мейерсе.

А ты какое-то бла-бла-бла написал. Да и вообще.

Вижу что не понял.

SystemD-hater
() автор топика
Ответ на: комментарий от dib2

Если не можешь сказать по сути — начинай придираться к чему-нибудь.

SystemD-hater
() автор топика
Ответ на: комментарий от Begemoth

Если кратко, ПНХ.

Фанбои засверкали интеллектом.

SystemD-hater
() автор топика
Ответ на: комментарий от pon4ik

Проваливаешь такой сроки, заказчик в бешенстве, а ты ему:

Если вы никого не злите, возможно вы не делаете ничего существенного

SystemD-hater
() автор топика

Оправдывайтесь, плюсодрочеры!

Что предложат нам фанбои? Перелопачивать 99M loc

99M loc

плюсодрочеры

кококо кудкудах

vasily_pupkin ★★★★★
()

1.

tl;dr:

ТС не понравилось, что auto по умолчанию присваивается reference, а не сам объект.

2.

Нахрена жирно троллить такой ерундой?

3.

Чуть выше уже был лучший комментарий в треде :)

sergej ★★★★★
()

Прочёл название темы - заинтересовался, думал будет интересный список «проблем». Но надо же - столько написать и всё ради (глупых) претензий к auto. Поломается-то всё на этапе компиляции, ничего страшного в этом нет. Предложенный костыль убог - это надо в большинство типов такой дурацкий оператор добавлять на случай «вдруг понадобится»? А выводить тип из прокси может поломать существующий код.

DarkEld3r ★★★★★
()

Прошёл десяток лет. Вышли новые стандарты. Но язык по прежнему остался кривым и убогим нагромождением правил и исключений (одно из которых я привёл выше). Затхлым прудом, под тиной которого скрыты завалы подводных камней.

И чем же ты его предлагаешь заменить?

anonymous
()
Ответ на: комментарий от DarkEld3r

в большинство типов

Только в прокси.

А выводить тип из прокси может поломать существующий код.

Если бы писатели стандарта глядели дальше своего носа, они бы ввели такую (или похожую) конструкцию вместе с auto. А до появления auto никакого кода, который бы сломался, не существовало.

SystemD-hater
() автор топика

как в человеческих языках семейства ML

Внимание, вопрос. Что мешает писать на человеческих языках семейства ML? У тебя за спиной стоит сержант и заставляет писать на C++?

i-rinat ★★★★★
()

каемся! каемся и поздравляем очередного кукаретика, который в отчаянии от своей ненужности на этом форуме попиарился очередным высером об убогости плюсов.

также сообщается, что разработчики массово уже переходят с C++ на другие языки и все благодаря никому неизвестному герою!

anonymous
()
Ответ на: комментарий от SystemD-hater

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

Ему наверное придется оправдываться, да.

pon4ik ★★★★★
()

Аааа, кококо среди всех 100500 фич С++11 auto сделали не так как в моем уютном Цацкеле с другой системой типов

vertexua ★★★★★
()

есть что-то хуже C++

Нет.

есть что-то, что может заменить его уже сейчас

Нет.

/thread

Kuzy ★★★
()

Олсо, если почитаешь дальше, то найдешь еще много интересного.

Немного мякотки!

return yoba;
return (yoba);

^^ имеют разную семантику.

Kuzy ★★★
()

Вот и я говорю: «Лучше Common lisp ещё ничего не придумали»

x11hater
()

ну так это ж спп, детка. придумали проблему, решили в новом стандарте. в результате родилось ещё 5ть проблем, которые решим в следующем стандарте. сппл/1 на марше.

anonymous
()
Ответ на: комментарий от SystemD-hater

Я понял. Но это бла-бла-бла.

anonymous
()
Ответ на: комментарий от anonymous

поддерживаю. хомячковые гуи с дичайще эффективным бэкендом.

anonymous
()
Ответ на: комментарий от SystemD-hater

Так кинул бы сюда. Не все же будут читать Мейерса. Он бабкодел, не такой, как Шилдт, конечно, но все же. Его книги были всегда для начинающих.

anonymous
()
Ответ на: комментарий от Deleted

Можно подумать есть альтернативы.

Вот в этом и должны каяться фанбои. В том, что поставили индустрию один на один с говноязыком.

SystemD-hater
() автор топика
Ответ на: комментарий от SystemD-hater

Вот в этом и должны каяться фанбои. В том, что поставили индустрию один на один с говноязыком.

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

DarkEld3r ★★★★★
()
Ответ на: комментарий от DarkEld3r

Как фанаты Эпл убеждены, что Интернет изобрёл Джобс, так и фанаты плюсов убеждены, что обобщённое программирование и ООП изобрёл Страуструп.

У обеих типов фанатов любовь к продукту деятельности их авторитета иррациональна.

SystemD-hater
() автор топика
Ответ на: комментарий от SystemD-hater

У обеих типов фанатов любовь к продукту деятельности их авторитета иррациональна.

Если бы за плюсы не платили, то 90% «фанатов» вымерло бы. Опять же, если руководствоваться твоей логикой, то такие недалёкие люди сами нанимать, а значит и продвигать плюсы, точно не могут. Но реальность почему-то другой оказывается.

DarkEld3r ★★★★★
()
Ответ на: комментарий от SystemD-hater

так и фанаты плюсов убеждены, что обобщённое программирование и ООП изобрёл Страуструп

Что за бред? И при чем тут фанатизм-то? Сейчас C++ полноценно может заменить только Си, да и то не всегда. И на C++ скорость разработки выше. И велосипедить можно только там, где нужно. Так что использовать-то, если не кресты? Я пишу и на python и на scala, да даже на haskell могу, если нужно. Но они не справляются с задачами крестов, даже java не справляется.

anonymous
()
Ответ на: комментарий от Cactus64k

Ну и чтобы ты себе в ногу выстрелил

Поправил, не благодари.

SystemD-hater
() автор топика

Всем ньюс: в C++17 с помощью operator.() можно будет решить проблему. Наверное. За подробностями в http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4477.pdf , стр.~5, внизу.

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

SystemD-hater
() автор топика
Ответ на: комментарий от SystemD-hater

Какая разница? Пиши на языках, которые считаешь нормальными.

i-rinat ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.