Можно ли назвать UUID константой?

Можно ли назвать UUID константой?
Можно ли назвать UUID константой? - mattbotsford @ Unsplash

Насколько я понимаю, константа - это значение, которое присваивается только один раз и не может измениться во время выполнения, в то время как переменные имеют изменяемые значения, которые непредсказуемы по своей природе.

Мой вопрос заключается в том, в какой степени можно сказать, что значение известно? Можно ли назвать постоянными значения, которые присваиваются только один раз, но имеют некоторую внутреннюю "случайность" - например, UUID, который устанавливается только один раз для каждого процесса? Может ли любая форма случайности дисквалифицировать что-то как константу, даже если присвоенное значение следует полностью предсказуемой схеме?

Это довольно глупый семантический вопрос, но, исследуя эту тему, я нашла противоречивые мнения в других принятых ответах [ссылка]:

Переменные называются переменными не потому, что их значения могут быть изменены, а потому, что их значение не известно заранее - при написании кода они являются держателями для значений, которые будут определены позже. В отличие от них, значение константы известно в момент написания программы.

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

Я полагаю, что "не имеет значения, когда это значение было получено" означает, что это может применяться к изменяемому значению, создаваемому во время выполнения программы, при условии, что это значение неизменно в течение всего выполнения программы (как в примере с UUID).

Для облегчения понимания другими, всегда ли плохая практика помечать псевдослучайное целое число как константу, записывая его в верхнем регистре? Особенно в языках, которые не определяют тип constant для начала (например, Python), вредно ли это делать?

Такие термины, как «постоянный» или «переменный», не имеют четкого однозначного определения. Однако они могут иметь определенное значение в контексте определенного языка программирования или среды выполнения.

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

Многие языки (например, Java) имеют концепцию чего-то вроде окончательной статической переменной, которая присваивается один раз на этапе инициализации программы и никогда не изменяется в течение оставшегося времени жизни процесса. Это не константа времени компиляции, она может быть или не быть детерминированной, но она не изменится.

Python на самом деле не имеет концепции констант в том смысле, что их значение будет вычисляться во время компиляции. У нас есть только переменные, которые присваиваются во время выполнения программы. Однако у нас есть такие соглашения, как PEP-8, для переменных в верхнем регистре, которые используются как константы, такие средства, как typing.Final, чтобы сообщить программе проверки типов (если она используется), что переменная не должна быть переназначена, и инструменты, такие как свойства/дескрипторы, для создания ошибки времени выполнения, когда делается попытка присвоения.

Называете ли вы переменную «константой», должно больше зависеть от того, что вы пытаетесь передать. Ваш случайный пример UUID может сбить с толку некоторых людей, поэтому я бы не стал называть такую ​​переменную «константой».

Когда я написал «значение константы известно, когда программа написана», я не пытался начать философскую дискуссию о природе знания, а чтобы помочь ОП этого вопроса и ответа понять, что переменные не должны включать мутацию – вызов однократно назначаемой локальной переменной, содержащей результат ввода-вывода как «константу», может привести к путанице.


LetsCodeIt, 18 января 2023 г., 07:51