10

Trong lập trình hàm, điều quan trọng là tối ưu hóa bất kỳ mã "lặp" nào là đuôi đệ quy. Các thuật toán đệ quy đuôi thường được phân chia giữa hai hàm, tuy nhiên - một thuật toán thiết lập vỏ cơ sở và một thuật toán khác thực hiện vòng lặp thực tế. Một ví dụ tốt (mặc dù học tập) sẽ là chức năng ngược lại.Quy ước đặt tên của bạn cho các chức năng trợ giúp là gì?

reverse :: [a] -> [a] 
reverse = reverse_helper [] 

reverse_helper :: [a] -> [a] -> [a] 
reverse_helper result [] = result 
reverse_helper result (x:xs) = reverse_helper (x:result) xs 

"reverse_helper" thực sự không phải là tên mô tả hay. Tuy nhiên, "reverse_recursive_part" chỉ là khó xử.

Quy ước đặt tên nào bạn sẽ sử dụng cho các chức năng trợ giúp như thế này?

+0

Ngôn ngữ đó là gì? –

+0

Tôi xin lỗi. Tôi đang làm việc trên một dự án Haskell ngay bây giờ, trong đó lấy cảm hứng từ câu hỏi này. Tôi có thể đã đưa ra một ví dụ Python/Java tôi giả sử, mặc dù các hàm trợ giúp như vậy không hữu ích trong các ngôn ngữ mệnh lệnh. – Cybis

Trả lời

3

tôi có xu hướng để thêm "_recurse" đến cùng. Vì vậy, "reverse_recurse". Không chắc tôi lấy nó từ đâu. Tôi thích rời khỏi hàm trường hợp cơ bản đơn giản như bạn có trong ví dụ của mình. Nó có xu hướng là "công cộng" chức năng và thực tế là nó sử dụng một chức năng trợ giúp để thực hiện lặp lại là không liên quan đến người gọi. Trong javascript tôi đôi khi đi xa như vậy để ẩn các chức năng lặp đi lặp lại thông qua một đóng cửa, để làm cho nó thực sự rõ ràng nó không phải là để được gọi trực tiếp.

+0

"_recurse" - đó là một điều tốt. – Cybis

1

thiết lập và thực hiện

dụ:

function whateverSetup() { ... } 
function whateverExecute() { ... } 
+2

whateverSetup là một tên khủng khiếp nếu chức năng được công khai. – Cybis

+0

@ [Cybis]: Cần ngụ ý rằng bạn thay thế "bất kỳ điều gì" bằng cụm từ mô tả thích hợp, ví dụ: WidgetSetup, WidgetExecute, v.v. –

+0

Steven: Tôi nghĩ rằng quan điểm của anh ấy là "Thiết lập" không phải là một hậu tố tốt đẹp cho các chức năng được xuất. – Bladt

5

Tôi luôn sử dụng do_, như "do_compute" với "tính toán". Tôi thấy nó khá mô tả vì nó có hiệu quả là một phần của hàm thực hiện hành động, trong khi "tính toán" được gọi là cần phải có một tên mô tả đơn giản cho thế giới bên ngoài.

21

Bạn có thể gọi hàm trợ giúp bất cứ điều gì bạn muốn, và nó sẽ không quan trọng miễn là bạn không đặt hàm trợ giúp trong không gian tên "toàn cục". Đơn giản chỉ cần thêm một "thủ tướng" có vẻ là một thực tế phổ biến. :) Ví dụ, trong Haskell,

reverse :: [a] -> [a] 
reverse = reverse' [] 
    where reverse' :: [a] -> [a] -> [a] 
      reverse' result [] = result 
      reverse' result (x:xs) = reverse' (x:result) xs 
5

Tôi đồng ý với ShreevatsaR, nếu bạn không thực hiện chức năng helper cấp cao nhất (hoặc tệ hơn, đặt nó trong danh sách xuất khẩu), hơn nó không có vấn đề gì tên của nó là. Tôi có xu hướng gọi hàm trợ giúp fg.

reverse :: [a] -> [a] 
reverse = f [] 
    where 
    f ys []  = xs 
    f ys (x:xs) = f (x:ys) xs 

Tôi chỉ sử dụng lược đồ đặt tên này cho các chức năng nhỏ (nếu không tôi không biết số f là gì). Sau đó, một lần nữa, tại sao bạn sẽ bao giờ viết các chức năng lớn?

Tuy nhiên, nếu bạn muốn xuất chức năng 'helper' của bạn bởi vì nó có thể có ích cho người khác, tôi sẽ gọi nó là:

reverseAccumulator 

Giống như Haskell của zipzipWith. Nhưng tôi sẽ không gọi những chức năng 'trợ giúp' này, zipWith chỉ là một chức năng chung và zip là cài đặt mặc định (có thể là một trong số đó được sử dụng nhiều nhất).

+0

Tôi thích việc sử dụng nguyên tố (rev -> rev '= như ShreevatsaR gợi ý, nhưng tôi nghĩ rằng đây nên là câu trả lời được chấp nhận do tính tổng quát của nó và vì nó liên quan đến các quy ước trong thư viện. – Bladt

2

Tôi sử dụng aux hoặc foo_aux (đối với chức năng chính foo) và lồng định nghĩa sao cho không hiển thị bên ngoài.

3

Tôi cũng đồng ý với ShreevatsaR, trong ví dụ này tôi sẽ biến người trợ giúp thành một chức năng riêng tư.

Đối với các trường hợp khác mà tôi cần chức năng trợ giúp để hiển thị trong toàn bộ mô-đun, nhưng không được xuất, tôi có xu hướng tiền tố hoạt động với '_'. Chắc chắn, có tuyên bố xuất khẩu rõ ràng nhưng trong quá trình phát triển, tôi có xu hướng xuất tất cả các chức năng để dễ dàng khám phá tương tác, ví dụ: trong ghci. Sau đó, tôi thêm danh sách các chức năng được xuất và thanh dưới giúp dễ nhớ liệu tôi có dự định một chức năng cục bộ hay không.

Các vấn đề liên quan