Ranh giới giữa Core và Infrastructure Code

Trong thực tế, không phải lúc nào cũng rõ 100% đoạn code nào là core hay infra - đôi khi ranh giới mờ nhạt. Vài nguyên tắc giúp định danh:

🧭 Các nguyên tắc phân định

  • Core thường nằm ở domain & application logic: các class nghiệp vụ, use case thuần logic. Chúng có thể dùng Value Object (Money, DateRange) để tránh phụ thuộc kiểu nguyên thủy.
  • Infra thường nằm ở lớp ngoài cùng: Controller, Repository implementation, Gateway, Provider của framework. Cố gắng giới hạn chúng ở rìa, không để “rò rỉ” vào domain.
  • Đừng phụ thuộc vào vị trí thư mục, hãy phụ thuộc vào chức năng: một class trong App/Utils/Calculator mà bên trong gọi cURL tới API lấy tỷ giá thì vẫn là infra. Ngược lại, một thư viện markdown parser trong /vendor parse text thuần có thể coi như core.
  • Câu hỏi vàng để định danh: “Đoạn code này có chạy độc lập, trong memory, không side effect ngoài không?” - Nếu “có cả hai” → core. Chỉ cần một “không” → infra.

🕐 Ví dụ vùng xám: lấy thời gian hiện tại

  • new DateTimeImmutable('now') - lấy giờ hệ thống là phụ thuộc môi trường (đồng hồ hệ thống), nhưng rất nhẹchấp nhận được trong core nếu truyền vào từ ngoài.
  • Muốn thật sạch: tạo interface Clock với now() và implementation SystemClock gọi Carbon::now(). Core dùng Clock->now() → core không biết Carbon là gì. Xem Factory Pattern.
  • Ngược lại, User::find(1) hay Event Dispatcher của Laravel thì chắc chắn là infrastructure.

💡 Chốt lại

Mục tiêu cuối cùng: để core code “không nhận ra” sự tồn tại của hạ tầng. Các Adapter - Bộ chuyển đổi bản chất là hạ tầng, nhưng chúng giúp cô lập hạ tầng tại một điểm duy nhất, giữ phần lõi luôn sạch.

Liên quan