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.

Tin ngắn hàng ngày dành cho bạn
  • Hôm qua đến nay, lượt truy cập tới từ Facebook tăng đột biến. Thường như thế là do ai đó chia sẻ bài viết của blog vào một nhóm nào đó.

    Cơ mà lần này là liên kết trực tiếp đến trang chủ luôn. Tò mò ghê, không biết ai chia sẻ, chia sẻ ở đâu nữa. Muốn biết để tìm hiểu "insight" ghê 🥹

    » Xem thêm
  • Mình mới phát hiện ra thư viện idb-keyval giúp triển khai cơ sở dữ liệu dạng key-value một cách đơn giản. Như đã chia sẻ trong chuỗi bài viết về quá trình làm OpenNotas, mình loay hoay đi tìm một loại cơ sở dữ liệu để lưu trữ mà xem chừng vất vả quá, cuối cùng chốt localForage.

    idb-keyval cũng tương tự như localForage nhưng có vẻ như nó đang làm tốt hơn một chút. Đơn cử là có hàm update để cập nhật dữ liệu, hình dung đơn giản là:

    update('counter', (val) => (val || 0) + 1);

    Chứ không như hàm set là thay thế dữ liệu mất tiêu luôn.

    » Xem thêm
  • Đầu xuân năm mới, xin phép khoe số tiền kiếm được sau 1 tháng đặt quảng cáo tại indieboosting.com 🥳🥳🥳

    » Xem thêm

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.

Cao cấp
Hello

Tôi & khao khát "chơi chữ"

Bạn đã thử viết? Và rồi thất bại hoặc chưa ưng ý? Tại 2coffee.dev chúng tôi đã có quãng thời gian chật vật với công việc viết. Đừng nản chí, vì giờ đây chúng tôi đã có cách giúp bạn. Hãy bấm vào để trở thành hội viên ngay!

Bạn đã thử viết? Và rồi thất bại hoặc chưa ưng ý? Tại 2coffee.dev chúng tôi đã có quãng thời gian chật vật với công việc viết. Đừng nản chí, vì giờ đây chúng tôi đã có cách giúp bạn. Hãy bấm vào để trở thành hội viên ngay!

Xem tất cả

Đăng ký nhận thông báo bài viết mới

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.

Bình luận (0)

Nội dung bình luận...
Bấm hoặc cuộn mạnh để sang bài mới