Quá tải hoặc tham số tùy chọn


10

Khi tôi có một hàm có thể, hoặc có thể không nhận được một tham số nào đó, tốt hơn là quá tải hàm hoặc thêm các đối số tùy chọn?

Nếu mỗi người có những thăng trầm - khi nào tôi sẽ sử dụng từng?


Từ quan điểm tối ưu hóa có các tham số tùy chọn là một lựa chọn tốt hơn.
Maneet Puri

Câu trả lời:


12

Nếu ngôn ngữ hỗ trợ chúng đúng cách (ví dụ: an toàn loại, nếu có), tôi muốn sử dụng các đối số tùy chọn vì các lý do sau:

  • Họ truyền đạt ý định của bạn tốt hơn để không ai nghi ngờ rằng chức năng quá tải của bạn sẽ làm điều gì đó khác đi (điều mà có lẽ không nên làm).
  • Ít mã hơn để duy trì, ngay cả khi chức năng quá tải chỉ ủy quyền cho toàn diện hơn. Nếu bạn muốn đổi tên hàm sau, bạn có ít nhất 3 vị trí để thực hiện (hai định nghĩa + một cuộc gọi).
  • Trình biên dịch (nếu có) có thể tạo ra các nhị phân nhỏ hơn.
  • Đối số tùy chọn quy mô tốt hơn, ít nhất là trong một số ngôn ngữ. Nếu bạn muốn có 3 đối số tùy chọn với khả năng trộn và kết hợp thì sao? Để hoàn toàn linh hoạt, bạn cần 6 lần quá tải để làm điều đó.
  • Nếu đó là một phương thức đối tượng, nhiều tình trạng quá tải sẽ cản trở rất nhiều việc thực hiện ghi đè trong các lớp con.

Bạn có cần 8 không? Ba đối số tùy chọn a, bccó những khả năng: không có gì, a, b, c, ab, ac, bc, abc. Nó 2^ndành cho các loại khác nhau, không phảin!
Đánh dấu

0

Giả sử một loại tình huống của nhà xây dựng: Tôi thường chọn một mẫu xây dựng trôi chảy để ngăn chặn các tình huống có nhiều tùy chọn.

Ví dụ. Ordering.natural().onResultOf(function).reverse().compound(Ordering.natural().onResultOf(function2))là một ví dụ về việc gọi một giao diện xây dựng thông thạo được triển khai trong Guava.

Tất nhiên bây giờ bạn cần một đối tượng riêng biệt để giữ trạng thái của trình tạo của bạn, nhưng bạn giảm độ phức tạp tổng thể bằng cách tách hành vi xây dựng khỏi hành vi của cấu trúc.


Điều này không trả lời câu hỏi.
Andy
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.