Методы без параметров и с пустым паренем в Scala

10

Сейчас я изучаю Scala через Программирование Scala Одерского (2-е). Я дошел до главы 10, где он начинает вводить методы без параметров и без парней. Я просто не могу разобраться с этим.

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

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

Я ищу простое объяснение того, каковы типичные варианты использования этой языковой функции и какие преимущества помогают мне лучше ее понять.


источник

Ответы:

14

Я ответил на ваш вопрос: а почему бы не разработать язык, чтобы предотвратить необходимость конвенции? Другими словами, почему Scala просто не заставляет постоянно использовать круглые скобки, вместо того, чтобы позволить программистам иногда их опускать?

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

Это означает, что функция без параметров или побочных эффектов семантически эквивалентна valхранению возвращаемого значения этой функции. Из-за этого свойства, по мере развития класса, программист может переключаться между использованием функции valили функцией, в зависимости от удобства или эффективности.

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

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

Карл Билефельдт
источник
6

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

Из руководства по стилю Scala по вызову метода:

Scala позволяет пропустить скобки для методов arity-0 (без аргументов):

reply() 

// is the same as 

reply

Однако этот синтаксис следует использовать только в том случае, если рассматриваемый метод не имеет побочных эффектов (чисто функциональный). Другими словами, было бы приемлемо опускать скобки при вызове queue.size, но не при вызове println().

Религиозное соблюдение этого соглашения значительно улучшит читабельность кода и значительно упростит понимание самой основной операции любого данного метода. Не поддавайтесь искушению опустить скобки, просто чтобы сохранить два символа!

В .NET принято использовать методы, когда для выполнения кода может потребоваться некоторое время (скажем, более 50 мс), и свойства (по существу, методы с пустым паренем), когда этого не происходит (т. Е. Это простой поиск).

Роберт Харви
источник