Nguyên Tắc Tương Tác Giữa Mẫu Thiết Kế và Lớp Kiến Trúc
Chào các bạn lập trình viên! 👋 Bạn có bao giờ tự hỏi: "Mẫu Factory này nên nằm trong lớp Domain hay lớp Infrastructure?"
Sau nhiều năm làm việc với kiến trúc lớp, tôi nhận thấy một mô hình tự nhiên mà các mẫu thiết kế thuộc về. Hãy cùng tìm hiểu về Nguyên Tắc Tương Tác Giữa Mẫu Thiết Kế và Lớp Kiến Trúc!
🔍 Vấn Đề: Sự Hỗn Loạn Của Các Mẫu Thiết Kế
Chúng ta đã từng thấy mẫu anti-pattern này:
🎯 Khoảnh Khắc Aha: Sự Tương Tác Tự Nhiên
Có một sự tương ứng đẹp giữa các danh mục mẫu GoF và các lớp phần mềm:
🏗️ Khám Phá Sâu Hơn Với Ví Dụ C#
1. ✅ Các Mẫu Tạo Thể Trong Lớp Domain
Tại sao? Bởi vì việc tạo đối tượng thường liên quan đến quy tắc kinh doanh và kiến thức miền.
csharp
// Ví dụ về mẫu Factory trong lớp Domain
public class UserFactory
{
public User Create(string name, string email)
{
// Thêm quy tắc kinh doanh ở đây
return new User(name, email);
}
}
2. ✅ Các Mẫu Hành Vi Trong Lớp Ứng Dụng
Tại sao? Bởi vì lớp ứng dụng phối hợp hành vi và quy trình làm việc.
csharp
// Ví dụ về mẫu Command trong lớp Application
public class SendOrderCommand
{
public void Execute(Order order)
{
// Thực hiện quy trình gửi đơn hàng
}
}
3. ✅ Các Mẫu Cấu Trúc Trong Lớp Infrastructure
Tại sao? Bởi vì hạ tầng xử lý việc thực hiện kỹ thuật và tích hợp.
csharp
// Ví dụ về mẫu Adapter trong lớp Infrastructure
public class EmailServiceAdapter
{
public void SendEmail(string to, string subject, string body)
{
// Gọi dịch vụ email bên ngoài
}
}
🎯 Quiz Tương Tác: Đặt Mẫu Ở Đâu?
Bạn sẽ đặt các mẫu này ở đâu?
EmailNotificationDecorator- Thêm thông báo email vào các hoạt động của repository- Domain
- Application
- Infrastructure ✅
OrderProcessingWorkflow- Phối hợp nhiều bước trong quy trình xử lý đơn hàng- Domain
- Application ✅
- Infrastructure
ProductBuilder- Xây dựng các đối tượng sản phẩm phức tạp với xác thực- Domain ✅
- Application
- Infrastructure
📊 Lợi Ích Của Cách Tiếp Cận Này
1. Kiến Trúc Sạch Hơn
2. Đánh Giá Mã Dễ Hơn
Giờ đây, bạn có thể nói:
"Mẫu Decorator này nên nằm trong Infrastructure, không phải Domain, vì đây là mẫu cấu trúc."
3. Dễ Dàng Hòa Nhập
Những lập trình viên mới sẽ có một mô hình tư duy:
"Cần một Factory? Điều đó thuộc lớp Domain."
⚠️ Ngoại Lệ Và Nuanes
Tất nhiên, kiến trúc phần mềm không phải lúc nào cũng rõ ràng:
- Domain Events có thể sử dụng mẫu Observer trong lớp Domain
- Mẫu Composite có thể nằm trong Domain (gói sản phẩm) hoặc Infrastructure (cấu trúc cây)
- Mẫu Bridge có thể trải dài giữa Application và Infrastructure
🚀 Ứng Dụng Thực Tế
Danh Sách Kiểm Tra Refactoring:
- Di chuyển các mẫu tạo thể vào lớp Domain
- Di chuyển các mẫu hành vi vào lớp Application
- Di chuyển các mẫu cấu trúc vào lớp Infrastructure
- Cập nhật các import và phụ thuộc
- Xác minh rằng các ranh giới lớp được tôn trọng
Mẫu Dự Án Mới:
plaintext
// Cấu trúc dự án mới với ranh giới lớp rõ ràng
💬 Hãy Thảo Luận!
Bạn nghĩ sao?
- Bạn đã thấy mẫu này trong các dự án của mình chưa?
- Những ngoại lệ nào bạn đã gặp phải?
- Bạn có không đồng ý với bất kỳ sự phân loại nào trong số này không?
Chia sẻ kinh nghiệm của bạn trong phần bình luận! 👇
Theo dõi tôi để có thêm nhiều thông tin hữu ích về kiến trúc! 🚀