Stratery parttern sử dụng như thế nào? và vì sao sử dụng?

Như các bài viết trước, tôi kể cho bạn câu chuyện kèm theo code, vì phong cách của tôi muốn sự đơn giản cho mọi vấn đề.

Trong eCommerce mà tôi đã build được triển khai trong aliconcon microservices thì chúng ta luôn có module là hàng giảm giá. Thì chúng được triển khai như thế nào trong từng giai đoạn.

  • Thời gian dài trước đây khi chưa có Design Pattern

Trước đây khi chưa bùng nổ khái niệm Thương Mại Điện Tử (TMĐT) như bây giờ thì, chúng ta triển khai một function return price như thế này:

function getPrice(originalPrice, typePromotion === 'default') {
    // Thời xưa chưa có marketing như bây giờ.
    if (typePromotion === 'default') {
        return originalPrice;
    }
    //
}
  • Cuộc sống hàng ngày hiện đại hơn

Khi sàn TMĐT phát triển hơn trong những năm tiếp theo thì việc đưa ra những lượt giảm giá để kích thích người tiêu dùng ví dụ dưới đây là Giảm giá khi người dùng đặt trước một sản phẩm của VINFAST, thì những lập trình viên sẽ triển khai như sau:

function getPrice(originalPrice, typePromotion = 'default') {
    // Giảm giá khi người dùng đặt trước một sản phẩm của VINFAST 
    if (typePromotion === "preOrder") {
        return originalPrice * 0.2; // giảm 20%
    } // Ở giai đoạn này nếu như bạn đã biết về SOLID thì nó đã phá vỡ nguyên tắc đầu tiên. Đó là Nguyên tắc trách nhiệm duy nhất.

    // Tiếp tục thêm tính năng khuyễn mãi thông thường, ví dụ Nếu giá gốc < 200 thì giảm 10%, còn > thì giảm tối đa 30
    if (typePromotion === "promotion") {
        return origialPrice <= 200 ?  origialPrice * 0.1 : originalPrice - 30;
    }
    // Rồi 

    // Thời xưa chưa có marketing như bây giờ.
    if (typePromotion === 'default') {
        return originalPrice;
    }
}

console.log('-->>>',  getPrice(200,  'blackFriday'))

Thật tồi tệ khi chuẩn bị đến ngày Back friday thì bạn cảm thấy thế nào? Vì nếu trong qua trình thêm một loại typePromotion = 'black-friday' thì phải làm sao? Nếu như vẫn giữ cách cũ thì bạn sẽ thực hiện như sau:

function getPrice(originalPrice, typePromotion === 'default') {
    // Giảm giá khi người dùng đặt trước một sản phẩm của VINFAST 
    if (typePromotion === "preOrder") {
        return originalPrice * 0.2; // giảm 20%
    } // Ở giai đoạn này nếu như bạn đã biết về SOLID thì nó đã phá vỡ nguyên tắc đầu tiên. Đó là Nguyên tắc trách nhiệm duy nhất.

    // Tiếp tục thêm tính năng khuyễn mãi thông thường, ví dụ Nếu giá gốc < 200 thì giảm 10%, còn > thì giảm tối đa 30
    if (typePromotion === "promotion") {
        return origialPrice <= 200 ?  origialPrice * 0.1 : originalPrice - 30;
    }
    // Đến ngày blackFriday promotion
    if (typePromotion === "blackFriday") {
        return origialPrice <= 200 ?  origialPrice * 0.2 : originalPrice - 50;
    }

    // Thời xưa chưa có marketing như bây giờ.
    if (typePromotion === 'default') {
        return originalPrice;
    }
}
  • Cho đến một ngày chúng tôi đã nghĩ ra một phương pháp mới.

Nếu như các bạn tiếp cận cách ở trên thì việc bất cứ khi nào chiết khấu được tăng hoặc giảm, chức năng cần được thay đổi. Việc làm này vi phạm nguyên tắc đóng mở (mở để gia hạn, đóng để sửa đổi). Việc sửa đổi chức năng hiện có dễ phát sinh các lỗi mới và khiến nó getPricengày càng trở nên cồng kềnh hơn.

Chúng tôi đã thay đổi hoàn toàn code và sử dụng một trong 23 Design parttern đó là sử dụng Stratery Pattern và chúng tôi đã sử dụng như thế nào, hãy xem tiếp:

/**
 * Giảm giá khi người dùng đặt trước một sản phẩm của VINFAST 
 * @param {*} originalPrice
 * @returns
 */
function preOrderPrice(originalPrice) {
    return originalPrice * 0.2;
}
/**
 * Tiếp tục thêm tính năng khuyễn mãi thông thường, ví dụ Nếu giá gốc < 200 thì giảm 10%, còn > thì giảm tối đa 30
 * @param {*} originalPrice
 * @returns
 */
function promotionPrice(originalPrice) {
    return originalPrice <= 200 ?  originalPrice * 0.1 : originalPrice - 30;
}
/**
 * Đến ngày blackFriday promotion
 * @param {*} originalPrice
 * @returns
 */
function blackFridayPrice(originalPrice) {
    return originalPrice <= 200 ?  originalPrice * 0.2 : originalPrice - 50;
}
/**
 * Giá mặc định
 * @param {*} originalPrice
 * @returns
 */
function defaultPrice(originalPrice) {
    return originalPrice;
}

// Và chúng ta sẽ sửa đổi lại như sau:
function getPrice(originalPrice, typePromotion) {
    if (typePromotion === "preOrder") {
        return preOrderPrice(originalPrice);
    }

    if (typePromotion === "promotion") {
        return promotionPrice(originalPrice);
    }

    if (typePromotion === "blackFriday") {
        return blackFridayPrice(originalPrice);
    }

    if (typePromotion === "default") {
        return defaultPrice(originalPrice);
    }
}

// Nhưng nếu như ở video trước học về IF ELSE thì chúng ta không nên làm như vậy, thay vò sử dung if thì chúng ta nên sử dụng strategy parrtenr ở đây?
const getPriceStrategies = {
    preOrder: preOrderPrice,
    promotion: promotionPrice,
    blackFriday: blackFridayPrice,
    default: defaultPrice,
}

// Kết hợp trạng thái với chiến lược chiết khấu, hàm giá có thể được tối ưu hóa như sau:
function getPrice(originalPrice, typePromotion) {
    return getPriceStrategies[typePromotion](originalPrice);
}

console.log('-->>>',  getPrice(200,  'blackFriday'))
  • Vì chúng tôi đã thay đổi vấn đề này và nhận thấy rằng Phương pháp của chúng tôi tốt hơn phương pháp trước đây. Do đó Chúng tôi đã hạn chế được việc phát triển phức tạp và nếu có thêm loại giảm giá nữa thì cũng không thành vấn đề, đồng thời sẽ hạn chế lỗi khi thêm tính năng nhờ vào sử dụng javascript Pattern

Nguồn: https://anonystick.com/blog-developer/den-ngay-black-friday-toi-da-su-dung-stratery-parttern-js-hieu-qua-nhu-the-nao-ecommerce-aliconcon-series-design-pattern-202208277030899

Related Post

Leave a Reply

Your email address will not be published. Required fields are marked *