Tôi lấy câu hỏi của bạn là tại sao không thiết kế ngôn ngữ để ngăn chặn sự cần thiết cho một hội nghị ở nơi đầu tiên? Nói cách khác, tại sao Scala không buộc phải sử dụng dấu ngoặc đơn mọi lúc, thay vì đôi khi cho phép lập trình viên bỏ qua chúng?
Câu trả lời được tìm thấy trong tính minh bạch tham chiếu . Về cơ bản, nếu một chức năng không có tác dụng phụ, một cuộc gọi chức năng có thể được thay thế bằng kết quả của nó, mà không thay đổi hành vi của chương trình.
Điều đó có nghĩa là một hàm không có tham số hoặc tác dụng phụ tương đương về mặt ngữ nghĩa với việc val
giữ giá trị trả về của hàm đó. Do tính chất này, khi một lớp phát triển, lập trình viên có thể chuyển đổi qua lại giữa việc sử dụng một val
hoặc sử dụng một chức năng, vì sự thuận tiện hoặc hiệu quả chỉ ra.
Vì bạn có thể bỏ qua dấu ngoặc đơn, điều đó có nghĩa là mã gọi một cái gì đó như queue.size
không cần biết cũng không quan tâm nếu size
là hàm hay a val
. Do đó, người triển khai Queue
lớp có thể tự do thay đổi giữa hai người mà không phải thay đổi bất kỳ mã gọi nào (mặc dù tôi tin rằng nó sẽ cần biên dịch lại). Nó ổn định giao diện công cộng của lớp. Ví dụ: bạn có thể bắt đầu queue.size
bằng cách gọi size
một cơ sở List
, có khả năng O(n)
, sau đó thay đổi size
thành một val
lý do hiệu quả.
Quy ước gợi ý các dấu ngoặc đơn khi có các tác dụng phụ để làm rõ rằng thành viên lớp này chắc chắn là một lệnh gọi hàm, và do đó có khả năng không minh bạch về mặt tham chiếu. Điều quan trọng là gọi mã để biết liệu các tác dụng phụ có được tạo ra hay không, vì vậy họ có thể tránh gọi nó nhiều lần. Nếu bạn không quan tâm liệu đó có phải là một chức năng hay không, bạn cũng có thể coi nó là không.