0
0
Lập trình
Harry Tran
Harry Tran106580903228332612117

Tìm Hiểu Về Currying Trong JavaScript: Lý Thuyết và Ứng Dụng Hiệu Quả

Đăng vào 4 tháng trước

• 4 phút đọc

Chủ đề:

Javascript

Tìm Hiểu Về Currying Trong JavaScript: Lý Thuyết và Ứng Dụng Hiệu Quả

Bạn đã bao giờ nghe đến thuật ngữ Currying trong JavaScript và không biết nó có nghĩa là gì? Bài viết này sẽ khám phá khái niệm Currying qua các ví dụ dễ hiểu và minh họa cách áp dụng nó vào thực tiễn lập trình nhằm tối ưu hóa mã nguồn.

Currying Là Gì?

Currying là một kỹ thuật lập trình hàm cho phép một hàm nhận từng đối số của nó một cách riêng biệt thay vì truyền tất cả cùng một lúc. Một hàm được thực hiện theo kỹ thuật Currying sẽ trả về một hàm con khác, hàm này nhận tham số tiếp theo cho đến khi tất cả các đối số đã được cung cấp. Nói cách khác, Currying chuyển đổi một hàm với nhiều đối số thành một chuỗi các hàm, mỗi hàm nhận một đối số.

Hãy cùng tìm hiểu về Currying thông qua một ví dụ thực tế.

Ví Dụ: Làm Một Chiếc Bánh Mì Kẹp Thịt

Khi bạn gọi một chiếc bánh mì kẹp thịt tại một quán ăn nhanh, một đầu bếp sẽ chuẩn bị nó theo từng lớp:

  • Lớp 1: Bánh mì (đối số đầu tiên).
  • Lớp 2: Miếng thịt (đối số thứ hai).
  • Lớp 3: Lớp phủ (đối số thứ ba).

Chúng ta sẽ viết code cho kịch bản này bằng cách sử dụng cả hàm thông thường và hàm Curried.

1. Sử Dụng Hàm Thông Thường:

Khi sử dụng hàm thông thường, tất cả các thành phần được truyền vào cùng một lúc dưới dạng đối số.

javascript Copy
function makeBurger(bun, patty, topping) {
    return `Bánh mì của bạn có: ${bun} bánh mì, ${patty} thịt, và ${topping} lớp phủ.`;
}

const myBurger = makeBurger("Bánh Mì Vừng", "Thịt Nấm", "Phô Mai");
console.log(myBurger); // Kết quả: Bánh mì của bạn có: Bánh Mì Vừng bánh mì, Thịt Nấm thịt, và Phô Mai lớp phủ.

2. Sử Dụng Hàm Curried:

Với hàm Curried, bạn sẽ truyền từng thành phần một.

javascript Copy
function makeBurgerCurried(bun) {
    return function (patty) {
        return function (topping) {
            return `Bánh mì của bạn có: ${bun} bánh mì, ${patty} thịt, và ${topping} lớp phủ.`;
        };
    };
}

const chooseBun = makeBurgerCurried("Bánh Mì Vừng");
const choosePatty = chooseBun("Thịt Nấm");
const myCurriedBurger = choosePatty("Phô Mai");

console.log(myCurriedBurger); // Kết quả: Bánh mì của bạn có: Bánh Mì Vừng bánh mì, Thịt Nấm thịt, và Phô Mai lớp phủ.

3. Giải Thích Cụ Thể:

  • Lần gọi thứ nhất: makeBurgerCurried("Bánh Mì Vừng") nhận "Bánh Mì Vừng" và trả về một hàm mới chờ nhận patty.
  • Lần gọi thứ hai: chooseBun("Thịt Nấm") nhận "Thịt Nấm" và trả về một hàm khác chờ nhận topping.
  • Lần gọi thứ ba: choosePatty("Phô Mai") nhận "Phô Mai" và hoàn thành chuỗi hàm, trả về mô tả bánh mì cuối cùng.

Sử Dụng Hàm Mũi Tên Để Rút Gọn Currying

Bạn có thể rút gọn định nghĩa hàm Curried bằng cách sử dụng hàm mũi tên:

javascript Copy
const curriedArrowFunction = (bun) => (patty) => (topping) =>
    `Bánh mì của bạn có: ${bun} bánh mì, ${patty} thịt, và ${topping} lớp phủ.`;

const myArrowFunction = curriedArrowFunction("Bánh Mì Vừng")("Thịt Nấm")("Phô Mai");
console.log(myArrowFunction); // Bánh mì của bạn có: Bánh Mì Vừng bánh mì, Thịt Nấm thịt, và Phô Mai lớp phủ.

Lợi Ích Của Currying

Currying đặc biệt hữu ích khi bạn cần tái sử dụng một hàm với các đối số cụ thể. Nó giúp nâng cao tính tái sử dụng mã, khả năng đọc và tính module.

Ứng Dụng Thực Tế: Tính Toán Giảm Giá

Trong trường hợp bạn phát triển một nền tảng thương mại điện tử, việc giảm giá có thể được tính theo loại khách hàng:

  • Khách hàng thường giảm 10%.
  • Khách hàng Premium giảm 20%.

1. Sử Dụng Hàm Thông Thường:

Hàm thông thường có thể dẫn đến mã không linh hoạt và khó tái sử dụng:

javascript Copy
function calculateDiscount(customerType, price) {
    if (customerType === "Regular") {
        return price * 0.9; // Giảm giá 10%
    } else if (customerType === "Premium") {
        return price * 0.8; // Giảm giá 20%
    }
}

console.log(calculateDiscount("Regular", 100)); // Kết quả: 90
console.log(calculateDiscount("Premium", 100)); // Kết quả: 80

2. Sử Dụng Hàm Curried:

Với Currying, bạn có thể tạo các hàm tái sử dụng cho từng loại khách hàng:

javascript Copy
function createDiscountCalculator(discountRate) {
    return function (price) {
        return price * (1 - discountRate);
    };
}

const regularDiscount = createDiscountCalculator(0.1); // Giảm giá 10%
const premiumDiscount = createDiscountCalculator(0.2); // Giảm giá 20%

console.log(regularDiscount(100)); // Kết quả: 90
console.log(premiumDiscount(100)); // Kết quả: 80
console.log(regularDiscount(200)); // Kết quả: 180

Kết Luận

Currying có thể gây nhầm lẫn lúc đầu, nhưng như đã thấy, đây là một kỹ thuật mạnh mẽ giúp đơn giản hóa quy trình tạo hàm và làm cho mã nguồn của bạn trở nên rõ ràng hơn và dễ tái sử dụng. Giờ đây, khi bạn đã nắm rõ khái niệm này, hãy thử áp dụng Currying vào dự án tiếp theo của bạn để trải nghiệm những lợi ích mà nó mang lại.
source: viblo

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào