Higher-order functions (HOF) là gì? Lợi ích mà nó mang lại khi sử dụng trong dự án của bạn.

Higher-order functions (HOF) là gì? Lợi ích mà nó mang lại khi sử dụng trong dự án của bạn.

Vấn đề

Nhớ lại trước đây, khi tôi đọc được bài viết về Higher-order functions thì nó đã gây ra một sự hoang mang nhất định. Do là mới vào nghề, kinh nghiệm chưa có nên đọc lý thuyết khá là khó hiểu. Hồi đó thì cũng đọc cho biết chứ chưa hình dung được tính ứng dụng gì nhiều. Mãi sau mới ngớ ra - ớ cái này xưa nay mình vẫn đang dùng thường xuyên mà!

Bài viết về Higher-order functions thì cũng rất là nhiều trên mạng rồi, bạn đọc chỉ cần tìm trên Google là thấy. Tuy nhiên, vì HOF là một khái niệm quan trọng và có tính ứng dụng cao nên tôi xin phép được viết một bài theo quan điểm cá nhân. Không nói nhiều nữa, bắt đầu thôi.

HOF là gì?

Higher-order functions trong JavaScript là các hàm có khả năng nhận đầu vào là một hoặc nhiều hàm khác hoặc trả về một hàm khác.

Ví dụ, một hàm có thể được truyền vào như một đối số của một hàm khác, hoặc một hàm có thể trả về một hàm khác để sử dụng trong mã của chúng ta. Điều này cho phép chúng ta tạo ra các hàm linh hoạt và tái sử dụng được.

Trong JavaScript, các hàm như map, filter, reduce… là ví dụ tiêu biểu cho HOF. Chúng đều là hàm nhận đối số là một hàm khác và áp dụng hàm đó lên một mảng hoặc các giá trị khác để thực hiện phép biến đổi nhất định.

Cách sử dụng

Bạn có thể ứng dụng HOF để tạo ra các hàm sử dụng linh hoạt cho riêng mình hoặc tạo ra hàm có thể tái sử dụng nhiều lần.

Một trong những trường hợp phổ biến sử dụng HOF là trong các hàm map, filter, reduce. Nếu bạn chưa biết công dụng của 3 hàm này thì tôi đã có một bài viết chi tiết tại Tại sao bạn nên sử dụng thành thạo bộ ba map, filter và reduce trong Javascript?.

Quay lại vấn đề, giả sử chúng ta có một mảng và cần áp dụng một phép toán vào tất cả phần tử trong đó thì chúng ta sử dụng map.

const arr = [1, 2, 3];
const arr2 = arr.map(function (item) {
  return item + 1;
});

map là một HOF vì nó nhận tham số là một hàm. Vì tham số là một hàm, chúng ta có thể viết lại đoạn mã trên một cách có tính tái sử dụng như sau:

const addOne = a => a + 1;

const arr = [1, 2, 3];
const arr2 = arr.map(addOne);

addOne là một hàm nhận vào một số a và trả ra a + 1. Vì thế sau này chúng ta có thể sử dụng addOne ở trong nhiều hàm map khác mà không phải mất công viết lại logic cộng.

Lợi ích của HOF

HOF mang lại khá nhiều lợi ích trong lập trình:

  • Tính tái sử dụng: HOF cho phép tạo ra các hàm linh hoạt và có tính tái sử dụng để giải quyết nhiều vấn đề khác nhau mà không cần phải viết lại cùng một đoạn code nhiều lần. Đồng thời, giảm sử lặp lại của mã.

  • Tách biệt dữ liệu và logic, đơn giản hóa việc viết mã: HOF cho phép tách biệt giữa dữ liệu và logic, giúp cho mã trở nên dễ đọc và dễ bảo trì hơn. Như ví dụ trên, thay vì đoán xem map đang làm nhiệm vụ gì thì chỉ cần nhìn vào tên hàm addOne thì đã có thể đoán ra một phần.

  • Nhiều hàm HOF được tạo ra để hỗ trợ lập trình. Ví dụ như các hàm map, filter… và rất nhiều hàm khác. Mục đích tạo ra chúng để giảm thời gian viết mã, vì nếu không có chúng thì bạn sẽ phải viết nhiều mã hơn để đạt cùng mục đích. Ngoài ra, còn nhiều hàm trong xử lý bất đồng bộ như Promise, async/await và các thư viện ứng dụng HOF để tạo ra hàm xử lý linh hoạt cho lập trình viên.

Bên cạnh những lợi ích, HOF có thể gây khó hiểu và khó tiếp cận cho người mới học JavaScript, vấn đề này có thể khắc phục theo thời gian. Ngoài ra, sử dụng quá nhiều hàm HOF có thể tạo ra một sự phức tạp nhất định trong đọc - hiểu mã, tiêu tốn tài nguyên hệ thống (mỗi hàm là một đối tượng được tạo ra), hoặc cho việc bảo trì sau này. Tuy nhiên, các điểm yếu này hoàn toàn có thể khắc phục được qua thời gian và kinh nghiệm của người lập trình.

Tổng kết

Higher-order functions (HOF) là các hàm có khả năng nhận đầu vào là các hàm hoặc đầu ra là một hàm. HOF được sử dụng rất nhiều trong lập trình JavaScript vì lợi ích mà nó mang lại. Tuy nhiên nó cũng gây ra nhiều vấn đề như hơi khó hiểu đối với người mới và khả năng bảo trì sau này.

hoặc
* Bản tin tổng hợp được gửi mỗi 1-2 tuần, huỷ bất cứ lúc nào.
Author

Xin chào, tôi tên là Hoài - một anh Dev kể chuyện bằng cách viết ✍️ và làm sản phẩm 🚀. Với nhiều năm kinh nghiệm lập trình, tôi đã đóng góp một phần công sức cho nhiều sản phẩm mang lại giá trị cho người dùng tại nơi đang làm việc, cũng như cho chính bản thân. Sở thích của tôi là đọc, viết, nghiên cứu... Tôi tạo ra trang Blog này với sứ mệnh mang đến những bài viết chất lượng cho độc giả của 2coffee.dev.Hãy theo dõi tôi qua các kênh LinkedIn, Facebook, Instagram, Telegram.

Bạn thấy bài viết này có ích?
Không

Bình luận (0)