Nội dung bài viết
Video học lập trình mỗi ngày
Mục đích của bài này giúp các bạn có thể hiểu được về Stratery parttern js là gì?, sử dụng trong những tình huống nào? Và dùng Stratery parttern như thế nào ?
Và đây là một trong series design parttern mà tôi muốn giới thiệu cho các bạn.
Design Pattern
Tôi có làm một số tài liệu về Design Pattern. Nếu bạn không có thời gian thì tôi có thể tóm tắt nhanh, nhưng tôi vẫn khuyên bạn nên đọc kỹ hơn nếu bạn nghiêm túc với ngành lập trình của mình. Đầu tiên tôi muốn nói là không có ngôn ngữ lập trình nào là hoàn hảo, vì những sai sót vốn có của nó nên những lập trình viên phải tìm kiếm và đúc kết ra một giải pháp chung. Cho đến nay, ông cha ta cũng đã đúc kết được giải pháp chung này và Design Pattern (mẫu thiết kế ) đã ra đời. Nó tuân theo những quy tắc trong khái niệm SOLID pattern, bạn có thể đọc thêm ở link đính kèm.
Từ đó có nhiều tình huống được giải quyết dễ dàng hơn. Trong đó có tình huống sử dụng Stratery Pattern áp dụng trong Ecommerce microservices.
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ó getPrice
ngà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
Kết luận
Tôi không thể kết luận điều gì vì nó thật sự quá rõ ràng cho mọi level trong lập trình. Tôi chỉ muốn bạn biết rằng đây là một trong series design Pattern mà tôi muốn giới thiệu cho các bạn.
Chúc thành công và chắc chắn là viết lách không hề đơn giản, một bài viết hoàn thành trong vài giờ thậm chí vài ngày của tác giả sẽ chỉ đổi lại vài giây lượt like & share từ bạn .