в 99% случаях передаваемые параметры не меняются функцией в которую передаются
соотв нада было вводить не const модификатор, которым теперь всё заср*но, а сделать всё по умолчанию const, а то что меняется указывать через например mutable
Я изъездил эту страну вдоль и поперек, общался с умнейшими людьми и я могу вам ручаться в том, что обработка данных является лишь причудой, мода на которую продержится не более года. (с) Эксперт, авторитет и профессионал из 1957 г.
Re: Как можно было так протупить с const параметрами?
Здравствуйте, Barbar1an, Вы писали:
B>в 99% случаях передаваемые параметры не меняются функцией в которую передаются B>соотв нада было вводить не const модификатор, которым теперь всё заср*но, а сделать всё по умолчанию const, а то что меняется указывать через например mutable
Эту ошибку практически все языки того времени делали. В Java то же самое.
Re: Как можно было так протупить с const параметрами?
B>в 99% случаях передаваемые параметры не меняются функцией в которую передаются B>соотв нада было вводить не const модификатор, которым теперь всё заср*но, а сделать всё по умолчанию const, а то что меняется указывать через например mutable
Хорошая идея. Наверное, вряд ли осуществима с учетом количества кода и требований обратной совместимости. В Свифте, кстати, как раз по умолчанию все параметры функции константны.
Патриот здравого смысла
Re: Как можно было так протупить с const параметрами?
Здравствуйте, Barbar1an, Вы писали:
B>в 99% случаях передаваемые параметры не меняются функцией в которую передаются B>соотв нада было вводить не const модификатор, которым теперь всё заср*но, а сделать всё по умолчанию const, а то что меняется указывать через например mutable
Отнюдь! Они не меняются функцией вовне, но используются и меняются внутри функции. Возьми стандартную библиотеку — std:for_each, std::copy, std::transform и т.д. почти все входящие параметры используются и меняются внутри функции(ну кроме It::end()). Точно так же и в strcpy, strlen и т.д. Итого: дефолтный const всех бы сильно утомил (ну если нельзя к итератору сделать it++).
Re[2]: Как можно было так протупить с const параметрами?
Здравствуйте, VVV, Вы писали:
VVV>Здравствуйте, Barbar1an, Вы писали:
B>>в 99% случаях передаваемые параметры не меняются функцией в которую передаются B>>соотв нада было вводить не const модификатор, которым теперь всё заср*но, а сделать всё по умолчанию const, а то что меняется указывать через например mutable
VVV>Отнюдь! Они не меняются функцией вовне, но используются и меняются внутри функции. Возьми стандартную библиотеку — std:for_each, std::copy, std::transform и т.д. почти все входящие параметры используются и меняются внутри функции(ну кроме It::end()). Точно так же и в strcpy, strlen и т.д. Итого: дефолтный const всех бы сильно утомил (ну если нельзя к итератору сделать it++).
Судя по всему, ТС имел ввиду передачу не по значению, но по ссылке
Re: Как можно было так протупить с const параметрами?
Здравствуйте, Barbar1an, Вы писали:
B>соотв нада было вводить не const модификатор, которым теперь всё заср*но
О чем речь вообще?
Практика навешивать `const` на параметры функций, чтобы предотвратить из изменение, существует и в ней есть логика. Но распространена эта практика настолько мало, что можно говорить "этим никто не пользуется".
О каком "всё заср*но" может идти речь в такой ситуации? Где вы такое сумели найти?
Best regards,
Андрей Тарасевич
Re[3]: Как можно было так протупить с const параметрами?
Здравствуйте, vopl, Вы писали:
VVV>>Отнюдь! Они не меняются функцией вовне, но используются и меняются внутри функции. Возьми стандартную библиотеку — std:for_each, std::copy, std::transform и т.д. почти все входящие параметры используются и меняются внутри функции(ну кроме It::end()). Точно так же и в strcpy, strlen и т.д. Итого: дефолтный const всех бы сильно утомил (ну если нельзя к итератору сделать it++).
V>Судя по всему, ТС имел ввиду передачу не по значению, но по ссылке
С чего бы это? У ТСа открытым текстом написано, что речь идет о константности самих параметров, а не о константности того, на что ссылаются ссылки.
А если он "имел в виду" что-то другое, то это никому не интересно. Телепатов нет.
Best regards,
Андрей Тарасевич
Re[2]: Как можно было так протупить с const параметрами?
АТ>Практика навешивать `const` на параметры функций, чтобы предотвратить из изменение, существует и в ней есть логика. Но распространена эта практика настолько мало, что можно говорить "этим никто не пользуется".
АТ>О каком "всё заср*но" может идти речь в такой ситуации? Где вы такое сумели найти?
Да повсюду.
В код-стайлах многих компаний прописано использования конст везде, где это возможно: Blender Unreal Engine Google
Здравствуйте, VVV, Вы писали:
B>>в 99% случаях передаваемые параметры не меняются функцией в которую передаются B>>соотв нада было вводить не const модификатор, которым теперь всё заср*но, а сделать всё по умолчанию const, а то что меняется указывать через например mutable
VVV>Отнюдь! Они не меняются функцией вовне, но используются и меняются внутри функции. Возьми стандартную библиотеку — std:for_each, std::copy, std::transform и т.д. почти все входящие параметры используются и меняются внутри функции(ну кроме It::end()). Точно так же и в strcpy, strlen и т.д. Итого: дефолтный const всех бы сильно утомил (ну если нельзя к итератору сделать it++).
Это просто плохо написанный код. В нормально написанном коде параметры не изменяются, если надо изменять — заводится отдельная локальная переменная. Дефолтный const утомил бы только плохих программистов.
Re[2]: Как можно было так протупить с const параметрами?
AleksandrN:
B>>в 99% случаях передаваемые параметры не меняются функцией в которую передаются AN>Это ты сейчас об этом знаешь. А в 1972 году Деннису Ритчи и Кену Томпсону это, видимо, было не очевидно.
Мне кажется в 1972 г. никакого модификатора const еще не было.
Модератор-националист Kerk преследует оппонентов по политическим мотивам.
Re: Как можно было так протупить с const параметрами?
Здравствуйте, Barbar1an, Вы писали:
B>в 99% случаях передаваемые параметры не меняются функцией в которую передаются B>соотв нада было вводить не const модификатор, которым теперь всё заср*но, а сделать всё по умолчанию const, а то что меняется указывать через например mutable
Legacy.
Re[3]: Как можно было так протупить с const параметрами?
Здравствуйте, vsb, Вы писали:
vsb>Это просто плохо написанный код. В нормально написанном коде параметры не изменяются, если надо изменять — заводится отдельная локальная переменная. Дефолтный const утомил бы только плохих программистов.
Это стандартная Сишная идеома: параметры передаются по значению и могут использоваться внутри функции, как локальные переменные.
И важно понимать, что значение указателя — это адрес некоей памяти, а не содержимое этой памяти.
Re[3]: Как можно было так протупить с const параметрами?
Здравствуйте, vopl, Вы писали:
VVV>>Отнюдь! Они не меняются функцией вовне, но используются и меняются внутри функции. Возьми стандартную библиотеку — std:for_each, std::copy, std::transform и т.д. почти все входящие параметры используются и меняются внутри функции(ну кроме It::end()). Точно так же и в strcpy, strlen и т.д. Итого: дефолтный const всех бы сильно утомил (ну если нельзя к итератору сделать it++).
V>Судя по всему, ТС имел ввиду передачу не по значению, но по ссылке
А это бы запутало сильно — по умолчанию по значению не const, а по ссылке (или по указателю?) — const
Здравствуйте, vsb, Вы писали:
vsb>Это просто плохо написанный код. В нормально написанном коде параметры не изменяются, если надо изменять — заводится отдельная локальная переменная. Дефолтный const утомил бы только плохих программистов.
Здравствуйте, Pzz, Вы писали:
vsb>>Это просто плохо написанный код. В нормально написанном коде параметры не изменяются, если надо изменять — заводится отдельная локальная переменная. Дефолтный const утомил бы только плохих программистов.
Pzz>Это стандартная Сишная идеома: параметры передаются по значению и могут использоваться внутри функции, как локальные переменные.
Я знаю си, это в любом языке работает так же. Это не меняет моего мнения. Современный код вообще должен быть в основном иммутабельным. Мутабельная переменная это должно быть, ну не исключение, но точно не большинство кода.
Вот открываю рандомный кусок в nginx-е. Ни параметры не меняются, ни 2 локальные переменные не меняются. Это норма.
Re[4]: Как можно было так протупить с const параметрами?
Здравствуйте, Marty, Вы писали:
vsb>>Это просто плохо написанный код. В нормально написанном коде параметры не изменяются, если надо изменять — заводится отдельная локальная переменная. Дефолтный const утомил бы только плохих программистов.
M>Аргументировать будешь?
Я не знаю, как это аргументировать. Можешь считать это моим наблюдением, что хороший код пишется в стиле, в котором переменные не меняются. А плохой код пишется в стиле, в котором переменные постоянно меняются. Это чем-то похоже на использование goto. В плохом коде goto используется, в хорошем коде goto используется, ну разве что в C для очистки ресурсов, за неимением лучшего.
Я так скажу. Чем больше изменяемых переменных, тем сложней понимать этот код. Поэтому изменяемых переменных должно быть как можно меньше. Делать хаскель из С я не предлагаю, во всём должна быть мера. Но неизменяемых переменных должно быть больше, чем изменяемых. И внимание читателя должно быть обращено именно на изменяемые переменные. Поэтому концепция "const по умолчанию" является правильной.
Здравствуйте, vsb, Вы писали:
Pzz>>Это стандартная Сишная идеома: параметры передаются по значению и могут использоваться внутри функции, как локальные переменные.
vsb>Я знаю си, это в любом языке работает так же. Это не меняет моего мнения. Современный код вообще должен быть в основном иммутабельным. Мутабельная переменная это должно быть, ну не исключение, но точно не большинство кода.
Ну во-первых, не в любом. Это — некоторое изобретение Си, передавать параметры всегда по значению и только по значению. До Си параметры как только не передавались. Вплоть до чрезвычайно сложного и непонятного механизма передачи параметров "по имени" в Algol-60, где если функции передается какая-то переменная, как один из параметров, и выражение, содержащее эту переменную, как другой из параметров, то если функция меняет значение этой переданной ей переменной, то и выражение тоже пересчитывается.
vsb>Вот открываю рандомный кусок в nginx-е. Ни параметры не меняются, ни 2 локальные переменные не меняются. Это норма.
Ты учти еще такую вещь, что компилятор 70-х, если ты заведешь лишнюю переменную, он ведь по-настоящему ее заведет. Не то, что нынешний, который проанализирует, что время фактической жизни переменной — это от сих и до сих, и вне этого интервала переиспользует отведенную на нее память или регистр.
Да даже и до сих пор, слишком много локальных переменных сбивает с толку аллокатор регистров в компиляторе, что отнюдь не увеличивает качество кодогенерации.
Да, в 95% случаев разница в эффективности получающегося машинного кода не имеет особого значения, и лучше писать, как понятно. Но для остальных 5% случаев надо все-таки уметь писать хорошо.
Re[5]: Как можно было так протупить с const параметрами?
Здравствуйте, vsb, Вы писали:
M>>Аргументировать будешь?
vsb>Я не знаю, как это аргументировать. Можешь считать это моим наблюдением, что хороший код пишется в стиле, в котором переменные не меняются. А плохой код пишется в стиле, в котором переменные постоянно меняются.
Ну, чисто твоя имха, не более. С которой я не согласен
vsb>Это чем-то похоже на использование goto. В плохом коде goto используется, в хорошем коде goto используется, ну разве что в C для очистки ресурсов, за неимением лучшего.
Ничем не похоже. Более того, без всякого goto можно написать плохой код, не используя при этом изменение параметров функций
vsb>Я так скажу. Чем больше изменяемых переменных, тем сложней понимать этот код. Поэтому изменяемых переменных должно быть как можно меньше. Делать хаскель из С я не предлагаю, во всём должна быть мера. Но неизменяемых переменных должно быть больше, чем изменяемых. И внимание читателя должно быть обращено именно на изменяемые переменные. Поэтому концепция "const по умолчанию" является правильной.
Неизменяемые переменные вообще не нужны, это просто "синтаксический" сахар. Но это не про параметры. А про параметры — вызывающему коду должно быть насрать (если мы еще говорим о передаче по значению) что происходит внутри функции. А если тупо поклоняться const параметрам и напихивать const везде в сигнатуры функций, то это накладывает ограничения на реализацию функций, чего вообще-то быть не должно. В принципе, конечно, при необходимости можно прототип поправить, кроме пересборки зависимостей ничего страшного не должно произойти, но всё равно это попахивает
Здравствуйте, vsb, Вы писали:
vsb>Я знаю си, это в любом языке работает так же. Это не меняет моего мнения. Современный код вообще должен быть в основном иммутабельным. Мутабельная переменная это должно быть, ну не исключение, но точно не большинство кода.
Не в любом. В твоей джаве все по ссылкам передается, и вот там, да, const имеет некоторый смысл. Ну и, я не помню, как там в джаве, но если в плюсах передавать указатель на интерфейс, да или просто на объект, то все его вызываемые методы должны быть const, если указатель объявлен как const. Это уже прорастает в интерфейс объекта. Особенно это весело, если это интерфейс, там обычно методы const'ом не обмазывают.
vsb>Вот открываю рандомный кусок в nginx-е. Ни параметры не меняются, ни 2 локальные переменные не меняются. Это норма.
Там две переменные, которые константы, считай, и вполне можно обойтись и без них. А то, что по указателю — меняется. А вот указатель сам — не const, хотя можно было бы так сделать (но зачем? Если ты его в функции случайно поменяешь — а поменять там, кроме как на ноль — особо и не на что — и сразу seg fault при повторном использовании, а если после использования — то вообще и не заметишь). И буквально одной функцией выше — там всё меняется — https://github.com/nginx/nginx/blob/f7ea8c76b55f730daa3b63f5511feb564b44d901/src/http/ngx_http_request_body.c#L820. Такое впечатление, что ты этот случайно тыкнутый фрагмент долго и тщательно выбирал