Có bất kỳ lý do nào để không sử dụng Tùy chọn làm đối số phương thức trong trường hợp bạn biết đối số là thứ có thể cần hoặc không cần thiết?


11

Với Java 8, tôi đã thấy ngày càng nhiều bài viết về việc sử dụng Tùy chọn / Tùy chọn. Tôi hiểu những gì họ cố gắng đại diện, và tôi thấy nhiều ví dụ về họ đang được sử dụng làm lợi nhuận. Tuy nhiên, điều tôi không thấy là chúng đang được sử dụng làm đối số phương thức / hàm trong các ngôn ngữ không có cú pháp cho các tham số mặc định / tùy chọn.

Có bất kỳ lý do nào để không sử dụng Optionallàm đối số phương thức trong trường hợp bạn biết đối số là thứ có thể cần hoặc không cần thiết? Đây là một ví dụ tôi có thể nghĩ ra:

Optional<Customer> lookupCustomer(String firstName, Optional<String> middleName, String lastName)

Đây là cách sử dụng phổ biến cho chúng trong Haskell, cũng không có đối số mặc định (đau cà ri).
Daniel Gratzer

Xem câu trả lời của tôi cho một câu hỏi Stack Overflow liên quan. Tóm lại, Optionalchủ yếu dành cho các giá trị trả về có thể vắng mặt. Các ứng dụng khác là có thể, tất nhiên, nhưng cồng kềnh và có khả năng phong cách kém.
Stuart Marks

Câu trả lời:


6

Một lý do là khái niệm, firstName, middleName, và lastNamelà một cách logic một đối số, không phải ba. Chúng là tất cả các bộ phận của một tổng thể lớn hơn, và người ta có thể tưởng tượng rằng chúng hầu như luôn luôn đi cùng nhau. Trong các ngôn ngữ chức năng, chúng có thể được thông qua dưới dạng một tuple hoặc bản ghi; Java thiếu những thứ đó, vì vậy chúng có thể được tổng hợp thành một lớp Tên. Lưu ý rằng nếu bạn cần soạn các hàm lấy và trả lại tên đầy đủ, bạn sẽ không thể tổng hợp chúng - sau tất cả, bạn chỉ có thể trả về một giá trị.

Có lẽ nó không xuất hiện thường xuyên rằng một giá trị là tùy chọn và cũng không phải là một phần của tổng thể lớn hơn. Nếu hàm yêu cầu một giá trị nhất định để thực hiện công việc của nó, thì hàm đó không nên chấp nhận Optional. Nếu bạn cần xâu chuỗi các hoạt động có thể không trả về giá trị, hủy bỏ Nothingnếu có bất kỳ chức năng nào xảy ra trên đường đi, bạn có thể xâu chuỗi các cuộc gọi flatMapvà nếu bạn muốn thất bại với một ngoại lệ, bạn có thể sử dụng get()bất kỳ bước nào hoặc tại cuối chuỗi.

Nếu một giá trị thực sự là tùy chọn và một hàm thực hiện hai điều khác nhau dựa trên sự hiện diện hay vắng mặt của nó, thì đó là mùi mã trừ khi hàm đó là một hàm bao gồm hai hàm nhỏ làm một việc, và sự kết hợp các quyết định cụ thể đó là rất phổ biến.

Tôi không nghĩ rằng nó quá nhiều đến nỗi nó sai vì đây là trường hợp sử dụng tương đối hiếm gặp.


5

Không có nhiều ngôn ngữ không hỗ trợ các đối số mặc định, vì vậy đây không phải là cách sử dụng phổ biến. Cá nhân tôi nghĩ rằng việc sử dụng của bạn không tệ, nhưng nó sẽ không phải là thành ngữ Java. Java rất cố ý không có các đối số mặc định, để buộc sử dụng quá tải thay vào đó, có lợi thế là trình biên dịch kiểm tra các đối số của bạn thay vì yêu cầu các ifcâu lệnh bên trong hàm.

Nói cách khác, bạn sẽ tạo hai phiên bản truy vấn khác nhau: một phiên bản có tên đệm và một phiên bản không có tên đệm. Nếu bạn có thể làm điều đó một cách súc tích, sử dụng một tùy chọn là một ý tưởng tốt. Nếu nó đủ dài để bạn muốn nó ở hai chức năng riêng biệt, bạn cũng có thể sử dụng quá tải và biến nó thành thành ngữ.

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.