0
0
Lập trình
Hưng Nguyễn Xuân 1
Hưng Nguyễn Xuân 1xuanhungptithcm

Nguyên Tắc Tương Tác Giữa Mẫu Thiết Kế và Lớp Kiến Trúc

Đăng vào 3 tuần trước

• 3 phút đọc

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 Copy
// 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 Copy
// 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 Copy
// 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?

  1. EmailNotificationDecorator - Thêm thông báo email vào các hoạt động của repository
    • Domain
    • Application
    • Infrastructure ✅
  2. OrderProcessingWorkflow - Phối hợp nhiều bước trong quy trình xử lý đơn hàng
    • Domain
    • Application ✅
    • Infrastructure
  3. 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 Copy
// 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?

  1. Bạn đã thấy mẫu này trong các dự án của mình chưa?
  2. Những ngoại lệ nào bạn đã gặp phải?
  3. 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! 🚀

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào