Các phương thức Parameterless & Empty-Paren trong Scala


10

Hiện tại tôi đang học Scala thông qua Scala lập trình của Oderky (thứ 2). Tôi đang ở chương 10 nơi anh ấy bắt đầu giới thiệu các phương thức không tham số và rỗng. Tôi chỉ không thể có được đầu của tôi xung quanh nó.

Cho đến nay, tất cả những gì tôi hiểu là tôi nên sử dụng parens rỗng nếu một phương thức có tác dụng phụ và phương thức không tham số khác.

Tôi không thể tìm ra lợi thế của quy ước này là gì. Tôi đọc các bài đăng trên Stack Exchange, nhưng thành thật mà nói, khi các bài viết bắt đầu thảo luận về chủ đề này ở một số độ sâu, tôi đã bị mất.

Tôi đang tìm kiếm một lời giải thích đơn giản về các trường hợp sử dụng điển hình cho tính năng ngôn ngữ này là gì và những lợi thế để giúp tôi hiểu rõ hơn về nó.

scala 

Câu trả lời:


14

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 valgiữ 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 valhoặ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.sizekhông cần biết cũng không quan tâm nếu sizelà hàm hay a val. Do đó, người triển khai Queuelớ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.sizebằng cách gọi sizemột cơ sở List, có khả năng O(n), sau đó thay đổi sizethành một vallý 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.


6

Đó là một quy ước, không phải là một phần của thiết kế ngôn ngữ. Nó được sử dụng như một biển chỉ dẫn để giúp những người phải đọc mã sau khi bạn viết nó để hiểu nó tốt hơn.

Từ Hướng dẫn về Phong cách của Scala về Gọi phương thức:

Scala cho phép bỏ qua dấu ngoặc đơn trên các phương thức arity-0 (không có đối số):

reply() 

// is the same as 

reply

Tuy nhiên, cú pháp này chỉ nên được sử dụng khi phương thức được đề cập không có tác dụng phụ (hoàn toàn là chức năng). Nói cách khác, có thể chấp nhận bỏ qua dấu ngoặc đơn khi gọi queue.size, nhưng không được phép khi gọi println().

Tuân thủ tôn giáo quy ước này sẽ cải thiện đáng kể khả năng đọc mã và sẽ giúp dễ hiểu hơn trong nháy mắt hoạt động cơ bản nhất của bất kỳ phương thức nào. Chống lại sự thôi thúc bỏ qua dấu ngoặc đơn giản chỉ để lưu hai ký tự!

Trong .NET, quy ước là sử dụng các phương thức khi mã có thể mất một lúc để chạy (giả sử, dài hơn 50ms) và các thuộc tính (về cơ bản là các phương thức rỗng) khi nó không (nghĩa là một tra cứu đơn giản).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.