Currying, một kỹ thuật lập trình hàm thú vị, cho phép biến đổi hàm nhiều tham số thành chuỗi các hàm đơn giản hơn. Hãy cùng tìm hiểu cách thức hoạt động và lợi ích của Currying, cũng như ứng dụng thực tế của nó trong JavaScript.
Currying là gì?
Currying là một phương pháp biến đổi hàm nhiều tham số thành một chuỗi các hàm, mỗi hàm chỉ nhận một tham số duy nhất. Hãy tưởng tượng việc thưởng thức bữa ăn từng món một thay vì tất cả cùng lúc.
Currying mang lại nhiều lợi ích thiết thực cho việc lập trình. Tính năng nổi bật nhất chính là khả năng tái sử dụng. Bạn có thể tạo ra các phiên bản hàm chuyên biệt từ một hàm gốc. Ngoài ra, Currying còn giúp tăng tính dễ đọc, làm cho code gọn gàng và có tính module hơn. Chính vì những ưu điểm này mà Currying rất được ưa chuộng trong lập trình hàm.
Cùng xem xét một số ví dụ
Chúng ta hãy cùng xem xét một số ví dụ sau:
Ví dụ cơ bản:
// Normal function
function add(a, b) { return a + b;
}
console.log(add(2, 3)); // 5 // Curried version
function curriedAdd(a) { return function (b) { return a + b; };
}
console.log(curriedAdd(2)(3)); // 5
Như vậy, curriedAdd(2) sẽ tạo ra một hàm mới có thể cộng 2 với bất kỳ số nào.
const add2 = curriedAdd(2);
console.log(add2(5)); // 7
console.log(add2(10)); // 12
Currying với các hàm mũi tên:
Ai lại không thích các hàm mũi tên ngắn gọn và rõ ràng chứ?
const multiply = (a) => (b) => a * b; console.log(multiply(3)(4)); // 12 // Make a multiplier of 3
const triple = multiply(3);
console.log(triple(5)); // 15
console.log(triple(10)); // 30
Ví dụ thực tế:
Hãy tưởng tượng một chức năng lọc cho ứng dụng mua sắm:
const filterByCategory = (category) => (product) => product.category === category; const products = [ { name: "Shoes", category: "Fashion" }, { name: "Laptop", category: "Electronics" }, { name: "T-shirt", category: "Fashion" },
]; const isFashion = filterByCategory("Fashion"); console.log(products.filter(isFashion));
// Output: [ { name: "Shoes", category: "Fashion" }, { name: "T-shirt", category: "Fashion" } ]
Phân tích các vấn đề phức tạp:
Phương pháp Currying giúp chia nhỏ vấn đề thành nhiều phần nhỏ hơn, dễ quản lý hơn.
const greet = (greeting) => (name) => `${greeting}, ${name}!`; const sayHello = greet("Hello");
console.log(sayHello("Alice")); // Hello, Alice!
console.log(sayHello("Bob")); // Hello, Bob! const sayGoodMorning = greet("Good Morning");
console.log(sayGoodMorning("Charlie")); // Good Morning, Charlie!
Currying nâng cao với các chức năng tiện ích
Bạn không muốn tạo hàm curry thủ công? Hãy viết một hàm trợ giúp:
const curry = (fn) => (...args) => args.length >= fn.length ? fn(...args) : curry(fn.bind(null, ...args)); // Example:
const sum = (a, b, c) => a + b + c;
const curriedSum = curry(sum); console.log(curriedSum(1)(2)(3)); // 6
console.log(curriedSum(1, 2)(3)); // 6
console.log(curriedSum(1)(2, 3)); // 6
Hy vọng các bạn sẽ thấy bài viết này hữu ích!