Почему так много языков программирования позволяют функции изменять объект, переданный ей в качестве параметра, без какого-либо синтаксиса, чтобы сделать это понятным для вызывающей стороны. Например, рассмотрим:
SomeObject A(15), B
B = DoSomething(A)
print(A + " " + B + "\n)
Читая этот код, вы ожидаете, что результат будет что-то вроде «15 75», т.е. A - это то, для чего вы его построили. Однако большинство языков позволяют DoSomething изменять значение A. В C ++ вы можете определить, возможно это или нет, посмотрев объявление DoSomething, например, посмотрев, определяется ли параметр как неконстантная ссылка. Тем не менее, во многих языках, таких как Python, на самом деле невозможно сказать, не прочитав код для функции, чтобы убедиться, что она никогда не изменится.
Я был укушен этим несколько раз, особенно когда пытался работать с чужим кодом, который использует это поведение и обычно приводит к построчному прохождению всего фрагмента кода, чтобы попытаться найти то, что изменяет параметр .
Почему языки обычно не требуют какого-либо явного синтаксиса при вызове, чтобы сказать «да, этот объект можно изменить», например, сказать «B = DoSomething (inout A)»?
Существуют ли какие-либо стандарты кодирования, которые помогают предотвратить возникновение проблем, кроме «никогда не изменяйте параметр, передаваемый в функцию»?