Я взяв ваше запитання: чому б не спроектувати мову, щоб у першу чергу запобігти необхідності конвенції? Іншими словами, чому Scala просто не змушує використовувати дужки весь час, а не дозволяє програмістам іноді їх опускати?
Відповідь знаходимо в референсній прозорості . По суті, якщо функція не має побічних ефектів, виклик функції можна замінити її результатом, не змінюючи поведінку програми.
Це означає, що функція без параметрів або побічних ефектів семантично еквівалентна val
утримує зворотне значення цієї функції. Через цю властивість, по мірі розвитку класу, програміст може перемикатися вперед і назад між використанням val
функції або використанням функції, як це диктує зручність або ефективність.
Оскільки ви можете опустити дужки, це означає, що код, який викликає щось подібне queue.size
, не повинен знати і не турбуватися, чи size
це функція чи a val
. Тому реалізатор Queue
класу вільний змінюватися між двома, не змінюючи жодного викликового коду (хоча, я вважаю, він потребуватиме перекомпіляції). Це стабілізує публічний інтерфейс класу. Наприклад, ви можете почати, queue.size
зателефонувавши size
на базовий List
, що потенційно O(n)
, а потім змінити size
на "а" val
з міркувань ефективності.
Конвенція пропонує дужки, коли є побічні ефекти, щоб зрозуміти, що цей член класу, безумовно, є функціональним викликом, а отже, потенційно не є референтно прозорим. Для виклику коду важливо знати, чи виробляються побічні ефекти, тому вони можуть уникати повторного його виклику. Якщо вам все одно, це функція чи ні, ви можете так само ставитися до неї, ніби це не так.