#1. Dấu hiệu (Smell)
Bạn thấy một đoạn code gọi chồng chéo: $user->account->profile->address->getCity().
- Vấn đề: Nếu một ngày
profilekhông còn nữa, bạn phải sửa toàn bộ code ở khắp nơi. Client (đoạn gọi code) biết quá nhiều về cấu trúc nội bộ củaUser.
#2. Giải pháp: Hide Delegate
Thêm phương thức vào class cha để giấu đi sự phức tạp của class con.
// NÊN:
public function getCity() {
return $this->account->profile->address->city;
}
// Client chỉ cần: $user->getCity();
#3. Bài học xương máu
- Law of Demeter: “Chỉ nói chuyện với bạn thân”. Một đối tượng chỉ nên biết về đối tượng trực tiếp của nó, không nên biết về “cháu” hay “chắt”.
- Lưu ý: Đừng lạm dụng tạo ra hàng trăm method trung gian (hàm ủy quyền) nếu class cha trở nên quá béo.
#4. Câu hỏi nhanh
Q: Khi nào chain là chấp nhận được? A: Khi nó là một Fluent API được thiết kế chủ đích (như Query Builder của Laravel hoặc Collection). Đó là tính năng, không phải “mùi”.