Безпараметричні та порожні-батьківські методи у Scala


10

На даний момент я вивчаю Scala через програмування Scala (2-й) Одерського. Я перебуваю в розділі 10, де він починає впроваджувати параметри і методи, що не мають порожніх батьків. Я просто не можу опустити голову.

Поки все, що я розумію, - це те, що я повинен використовувати порожні паролі, якщо метод має побічні ефекти та безпараметричні методи в іншому випадку.

Я не можу зрозуміти, у чому перевага цієї конвенції. Я читав публікації на Stack Exchange, але якщо чесно, коли публікації починають обговорювати цю тему в якійсь глибині, я був загублений.

Я шукаю просте пояснення, які типові випадки використання для цієї мовної функції та які переваги допоможуть мені краще зрозуміти це.

scala 

Відповіді:


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 мс), та властивості (по суті, порожні-батьківські методи), коли він не буде (тобто це простий пошук).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.