© 2026 Laravel

Refactor: Primitive Obsession (Ám ảnh kiểu nguyên thủy)

2 phút đọc
#refactoring #value-object #clean-code

Mục lục bài viết

Sử dụng các mục để điều hướng nhanh

#1. Dấu hiệu (Smell)

  • Bạn dùng string để lưu Email, Currency, Phone.
  • Logic kiểm tra if (!filter_var($email, FILTER_VALIDATE_EMAIL)) lặp đi lặp lại ở khắp nơi.

#2. Giải pháp: Replace with Value Object

Tạo class Email:

class Email {
    public function __construct(public string $value) {
        if (!filter_var($value, FILTER_VALIDATE_EMAIL)) throw new InvalidEmailException();
    }
}

#3. Lợi ích

  • Đóng gói logic: Validation được thực hiện ngay khi object được khởi tạo.
  • Type-hinting: Hàm của bạn rõ ràng hơn: public function send(Email $email).

#4. Câu hỏi nhanh

Q: Sự khác biệt giữa Value Object và Entity? A: Entity có ID (định danh), nếu thay đổi thuộc tính nó vẫn là nó. Value Object không có ID, nếu thay đổi giá trị, nó trở thành một đối tượng khác. Q: Có bao giờ nên dùng primitive? A: Khi giá trị không cần validation và không chứa logic (VD: name, note). Đừng tạo Value Object cho những thứ chỉ để chứa data đơn thuần.

Bài viết liên quan