Làm thế nào để chuỗi chính xác các chức năng quá tải?


8

Giả sử bạn có các hàm có số lượng tham số tùy chọn ngày càng tăng (và ngôn ngữ giả không cho phép tham số tùy chọn và số lượng tham số tùy ý) như sau:

function doStuff(Param a)
function doStuff(Param a, Param b)
function doStuff(Param a, Param b, Param c)

Một cách tốt để thống nhất chúng với một cuộc gọi là gì? Tôi có thể tưởng tượng hai thiết kế:

Rơi qua mọi thứ:

function doStuff(Param a)
    doStuff(a, defaultB)

function doStuff(Param a, Param b)
    doStuff(a, b, defaultC)

function doStuff(Param a, Param b, Param c)
    // magic goes here
  • Ưu điểm: Không trùng lặp nhiều mã, dễ dàng thay đổi một tham số mặc định.
  • Nhược điểm: Nhiều lệnh gọi hàm, có thể khiến Stacktraces khó đọc hơn hoặc vô dụng.

Hoặc gọi trực tiếp chức năng 'cuối cùng':

function doStuff(Param a)
    doStuff(a, defaultB, defaultC)

function doStuff(Param a, Param b)
    doStuff(a, b, defaultC)

function doStuff(Param a, Param b, Param c)
    // magic goes here
  • Ưu điểm: Không có nhiều chức năng gọi, không phải lo lắng nếu một chức năng mới được thêm vào chuỗi.
  • Nhược điểm: Sao chép nhiều mã, đặc biệt là các giá trị mặc định.

Tôi đã không nghĩ gì?


1
"Hàm mới được thêm vào" (có nghĩa là "thông số mới"?) dường như không khó hơn trong ví dụ đầu tiên. Có gì là hơi khó khăn hơn trong ví dụ đầu tiên được thả một tùy chọn (như vậy người sử dụng phải xác định cả hai abhay không), nhưng người đầu tiên vẫn thắng để giảm thiểu sự trùng lặp lỗi. BTW, lỗi đánh máy: Việc thực hiện quá tải giữa phải giống hệt nhau giữa các ví dụ.

CodeReview là để xem xét mã thực tế, vì bạn đang trình bày mã psuedocode nên nó không thuộc chủ đề đó.
Winston Ewert

Câu trả lời:


6

Tôi thích phương pháp đầu tiên. Khả năng của các giá trị mặc định trùng lặp ở khắp mọi nơi có thể làm giảm đáng kể khả năng bảo trì. Tôi đã gặp phải vấn đề cụ thể đó trong tự nhiên và đó là một cơn ác mộng.


2

Đầu tiên chỉ là hai dòng bổ sung trong một stacktrace không quá nhiều. Trong Java, tôi chưa bao giờ thấy stacktraces khó đọc vì tên phương thức tương tự.

Dù sao, sử dụng quá nhiều tham số có thể là một mùi mã xấu: Có bao nhiêu tham số là quá nhiều?


Ahrm, giả sử một số lượng phương thức / tham số tùy ý.
Bobby

0

Tôi sẽ chọn mô hình thứ hai (gọi trực tiếp chức năng "cuối cùng".). Điều này là tốt, và nó không tạo thành sao chép mã thực sự, bởi vì nó không liên quan đến thao túng bất kỳ loại trạng thái nào.

Nó cũng giúp nhận ra rằng những gì bạn đang làm bằng cách cung cấp nhiều tình trạng quá tải chỉ đơn giản là một mẹo để cung cấp ảo ảnh về các tham số tùy chọn. Một khi bạn thấy nó theo cách này, rõ ràng là phương pháp "cuối cùng" và duy nhất "cuối cùng" là phương pháp được cho là thực hiện bất kỳ công việc thực tế nào, vì vậy bất kỳ sự ủy thác nào trong số các phương pháp không phải là cuối cùng là vô nghĩa.

Cá nhân, tôi không phải lo lắng về vấn đề này nữa, vì tôi đang sử dụng C #, hỗ trợ các tham số tùy chọn, do đó giúp tôi không phải thực hiện các thủ thuật như thế này để mô phỏng chú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.