Các design pattern cần biết khi làm việc với NestJS
Một số design patterns chính đang được sử dụng bởi NestJS mà bạn cần nắm rõ để làm việc với NestJS hiệu quả hơn.
Thiết kế kiến trúc Test - Driven Development (TDD) cho dự án với NestJS
NestJS tổng hợp hàng tá các design patterns (DP) khác nhau trong kiến trúc của mình. Có một số DP cũng khá là quen thuộc với mọi người đấy ^_^.
Singleton
Singleton là một trong những DP nổi tiếng nhất trong giới lập trình. Về cơ bản, bạn sẽ sử dụng DP này khi bạn cần giới hạn lại số lượng instances của một class nào đó.
Việc khởi tạo cũng khá đơn giản.
- Tạo một class với
private constructor()
. - Khai báo một phương thức
static
. Phương thức này sẽ tạo mới instance nếu chưa tồn tại, sau đó sẽ trả về một instance của class.
DP này thường được sử dụng trong một số DP khác như Abstract Factory Pattern hoặc Builder Pattern. Bạn cũng có thể sử dụng nó trong Facades Pattern - đảm bảo chỉ duy nhất 1 class được khởi tạo lúc runtime.
class MySingleton {
private static instance: MySingleton
private constructor() {}
static instance() {
if (!this.instance) {
this.instance = new MySingleton()
}
return this.instance
}
}
console.log(MySingleton.instance() === MySingleton.instance()) // true
new MySingleton() // throw exception
Fluent Interface
Rất thường được sử dụng trong một số ORM như TypeORM, Sequelize,...
Lợi ích chủ yếu của nó là giúp code của bạn dễ đọc, dễ hiểu, cũng như liền mạch hơn.
Cách triển khai cũng khá đơn giản. Ví dụ bạn có một class kèm theo một số methods khác nhau. Lúc này, các methods builder bạn sẽ return this
sau khi thực hiện logic - điều này giúp bạn có thể tiếp tục chuỗi phương thức mà không cần sang dòng code mới. Chuỗi phương thức sẽ kết thúc khi chạm tới một method không return this
.
class Pet {
private _type: string | null
private _name: string | null
private _age: number | null
private _legs: number | null
type(value: string) {
this._type = value
return this
}
name(value: string) {
this._name = value
return this
}
age(value: number) {
this._age = value
return this
}
legs(value: number) {
this._legs = value
return this
}
getInfo(): string {
return `Your ${this._type} ${this._name} - ${this._age} year(s) old - has ${this._legs} legs`
}
}
const newPet = new Pet().type('dog').name('Mina').age(3).legs(4)
console.log(newPet.getInfo()) // Your dog Mina - 3 year(s) old - has 4 legs
Nếu bạn không dùng Fluent Interface thì bạn sẽ phải gọi tuần tự trên từng dòng
const newPet = new Pet()
newPet.type('dog')
newPet.name('Mina')
newPet.age(3)
newPet.legs(4)
Đọc thôi là thấy mệt rồi đó ^.~
MVC - Model View Controller
DP này quá nổi tiếng rồi. Về cơ bản là nó chia ứng dụng thành 3 phần:
- Model chịu trách nhiệm xử lý business logic, thao tác dữ liệu...
- View chịu trách nhiệm xử lý và hiển thị nội dung cho client.
- Controller chịu trách nhiệm tiếp nhận request và điều hướng xuống Model xử lý logic, sau đó đem kết quả từ Model truyền sang View.
Bạn có thể tham khảo chi tiết về mô hình này qua bài viết này của mình https://duypt.dev/laravel-va-mau-thiet-ke-hmvc.