С++ с основ.
Mar. 29th, 2014 04:43 pmВ С++ плохо всё, с самых самых безобидных, казалось бы, основ.
Вот, например, конструктор:
MySuperExtraordinaryClass::MySuperExtraordinatoryClass()
{
}
Стоп машина! Чтобы понять, что это конструктор, необходимо прочитать два слова и убедиться, что они совпадают! Поздравим создателей языка с тем, что они сэкономили ключевое слово - "constructor"
Кстати, при чтении декларации класса всё еще хуже - вам надо помнить, декларацию какого именно класса вы читаете, чтобы распознать в ней декларацию конструктора.
Теперь, пожалуй, попробуем какие-нибудь конструкторы использовать. Ну, например, конструкторы стандартной библиотеки.
const char *buf="С++ is marvelous";
std::string s1(buf);
std::string s2(buf, 2); //гммм...
std::string s3(buf, 3, 2); //блять, что это?
std::string s4('2', 5); //а это что?
Внимательно вглядываясь в параметры, анализируя тип каждого из них, опытный программист быстро понимает, что именно данный конструктор делает. И так он "внимательно вглядывается и быстро понимает" всякий гребанный раз, встречая любой случай "перекрытого" вызова конструктора с параметрами.
Убей же С++ программиста в себе.
Вот, например, конструктор:
MySuperExtraordinaryClass::MySuperExtraordinatoryClass()
{
}
Стоп машина! Чтобы понять, что это конструктор, необходимо прочитать два слова и убедиться, что они совпадают! Поздравим создателей языка с тем, что они сэкономили ключевое слово - "constructor"
Кстати, при чтении декларации класса всё еще хуже - вам надо помнить, декларацию какого именно класса вы читаете, чтобы распознать в ней декларацию конструктора.
Теперь, пожалуй, попробуем какие-нибудь конструкторы использовать. Ну, например, конструкторы стандартной библиотеки.
const char *buf="С++ is marvelous";
std::string s1(buf);
std::string s2(buf, 2); //гммм...
std::string s3(buf, 3, 2); //блять, что это?
std::string s4('2', 5); //а это что?
Внимательно вглядываясь в параметры, анализируя тип каждого из них, опытный программист быстро понимает, что именно данный конструктор делает. И так он "внимательно вглядывается и быстро понимает" всякий гребанный раз, встречая любой случай "перекрытого" вызова конструктора с параметрами.
Убей же С++ программиста в себе.
no subject
Date: 2014-03-29 09:08 pm (UTC)а смысл читать декларацию класса, не зная что это за класс?
но вообще, конечно, во времена страуструпа всё было маленьким, классы тоже..
no subject
Date: 2014-03-29 09:12 pm (UTC)Можно даже знать что за класс - и всё равно придется тратить время (пусть даже 2 десятых секунды), чтобы сообразить, что перед тобой конструктор, а не функция, не возращающая тип )))
no subject
Date: 2014-03-29 09:24 pm (UTC)no subject
Date: 2014-03-29 09:40 pm (UTC)И это опять же, нечто, что нужно помнить, когда глаза бегут по коду.
no subject
Date: 2014-03-29 09:51 pm (UTC)просто такой вот синтаксис, во многих языках свои заморочки, которые порой нужно держать в голове (люблю его почемуто, оправдываю, есть такое Ж-)_) )
no subject
Date: 2014-03-29 09:59 pm (UTC)проблема - когда это приходится делать из года в год )))
no subject
Date: 2014-03-29 10:25 pm (UTC)Outdated pile of crap.
no subject
Date: 2014-03-29 10:30 pm (UTC)А вот с конструкторами такое не проканает, в смысле, оверлоадинг конструкторов применяется без лишних раздумий )))
no subject
Date: 2014-03-29 10:38 pm (UTC)С конструкторами не прошло и 30 лет, наконец сделали inheritance and delegation. Пока я это на работе увижу - наверное ещё 20 лет пройдёт.
Я согласен с ЙосефК на 98%. Ц++ должен быть разрушен.
no subject
Date: 2014-03-29 10:46 pm (UTC)не вполне понял суть проблемы.
Ну а лично я по возможности параметрами по-умолчанию пытаюсь не пользоваться в С++ - ибо гемор это страшный.
Порой вроде в каких-то простых ситуациях они удобны, но это пока что-то пытаешься в коде переделать на коленке. Когда же код уже окончательно написан, они чаще всего только мешают.
Да, пора этот С++ на свалку, пора )))
no subject
Date: 2014-03-29 11:02 pm (UTC)Если среди этого есть дефолтные параметры,то согласен, наступает гемор ещё больший.
В Пайтоне сделали очень красиво. Без явных имён параметров они передаются в том порядке как объявлены в сигнатуре. А с явными именами в вызове можно некоторые указывать, а некоторые пропустить. И никаких overloads не надо, ни балета с позицией параметров.
В бусте это как всегда обшли тремя тоннами темплейтов, но снаружи вроде выглядит приемлемо. Насколько вообще может быть приемлимо в С++. Т.е., конечно же мрак и ужас, но мы и не такое видали.
Вот что им мешало сделать named parameters ещё 20 лет назад, когда и дефолтные уже были и весь гимор с ними был очевиден? Правильно, мозговой слизень им мешал.
no subject
Date: 2014-03-29 11:04 pm (UTC)Это самое обидное, пожалуй.
Ц++ должен быть разрушен.
Ломать - не строить.
no subject
Date: 2014-03-29 11:21 pm (UTC)Свято место пусто не бывает! :)
no subject
Date: 2014-03-30 02:59 am (UTC)Нечитабельные идиомы, подобные
for (;;) или
std::string s3(buf, 3, 2);
есть в любом языке и запоминаются по мере использования. Не заглядывая в документацию, рискну предположить, что в строку кладется два символа, начиная с индекса 3, т.е. " i". Можно, конечно, завести поименованные параметры и писать что-то вроде
s3.substring(start:3, count:2)
но это многословно и быстро начинает доставать опытных программистов. В общем, это все мелочи.
В С++ хватает настоящих проблем - идиотская грамматика, затрудняющая автоматический рефакторинг, отсутствие единой системы типов (char* vs string, int[] vs vector<int>), отсутствие двоичной совместимости между разными компиляторами на одной платформе и т.п.
no subject
Date: 2014-03-30 03:29 am (UTC)это нельзя считать допустимой к заучиванию идиомой, поскольку подобное повторяется при дизайне практически любого value-like класса, как библиотечного, так и прикладного.
> Можно, конечно, завести поименованные параметры и писать что-то вроде
> s3.substring(start:3, count:2)
В этом примере обязано присутствовать слово "substr", именуемые параметры не обязательны. Так когда-то было сделано в старом тупом языке BASIC, например ))) Программист не должен из сочетания типов и количества параметров понимать, что речь идет именно о взятии подстроки. И еще раз, речь о конструкторе, а не об обычной функции ))).
А то давай еще для развития стиля сделаем все функции имеющими название "operator ()", а по типу аргументов будем судить, что она делает )))
Что до твоих проблем - так выкинь нафиг char* и int[] - и будет тебе счастье. А вот что действительно восхищает, это количество способов, которым можно передать параметр в функцию:
по значеню
по ссылке
по указателю
по ссылке на r-value
по эзотерической ссылке && в темплейте
по значению интеллектуального указателя (shared_ptr например)
по указателю на интеллектуальный указатель
по ссылке на интеллектуальный указатель
сюда ж еще модификатор const
далее со всеми остановками
Но я именно хотел поговорить о соверешнно безобидных на первых взгляд вещах, лежащих в основах синтаксиса, например. Что и было сделано.
no subject
Date: 2014-03-30 03:40 am (UTC)А вот фиг. Нельзя их выкинуть. По двум причинам - во-первых литералы имеют именно такой тип. Во-вторых, APIs специально под С++ мало кто пишет (см. проблему двоичной совместимости) - их пишут под С, а там без char* и int[] никуда.
> по эзотерической ссылке && в темплейте
Не знаком. Видать, добавили после того как я ушел из
большого сексаежедневного программирования на С++.no subject
Date: 2014-03-30 03:53 am (UTC)no subject
Date: 2014-03-30 03:57 am (UTC)Так что же такое && в темлпейтах? На какие ключевые слова гуглить?
no subject
Date: 2014-03-30 04:06 am (UTC)не, ну понятно, что это всё не идеально, я и не претендую.
По &&
http://thbecker.net/articles/rvalue_references/section_08.html
http://isocpp.org/blog/2012/11/universal-references-in-c11-scott-meyers
no subject
Date: 2014-03-30 04:09 am (UTC)no subject
Date: 2014-03-30 04:15 am (UTC)[ ] ( ) { }
это не выверт, а мы погулять вышли?
no subject
Date: 2014-03-30 05:44 am (UTC):)
no subject
Date: 2014-03-30 03:41 am (UTC)Good idea! Тогда у нас получится LISP :)
no subject
Date: 2014-03-30 03:55 am (UTC)no subject
Date: 2014-03-30 04:00 am (UTC)no subject
Date: 2014-03-30 04:08 am (UTC)no subject
Date: 2014-03-30 04:12 am (UTC)void* doIt(void* data);
Ну или
Object doIt(Object data);
в терминах Java/C#. Обратная совместимость гарантирована на 100%, по крайней мере на этапе компиляции. :)