Я ответил на ваш вопрос: а почему бы не разработать язык, чтобы предотвратить необходимость конвенции? Другими словами, почему Scala просто не заставляет постоянно использовать круглые скобки, вместо того, чтобы позволить программистам иногда их опускать?
Ответ находится в ссылочной прозрачности . По сути, если функция не имеет побочных эффектов, вызов функции может быть заменен ее результатом, не изменяя поведение программы.
Это означает, что функция без параметров или побочных эффектов семантически эквивалентна val
хранению возвращаемого значения этой функции. Из-за этого свойства, по мере развития класса, программист может переключаться между использованием функции val
или функцией, в зависимости от удобства или эффективности.
Поскольку вы можете опустить круглые скобки, это означает, что коду, вызывающему что-то подобное queue.size
, не нужно ни знать, ни заботиться о том, size
является ли функция или a val
. Поэтому реализатор Queue
класса может свободно переключаться между ними без необходимости изменения какого-либо вызывающего кода (хотя я полагаю, что потребуется перекомпиляция). Стабилизирует публичный интерфейс класса. Например, вы могли бы начать queue.size
с вызова size
базового объекта List
, который потенциально является O(n)
, а затем изменить size
его val
на соображения эффективности.
Соглашение предлагает использовать круглые скобки, когда есть побочные эффекты, чтобы было ясно, что этот член класса определенно является вызовом функции и поэтому потенциально не может быть прозрачным по ссылкам. Для вызова кода важно знать, возникают ли побочные эффекты, чтобы они могли не вызывать его повторно. Если вас не волнует, является ли это функцией или нет, вы можете так же обращаться с ней, как будто это не так.