Khi code Go (Golang), ta có thể dùng mô hình hàm có tên ngắn gọn New()
để khởi tạo một struct. Mô hình này không nhất thiết bắt buộc, nhưng là một quy ước phổ biến trong cộng đồng Go. Ý tưởng là có một hàm có tên là New<Type>
trả về một con trỏ đến một object (instance) của loại tương ứng. Tuy nhiên theo mình, ta có thể tham khảo một pattern tốt hơn là Functional Options Pattern trong đó ta sẽ linh hoạt thay đổi dữ liệu khởi tạo của struct dựa vào hàm thay vì dùng hard-core dữ liệu. Mình sẽ viết về Functional Options Pattern ở bài kế tiếp.
Dưới đây là cách mô hình hàm New() thường hoạt động:
Xác định hàm New() cho cấu trúc: Hàm New() (trong ví dụ dưới sẽ là NewUser() sẽ nhận các tham số cần thiết để khởi tạo các trường của cấu trúc. Các tham số này có thể là các giá trị riêng lẻ hoặc là cấu trúc đại diện cho các tùy chọn cấu hình.
Tạo một phiên bản mới của cấu trúc: Bên trong hàm New(), hãy phân bổ và khởi tạo phiên bản cấu trúc. Thiết lập các trường của cấu trúc bằng cách sử dụng các tham số được cung cấp.
Trả về cấu trúc đã được khởi tạo: Trả về phiên bản cấu trúc mới được tạo từ hàm New(). Điều này cho phép người gọi sử dụng trực tiếp cấu trúc đã được khởi tạo.
Dưới đây là ví dụ về mô hình hàm New():
type User struct { Name string Email string Age int } func NewUser(name string, email string, age int) *User { user := &User{ Name: name, Email: email, Age: age, } return user } func main() { user := NewUser("John Doe", "johndoe@example.com", 30) fmt.Println(user.Name, user.Email, user.Age) }
Việc sử dụng mô hình hàm New()
mang lại nhiều lợi ích:
- Bao đóng: Hàm
New()
đóng gói logic khởi tạo cấu trúc, ẩn nó khỏi mã gọi. Điều này thúc đẩy việc tổ chức mã và giảm độ phức tạp trong mã chính. - Khả năng đọc: Bằng cách sử dụng hàm
New()
chuyên dụng, vị trí tạo các phiên bản mới của cấu trúc trở nên rõ ràng hơn, giúp mã dễ đọc và hiểu hơn. - Khả năng duy trì: Khi logic khởi tạo trở nên phức tạp hơn hoặc yêu cầu thêm các tùy chọn cấu hình, hàm
New()
có thể dễ dàng được sửa đổi để xử lý các thay đổi mà không ảnh hưởng đến mã gọi. - Tính nhất quán: Việc áp dụng mô hình hàm
New()
thúc đẩy tính nhất quán trên toàn bộ kho mã, giúp các nhà phát triển dễ dàng hiểu và đóng góp vào dự án hơn.
Tham khảo về Functional Options Pattern https://golang.cafe/blog/golang-functional-options-pattern.html