Trong quá trình lập trình đôi khi chúng ta sẽ bắt gặp các trường hợp biến hoặc đối tượng có thể null

$order = Order::find(1000);
if (is_null($order)) {
    $price = $product->price;
} else {
    $price = $product->price - $order->getDiscount();
}

Vậy Null Object là gì ?

  • Là một design partern thuộc lớp (Refactoring) và (Behavioral)
  • Mục đích là gói gọn sự thiếu vắng của một đối tượng, dữ liệu bằng cách cung cấp một giải pháp thay thế có thể thay thế để đưa ra method không làm gì hoặc mặc định phù hợp.

=> Cung cấp giá trị không thay đổi tính đúng đắn của logic, như giá trị 0, rỗng ... thường dùng để refactor đoạn code.

Giải thích vậy nghe vẻ khó hiểu nhưng nó là tạo ra một Object có đầy đủ các phương thức, method như một Object ban đầu, nhưng các method đều trả về giá trị 0, rỗng ... và không làm ảnh hưởng đến các logic tính toán tác động vào đối tượng này.

class NullOrder
{
    public function getDiscount(): int
    {
        return 0;
    }
}

Quay lại đoạn code ban đầu

$order = Order::find(1000) ?? new NullOrder();
$price = $product->price - $order->getDiscount();

Qua ví dụ trên ta thấy, nếu Order::find(1000) nếu ra null thì sẽ khởi tạo một đối tượng NullOrder và lúc này ta gọi đến hàm getDiscount() vẫn đúng, vẫn gọi được và giá trị $price vẫn không thay đổi vì nó trừ đi 0;

Và ta thấy bản chất của Null Object là không làm thay đổi tính đúng đắn của dữ liệu ban mong muốn ban đầu.

Chúc bạn làm việc hiệu quả :3