Как можно было так протупить с const параметрами?
От: Barbar1an Украина  
Дата: 19.08.22 18:29
Оценка: +6 -2
в 99% случаях передаваемые параметры не меняются функцией в которую передаются
соотв нада было вводить не const модификатор, которым теперь всё заср*но, а сделать всё по умолчанию const, а то что меняется указывать через например mutable
Я изъездил эту страну вдоль и поперек, общался с умнейшими людьми и я могу вам ручаться в том, что обработка данных является лишь причудой, мода на которую продержится не более года. (с) Эксперт, авторитет и профессионал из 1957 г.
Re: Как можно было так протупить с const параметрами?
От: vsb Казахстан  
Дата: 19.08.22 18:32
Оценка: -1
Здравствуйте, Barbar1an, Вы писали:

B>в 99% случаях передаваемые параметры не меняются функцией в которую передаются

B>соотв нада было вводить не const модификатор, которым теперь всё заср*но, а сделать всё по умолчанию const, а то что меняется указывать через например mutable

Эту ошибку практически все языки того времени делали. В Java то же самое.
Re: Как можно было так протупить с const параметрами?
От: DiPaolo Россия  
Дата: 19.08.22 18:35
Оценка:
B>в 99% случаях передаваемые параметры не меняются функцией в которую передаются
B>соотв нада было вводить не const модификатор, которым теперь всё заср*но, а сделать всё по умолчанию const, а то что меняется указывать через например mutable

Хорошая идея. Наверное, вряд ли осуществима с учетом количества кода и требований обратной совместимости. В Свифте, кстати, как раз по умолчанию все параметры функции константны.
Патриот здравого смысла
Re: Как можно было так протупить с const параметрами?
От: AleksandrN Россия  
Дата: 19.08.22 23:27
Оценка: +2
Здравствуйте, Barbar1an, Вы писали:

B>в 99% случаях передаваемые параметры не меняются функцией в которую передаются


Это ты сейчас об этом знаешь. А в 1972 году Деннису Ритчи и Кену Томпсону это, видимо, было не очевидно.
Re: Как можно было так протупить с const параметрами?
От: VVV Россия  
Дата: 20.08.22 03:17
Оценка: +2
Здравствуйте, Barbar1an, Вы писали:

B>в 99% случаях передаваемые параметры не меняются функцией в которую передаются

B>соотв нада было вводить не const модификатор, которым теперь всё заср*но, а сделать всё по умолчанию const, а то что меняется указывать через например mutable

Отнюдь! Они не меняются функцией вовне, но используются и меняются внутри функции. Возьми стандартную библиотеку — std:for_each, std::copy, std::transform и т.д. почти все входящие параметры используются и меняются внутри функции(ну кроме It::end()). Точно так же и в strcpy, strlen и т.д. Итого: дефолтный const всех бы сильно утомил (ну если нельзя к итератору сделать it++).
Re[2]: Как можно было так протупить с const параметрами?
От: vopl Россия  
Дата: 20.08.22 12:16
Оценка: +1
Здравствуйте, 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 параметрами?
От: Андрей Тарасевич Беларусь  
Дата: 21.08.22 18:44
Оценка: +1
Здравствуйте, Barbar1an, Вы писали:

B>соотв нада было вводить не const модификатор, которым теперь всё заср*но


О чем речь вообще?

Практика навешивать `const` на параметры функций, чтобы предотвратить из изменение, существует и в ней есть логика. Но распространена эта практика настолько мало, что можно говорить "этим никто не пользуется".

О каком "всё заср*но" может идти речь в такой ситуации? Где вы такое сумели найти?
Best regards,
Андрей Тарасевич
Re[3]: Как можно было так протупить с const параметрами?
От: Андрей Тарасевич Беларусь  
Дата: 21.08.22 18:48
Оценка: +1 :))
Здравствуйте, vopl, Вы писали:

VVV>>Отнюдь! Они не меняются функцией вовне, но используются и меняются внутри функции. Возьми стандартную библиотеку — std:for_each, std::copy, std::transform и т.д. почти все входящие параметры используются и меняются внутри функции(ну кроме It::end()). Точно так же и в strcpy, strlen и т.д. Итого: дефолтный const всех бы сильно утомил (ну если нельзя к итератору сделать it++).


V>Судя по всему, ТС имел ввиду передачу не по значению, но по ссылке


С чего бы это? У ТСа открытым текстом написано, что речь идет о константности самих параметров, а не о константности того, на что ссылаются ссылки.

А если он "имел в виду" что-то другое, то это никому не интересно. Телепатов нет.
Best regards,
Андрей Тарасевич
Re[2]: Как можно было так протупить с const параметрами?
От: DiPaolo Россия  
Дата: 21.08.22 19:35
Оценка: 1 (1) +1
АТ>Практика навешивать `const` на параметры функций, чтобы предотвратить из изменение, существует и в ней есть логика. Но распространена эта практика настолько мало, что можно говорить "этим никто не пользуется".

АТ>О каком "всё заср*но" может идти речь в такой ситуации? Где вы такое сумели найти?


Да повсюду.

В код-стайлах многих компаний прописано использования конст везде, где это возможно:
Blender
Unreal Engine
Google

Вот рекомендации от Страуструпа и Саттера в C++ Core Guidelines:
https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#con-constants-and-immutability

Вот несколько рандомных примеров из ГитХаба, где часто встречаются конст:
https://github.com/danmar/cppcheck/blob/main/lib/check.h
https://github.com/abseil/abseil-cpp/blob/master/absl/hash/hash.h
https://github.com/catchorg/Catch2/blob/devel/src/catch2/catch_session.hpp
Патриот здравого смысла
Re[2]: Как можно было так протупить с const параметрами?
От: vsb Казахстан  
Дата: 21.08.22 19:40
Оценка: +2 -3 :)
Здравствуйте, 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 параметрами?
От: Bill Baklushi СССР  
Дата: 21.08.22 19:41
Оценка: +2 :)
AleksandrN:

B>>в 99% случаях передаваемые параметры не меняются функцией в которую передаются

AN>Это ты сейчас об этом знаешь. А в 1972 году Деннису Ритчи и Кену Томпсону это, видимо, было не очевидно.
Мне кажется в 1972 г. никакого модификатора const еще не было.
Модератор-националист Kerk преследует оппонентов по политическим мотивам.
Re: Как можно было так протупить с const параметрами?
От: Pzz Россия https://github.com/alexpevzner
Дата: 21.08.22 21:31
Оценка:
Здравствуйте, Barbar1an, Вы писали:

B>в 99% случаях передаваемые параметры не меняются функцией в которую передаются

B>соотв нада было вводить не const модификатор, которым теперь всё заср*но, а сделать всё по умолчанию const, а то что меняется указывать через например mutable

Legacy.
Re[3]: Как можно было так протупить с const параметрами?
От: Pzz Россия https://github.com/alexpevzner
Дата: 21.08.22 21:34
Оценка:
Здравствуйте, vsb, Вы писали:

vsb>Это просто плохо написанный код. В нормально написанном коде параметры не изменяются, если надо изменять — заводится отдельная локальная переменная. Дефолтный const утомил бы только плохих программистов.


Это стандартная Сишная идеома: параметры передаются по значению и могут использоваться внутри функции, как локальные переменные.

И важно понимать, что значение указателя — это адрес некоей памяти, а не содержимое этой памяти.
Re[3]: Как можно было так протупить с const параметрами?
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 21.08.22 21:34
Оценка: +1
Здравствуйте, vopl, Вы писали:

VVV>>Отнюдь! Они не меняются функцией вовне, но используются и меняются внутри функции. Возьми стандартную библиотеку — std:for_each, std::copy, std::transform и т.д. почти все входящие параметры используются и меняются внутри функции(ну кроме It::end()). Точно так же и в strcpy, strlen и т.д. Итого: дефолтный const всех бы сильно утомил (ну если нельзя к итератору сделать it++).


V>Судя по всему, ТС имел ввиду передачу не по значению, но по ссылке


А это бы запутало сильно — по умолчанию по значению не const, а по ссылке (или по указателю?) — const
Маньяк Робокряк колесит по городу
Re[3]: Как можно было так протупить с const параметрами?
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 21.08.22 21:35
Оценка:
Здравствуйте, vsb, Вы писали:

vsb>Это просто плохо написанный код. В нормально написанном коде параметры не изменяются, если надо изменять — заводится отдельная локальная переменная. Дефолтный const утомил бы только плохих программистов.


Аргументировать будешь?
Маньяк Робокряк колесит по городу
Re[4]: Как можно было так протупить с const параметрами?
От: vsb Казахстан  
Дата: 21.08.22 23:04
Оценка: :)
Здравствуйте, Pzz, Вы писали:

vsb>>Это просто плохо написанный код. В нормально написанном коде параметры не изменяются, если надо изменять — заводится отдельная локальная переменная. Дефолтный const утомил бы только плохих программистов.


Pzz>Это стандартная Сишная идеома: параметры передаются по значению и могут использоваться внутри функции, как локальные переменные.


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

Вот открываю рандомный кусок в nginx-е. Ни параметры не меняются, ни 2 локальные переменные не меняются. Это норма.
Re[4]: Как можно было так протупить с const параметрами?
От: vsb Казахстан  
Дата: 21.08.22 23:06
Оценка: +3 -1
Здравствуйте, Marty, Вы писали:

vsb>>Это просто плохо написанный код. В нормально написанном коде параметры не изменяются, если надо изменять — заводится отдельная локальная переменная. Дефолтный const утомил бы только плохих программистов.


M>Аргументировать будешь?


Я не знаю, как это аргументировать. Можешь считать это моим наблюдением, что хороший код пишется в стиле, в котором переменные не меняются. А плохой код пишется в стиле, в котором переменные постоянно меняются. Это чем-то похоже на использование goto. В плохом коде goto используется, в хорошем коде goto используется, ну разве что в C для очистки ресурсов, за неимением лучшего.

Я так скажу. Чем больше изменяемых переменных, тем сложней понимать этот код. Поэтому изменяемых переменных должно быть как можно меньше. Делать хаскель из С я не предлагаю, во всём должна быть мера. Но неизменяемых переменных должно быть больше, чем изменяемых. И внимание читателя должно быть обращено именно на изменяемые переменные. Поэтому концепция "const по умолчанию" является правильной.
Отредактировано 21.08.2022 23:10 vsb . Предыдущая версия . Еще …
Отредактировано 21.08.2022 23:07 vsb . Предыдущая версия .
Re[5]: Как можно было так протупить с const параметрами?
От: Pzz Россия https://github.com/alexpevzner
Дата: 21.08.22 23:16
Оценка: +1
Здравствуйте, vsb, Вы писали:

Pzz>>Это стандартная Сишная идеома: параметры передаются по значению и могут использоваться внутри функции, как локальные переменные.


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


Ну во-первых, не в любом. Это — некоторое изобретение Си, передавать параметры всегда по значению и только по значению. До Си параметры как только не передавались. Вплоть до чрезвычайно сложного и непонятного механизма передачи параметров "по имени" в Algol-60, где если функции передается какая-то переменная, как один из параметров, и выражение, содержащее эту переменную, как другой из параметров, то если функция меняет значение этой переданной ей переменной, то и выражение тоже пересчитывается.

vsb>Вот открываю рандомный кусок в nginx-е. Ни параметры не меняются, ни 2 локальные переменные не меняются. Это норма.


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

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

Да, в 95% случаев разница в эффективности получающегося машинного кода не имеет особого значения, и лучше писать, как понятно. Но для остальных 5% случаев надо все-таки уметь писать хорошо.
Re[5]: Как можно было так протупить с const параметрами?
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 21.08.22 23:25
Оценка: -2
Здравствуйте, vsb, Вы писали:

M>>Аргументировать будешь?


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


Ну, чисто твоя имха, не более. С которой я не согласен


vsb>Это чем-то похоже на использование goto. В плохом коде goto используется, в хорошем коде goto используется, ну разве что в C для очистки ресурсов, за неимением лучшего.


Ничем не похоже. Более того, без всякого goto можно написать плохой код, не используя при этом изменение параметров функций


vsb>Я так скажу. Чем больше изменяемых переменных, тем сложней понимать этот код. Поэтому изменяемых переменных должно быть как можно меньше. Делать хаскель из С я не предлагаю, во всём должна быть мера. Но неизменяемых переменных должно быть больше, чем изменяемых. И внимание читателя должно быть обращено именно на изменяемые переменные. Поэтому концепция "const по умолчанию" является правильной.



Неизменяемые переменные вообще не нужны, это просто "синтаксический" сахар. Но это не про параметры. А про параметры — вызывающему коду должно быть насрать (если мы еще говорим о передаче по значению) что происходит внутри функции. А если тупо поклоняться const параметрам и напихивать const везде в сигнатуры функций, то это накладывает ограничения на реализацию функций, чего вообще-то быть не должно. В принципе, конечно, при необходимости можно прототип поправить, кроме пересборки зависимостей ничего страшного не должно произойти, но всё равно это попахивает
Маньяк Робокряк колесит по городу
Re[5]: Как можно было так протупить с const параметрами?
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 22.08.22 00:26
Оценка:
Здравствуйте, 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. Такое впечатление, что ты этот случайно тыкнутый фрагмент долго и тщательно выбирал
Маньяк Робокряк колесит по городу
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.