Quy ước đặt tên cho các chức năng bậc cao? [đóng cửa]


15

Có một quy ước đặt tên cho các chức năng bậc cao? Đó là, các hàm trả về các hàm khác.

Một ví dụ trong Javascript:

function onlyDivisibleBy(div) { // <-- higher order function
  return function (n) {
    return n % div === 0;
  }
}

var arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];

arr.filter(onlyDivisibleBy(3)); // [0, 3, 6, 9]
arr.filter(onlyDivisibleBy(5)); // [0, 5]

Tôi đã có xu hướng viết nó như trên: nghĩa là tối ưu hóa mức độ dễ đọc tại điểm gọi (Tôi đã đọc các dòng cuối cùng ở trên là "lọc mảng để lấy các mục chỉ chia hết cho 5"), tuy nhiên tại điểm định nghĩa đi từ ngữ cảnh được sử dụng, thật không dễ hiểu chức năng này làm gì từ tên của nó.


4
Điều đó thật đáng ngạc nhiên, tôi luôn hiểu thuật ngữ "hàm bậc cao" có nghĩa là một hàm chấp nhận hàm khác làm đối số. Tôi không nói bạn sai, tôi chỉ thấy sự khác biệt trong cách hiểu của chúng tôi thú vị.
Racheet

6
Các hàm @Racheet trả về các hàm cũng có thứ tự cao hơn. Họ có thể làm cả hai.
itbruce

3
@Racheet đó là một điểm tốt và khá phù hợp với ví dụ này: những gì OP thực sự triển khai là một phần ứng dụng. Nhiều (tất cả? Không chắc chắn) sử dụng nơi các hàm được trả về có thể được xem thay vào đó là ứng dụng một phần. @ nickf: đây là một cách sạch hơn để thực hiện ví dụ của bạn

Câu trả lời:


14

Không, tôi không nghĩ rằng bạn cần một quy ước đặt tên đặc biệt để cho biết bạn đang trả về một hàm. Như chúng ta có thể nhìn thấy từ ngôn ngữ mà chức năng được cà ri , trở về một chức năng cơ bản là giống như có một chức năng với nhiều tranh cãi. ví dụ: có rất ít sự khác biệt giữa onlyDivisibleBy(3)(6)onlyDivisibleBy(3,6)

Tôi sẽ thay đổi tên từ onlyDivisibleByđể isDivisibleBymặc dù như tôi nghĩ islà một cách phổ biến hơn để chỉ một vị và onlyDivisibleBy(3)(6)có vẻ kỳ lạ để trả lại truecho rằng 6 rõ ràng cũng là chia hết cho 2


5

Trong các ngôn ngữ chức năng được gõ mạnh, rõ ràng từ chữ ký hàm là hàm bậc cao hơn và hàm nào không, vì vậy đơn giản là không cần.

Trong các ngôn ngữ khác, tôi chưa bao giờ bắt gặp một quy ước đặt tên như vậy và tôi không thể nghĩ ra một quy ước nào sẽ không cồng kềnh. Tốt hơn để tập trung vào chức năng đặt tên tốt hơn là quá tải các tên như vậy, tôi nghĩ.


4

Không, và bạn không nên sử dụng bất kỳ.

Tại sao?

Bởi vì đó sẽ là một loại ký hiệu Hungary . Ý tưởng chính xác là các hàm được truyền cho các hàm bậc cao hơn chỉ là một loại biến. Vì vậy, hãy đối xử với họ như vậy.


1
Hàm ý là ký hiệu Hungary là phải tránh bằng mọi giá? Tôi khuyên bạn nên đọc Làm mã sai Nhìn sai
TehShrike

4
Tôi đã đọc điều đó trước đây và tôi vẫn tin rằng ký hiệu của Lynn là xấu :)
Wilbert

@TehShrike Liên kết của bạn bị hỏng.
corvus_192

1
@ corvus_192 hẳn đã bị lạc trong thiết kế lại blog của Joel! Url mới dường như là joelonsoftware.com/2005/05/11/making-wrong-code-look-wrong
TehShrike
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.