Blog#53: Design Patterns: Builder Pattern trong TypeScript 😊 (Series: Bón hành TypeScript – PHẦN 3)

Mình là TUẤN hiện đang là một Full-stack Web Developer tại Tokyo 😊. Nếu bạn thấy Blog này hay xin hãy cho mình một like và đăng ký để ủng hộ mình nhé 😉. Cách sử dụng Builder Pattern bằng TypeScript để giải quyết các vấn đỠthực tế trong các project web. Làm chủ

image.png

Mình là TUẤN hiện đang là một Full-stack Web Developer tại Tokyo 😊.
Nếu bạn thấy Blog này hay xin hãy cho mình một like và đăng ký để ủng hộ mình nhé 😉.

Cách sử dụng Builder Pattern bằng TypeScript để giải quyết các vấn đỠthực tế trong các project web. Làm chủ Builder Pattern sẽ giúp bạn dễ dàng xử lý việc tạo các đối tượng.

Chào mừng bạn đến với loạt bài Design Patterns trong TypeScript, loạt bài này mình sẽ giới thiệu một số Design Patterns hữu ích trong phát triển web bằng TypeScript.

Các Design Patterns rất quan trá»ng đối vá»›i các web developer và chúng ta có thể code tốt hÆ¡n bằng cách thành thạo chúng. Trong bài viết này, mình sẽ sá»­ dụng TypeScript để giá»›i thiệu Builder Pattern.

Builder Pattern

Builder Pattern phân tách một đối tượng phức tạp thành các phần tương đối đơn giản, sau đó tạo chúng một cách riêng biệt theo các nhu cầu khác nhau và cuối cùng là xây dựng đối tượng phức tạp.

Vậy làm thế nào để hiểu rõ hơn vỠvai trò của Builder Pattern? Hãy thử lấy một ví dụ:

classUser{constructor(public username: string,public sex: string,public age: number,public photo: string,public email: string){}}

Trong đoạn code trên, chúng ta đã sử dụng cú pháp Class để định nghĩa một lớp User, với Class này, chúng ta có thể tạo một instance của lớp User:

const bytefer =newUser("Bytefer","male",30,"https://***.com/**","bytefer@gmail.com");

Äối vá»›i Ä‘oạn code trên, mặc dù chúng ta có thể tạo thành công má»™t instance của lá»›p User. NhÆ°ng trong quá trình tạo các instance, chúng ta cần chú ý đến kiểu và thứ tá»± của các tham số constructor của lá»›p User. Äồng thá»i, chúng ta cÅ©ng cần truyá»n đủ tham số cùng má»™t lúc để xây dá»±ng má»™t instance của lá»›p User.

Äể giải quyết vấn Ä‘á» trên, má»™t giải pháp là sá»­ dụng Design Patterns. Chìa khóa của Patterns này là phân tách má»™t đối tượng phức tạp thành các phần tÆ°Æ¡ng đối Ä‘Æ¡n giản, sau đó tạo chúng riêng biệt theo các nhu cầu khác nhau và cuối cùng là xây dá»±ng đối tượng phức tạp.

Sau khi hiểu các thông tin chính ở trên, hãy định nghĩa một lớp UserBuilder:

classUserBuilder{public username!: string;public sex!: string;public age!: number;public photo!: string;public email!: string;setUserName(name: string){this.username = name;returnthis;}setSex(sex: string){this.sex = sex;returnthis;}setAge(age: number){this.age = age;returnthis;}setPhoto(photo: string){this.photo = photo;returnthis;}setEmail(email: string){this.email = email;returnthis;}build(){returnnewUser(this.username,this.sex,this.age,this.photo,this.email);}}

Trong lớp UserBuilder, chúng ta định nghĩa một số hàm setXXX và một hàm build. Phương thức setXXX được sử dụng để đặt value cho một Properties của UserBuilder instance và hàm build được sử dụng để thực hiện thao tác tạo một instance của lớp User.

Với lớp UserBuilder, chúng ta có thể tạo một instance của lớp User theo cách sau:

const bytefer =newUserBuilder().setAge(30).setSex("male").setEmail("bytefer@gmail.com").setPhoto("https://***.com/**").setUserName("Bytefer").build();

HÔ HÔ nhìn quen quen nhỉ chắc ae cũng đã thấy cách tạo Object này ở đâu đó rồi đúng ko.

Tiếp theo, mình sẽ sử dụng hình bên dưới để hiển thị các cách khác nhau để tạo một instance của class User:

image.png

Sau khi Ä‘á»c ví dụ trên, bạn sẽ thấy rằng Builder Pattern không há» phức tạp đúng ko. Trong má»™t project TypeScript thá»±c tế, chúng ta có thể sá»­ dụng thÆ° viện Builder Pattern để áp dụng Builder Pattern má»™t cách hiệu quả. Có sẵn hết rồi dùng thôi tuy nhiên vẫn câu nói cÅ©ng dùng mà hiểu thì vẫn sÆ°á»›ng hÆ¡n dùng mà ko hiểu. Phải bón hành cho tụi này luôn chứ….

Sử dụng cơ bản

interfaceUserInfo{
  id: number;
  userName: string;
  email: string;}const userInfo = Builder<UserInfo>().id(28).userName('bytefer').email('bytefer@gmail.com').build();

Cách sử dụng với các đối tượng mẫu (template objects)

const defaultUserInfo: UserInfo ={
  id:1,
  userName:'bytefer',
  email:'bytefer@gmail.com'};const modifiedUserInfo =Builder(defaultUserInfo).id(28).build();

Cách sử dụng với class object

classUserInfo{
  id!: number;
  userName!: string;
  email!: string;}const userInfo =Builder(UserInfo).id(28).userName('bytefer').email('bytefer@gmail.com').build();

Sau khi Ä‘á»c ba ví dụ sá»­ dụng ở trên, bạn thấy đó thÆ° viện Builder Pattern khá mạnh mẽ. Trên thá»±c tế, thÆ° viện được implement dá»±a trên ES6 Proxy API. Nếu bạn quan tâm thì có thể Ä‘á»c source code của nó.

Trong trÆ°á»ng hợp truy vấn dữ liệu, chúng ta thÆ°á»ng thấy Builder Pattern. Ví dụ: để xây dá»±ng các Ä‘iá»u kiện truy vấn sql hoặc elaticsearch.
Ở đây chúng ta lấy thư viện bodybuilder làm ví dụ để xem cách sử dụng cơ bản của nó:

bodybuilder().query('match','message','this is a test').filter('term','user','kimchy').filter('term','user','herald').orFilter('term','user','johnny').notFilter('term','user','cassie').aggregation('terms','user').build()

Má»™t số trÆ°á»ng hợp sá»­ dụng của Builder Pattern:

  • Khi má»™t lá»›p có nhiá»u hÆ¡n 4 tham số constructor và má»™t số tham số này là tùy chá»n, hãy cân nhắc sá»­ dụng Builder Pattern (Hoặc má»™t pattern nào đó trong bá»™ Constructor pattern mình sẽ giá»›i thiệu trong các bài viết sau).

Roundup

NhÆ° má»i khi, mình hy vá»ng bạn thích bài viết này và há»c thêm được Ä‘iá»u gì đó má»›i.

Cảm Æ¡n và hẹn gặp lại các bạn trong những bài viết tiếp theo! ðŸ˜

Nếu bạn thấy Blog này hay xin hãy cho mình một like và đăng ký để ủng hộ mình nhé. Thank you.😉

Ref

Nguồn: viblo.asia

Bài viết liên quan

Thay đổi Package Name của Android Studio dể dàng với plugin APR

Nếu bạn đang gặp khó khăn hoặc bế tắc trong việc thay đổi package name trong And

Lỗi không Update Meta_Value Khi thay thế hình ảnh cũ bằng hình ảnh mới trong WordPress

Mã dÆ°á»›i đây hoạt Ä‘á»™ng tốt có 1 lá»—i không update được postmeta ” meta_key=

Bài 1 – React Native DevOps các khái niệm và các cài đặt căn bản

HÆ°á»›ng dẫn setup jenkins agent để bắt đầu build mobile bằng jenkins cho devloper an tÃ

Chuyển đổi từ monolith sang microservices qua ví dụ

1. Why microservices? Microservices là kiến trúc hệ thống phần má»m hÆ°á»›ng dịch vụ,