Có vẻ như có một cộng đồng người đang phát triển nói rằng bạn không bao giờ nên trả về giá trị rỗng và phải luôn sử dụng Mẫu đối tượng Null thay thế. Tôi có thể thấy tính hữu ích của NOP khi sử dụng một bộ sưu tập/bản đồ/mảng hoặc gọi các hàm boolean như isAuthenticated(), which is shown here.Mẫu đối tượng Null
Tôi chưa tìm thấy bất kỳ điều gì về điều này hoàn toàn thuyết phục. Hãy cùng tôi ở đây khi tôi cố gắng tổ chức những suy nghĩ của mình.
Sự hiểu biết của tôi là thay vì trả về một đối tượng rỗng, bạn trả về một đối tượng hợp lệ đã được "không".
Vì vậy, ví dụ, khách hàng sẽ thực hiện cuộc gọi để có được một đối tượng:
Car car = getCar();
Nếu không sử dụng các NOP bạn sẽ cần phải kiểm tra xem đối tượng trở về từ getCar() là null trước khi gọi bất kỳ phương pháp trên đó:
if (car != null){
color = car.getColor();
doScreenStuff(color);
}
Sử dụng NOP, thay vì getCar()
trở về null, bây giờ nó trả về một đối tượng đã được một cách hiệu quả "xóa trắng". Vì vậy, bây giờ chúng tôi không còn cần phải làm if (car != null)
và chỉ có thể yêu cầu màu sắc. Vì vậy, tôi cho rằng đối tượng "zeroed out" của chúng ta sẽ trả về "none" khi chúng ta gọi màu.
Điều này giúp ích như thế nào? Dường như việc di chuyển về phía trước và các phương thức gọi trên một đối tượng trống gây ra nhiều đau đớn như chỉ kiểm tra null. Bây giờ, khi đến lúc hiển thị thông tin, chúng ta cần phải kiểm tra xem màu không phải là "không", rằng chiều cao không phải là 0 hoặc bất kỳ giá trị nào khác mà bạn có. Vì vậy, về cơ bản, thay vì kiểm tra trong đầu chế biến nếu chiếc xe là null, bạn kiểm tra sau đó nếu đối tượng xe chúng tôi có là một chiếc xe thực sự hoặc thay thế. I E. chúng tôi không muốn hiển thị một loạt các đối tượng trống, vì vậy chúng tôi cần một số cách để lọc ra tất cả các đối tượng trống của chúng tôi.
Bộ lọc này là một bước bổ sung giống như gọi nếu (car! = Null). Sự khác biệt duy nhất là với việc kiểm tra null, chúng ta có thể ngừng xử lý ngay khi chúng ta khám phá rằng đối tượng ô tô là null bằng cách ném một ngoại lệ, trong khi NOP chúng ta gọi các phương thức trên đối tượng rỗng và tiếp tục chugging cho đến khi nó đến lúc hiển thị đối tượng và tại thời điểm này, chúng tôi lọc ra các ô trống. Hơn nữa, bạn cần phải biết các giá trị được trả về bởi đối tượng trống của bạn. I E. getColor() trả về "none" hoặc "empty".
Rõ ràng phải có thứ tôi đang xem. Cảm ơn trước.
Mẫu đối tượng rỗng và tùy chọn không phân phát cùng một mục đích. Tùy chọn được sử dụng để cho biết rằng một giá trị có thể có hoặc không có mặt. Mẫu đối tượng null chỉ đơn giản là mã hóa thực tế rằng có thể có một đối tượng 'không có gì' mà vẫn có hành vi hữu ích. – Cubic
Xin lỗi, tôi có thể không tự làm rõ, tôi đã nói thay thế cho kiểm tra null là tùy chọn, và sau đó "điều này không có nghĩa là thay thế cho mẫu đối tượng null" cho mẫu đối tượng null. Tôi đã không sử dụng mẫu đối tượng null trong một thời gian vì tôi đã không có một trường hợp sử dụng gần đây, nhưng tôi không có nghĩa là gợi ý rằng các tùy chọn thay thế mẫu đối tượng null. –