2009-08-05 35 views
5

Tôi đã nhìn vào mô hình đối tượng null và tôi tự hỏi nếu nó có giá trị thực hiện nó hoặc sử dụng "nếu" kiểm tra cho nulls trong intsead mã của tôi. Khi tôi nhìn vào việc triển khai có vẻ khó để giữ cho các đối tượng được đồng bộ hóa tốt với việc triển khai null của chúng. Bằng cách thay đổi đối tượng chính, chúng ta phải kiểm tra xem đối tượng null có hoạt động như mong muốn và dễ dàng thực hiện các lỗi triển khai hay không. Phải không?Mô hình đối tượng null có đáng giá không?

EDIT

Tránh kiểm tra cho null: http://www.invisible-city.com/sharon/2009/03/null-object-pattern-when-slacker-is.html hoặc http://journalofasoftwaredev.wordpress.com/2008/08/19/null-object-pattern-by-example/

+1

Bạn có thể thêm giải thích ngắn gọn hoặc liên kết đến 'mẫu đối tượng rỗng' không? – thecoop

+0

http://jeremyjarrell.com/archive/2007/08/01/46.aspx –

Trả lời

2

Từ kinh nghiệm của tôi, tôi không cảm thấy khó có thể giữ Null-Object được đồng bộ. Nếu bạn có vấn đề này, đối tượng của bạn có thể có quá nhiều trách nhiệm vì nó chịu nhiều thay đổi.

Tôi có xu hướng sử dụng mẫu này nếu tôi thực sự có thể xác định đối tượng như vậy để cho phép luồng hành vi mặc định tốt. Ví dụ. Một đối tượng Null cho thao tác truy vấn là một đối tượng để lại truy vấn gốc bị ảnh hưởng. Một mở rộng Null cho một số đối tượng khác là một trong đó không có gì.

Tôi tìm thấy nó ở lần một mẫu khá rõ ràng để tránh kiểm tra với ifs cho hành vi tùy chọn có thể có hoặc không tồn tại ở trạng thái nhất định của ứng dụng của tôi.

4

Nếu đối tượng của bạn đang được null sẽ là một chuẩn mực toàn mã của bạn, bạn muốn cũng có thể sử dụng mô hình. Tôi kiểm tra null khi một đối tượng chưa được tạo và nó cần được khởi tạo. Tôi không thực sự sử dụng null cho bất cứ điều gì khác, và tôi chắc chắn không sử dụng nó để có nghĩa là không có hành vi được xác định.

Nếu tuy nhiên, bạn đang sử dụng null để có nghĩa là hành vi chưa được xác định hoặc hành vi mặc định là gì, sau đó chắc chắn sử dụng mẫu.

0

Tôi đảm bảo các mục IEnumerable của tôi là các bảng liệt kê trống thay vì null, nhưng nếu có điều gì đó thực sự bị thiếu, có gì sai với null? Thỉnh thoảng, tôi cần phải phân biệt giữa uninitializedthiếu trong tình huống khởi tạo lười biếng, nhưng sau đó tôi thường sử dụng biến boolean riêng để chỉ trạng thái để bất kỳ giá trị nào (bao gồm null) hợp lệ cho đối tượng đích.

2

Tôi đã thành công lớn khi sử dụng các đối tượng null với các triển khai Nhà máy và IoC của tôi. Chúng đặc biệt hữu ích cho các tính năng dọc của một ứng dụng. Tôi sẽ không tạo một cái cho một hành động cốt lõi cho ứng dụng của bạn.

Ví dụ, bạn có giao diện IPrinter và một vài đối tượng thực hiện nó - PrinterX và NullPrinter. Trong quá trình khởi tạo IPrinter, bạn có thể thử khởi động PrinterX nhưng nếu nó không thành công, bạn trả lại NullPrinter. Trong trường hợp này, in ấn là một tính năng của ứng dụng nhưng không phải là một yêu cầu để nó chạy thành công.

0

Có rất nhiều quan niệm sai lầm về mẫu thiết kế NULL giúp tránh kiểm tra NULL. Trên thực tế, lợi ích phụ của mẫu thiết kế đối tượng NULL là bạn không cần phải làm NULL checl. Nhưng kiểm tra NULL là tốt và cần thiết. Mẫu thiết kế NULL lấp đầy sự vắng mặt của đối tượng và nên được sử dụng khi các đối tượng đang cộng tác với nhau.

Đọc bài viết này mà nói về mẫu thiết kế đối tượng NULL chi tiết

http://www.codeproject.com/Articles/1042674/NULL-Object-Design-Pattern

Một số lưu ý về mẫu thiết kế NULL đó sẽ loại bỏ sự nhầm lẫn về mô hình này.

  1. Mẫu thiết kế NULL điền vào một TIỆN NGHI của một đối tượng có hành vi DEFAULT và chỉ nên sử dụng khi một đối tượng cộng tác với nhau.
  2. Mẫu thiết kế NULL không có nghĩa là thay thế xử lý ngoại lệ NULL. Đó là một trong những lợi ích phụ của mẫu thiết kế NULL nhưng ý định là cung cấp một hành vi mặc định.
  3. Kiểm tra NULL không được thay thế bằng các đối tượng mẫu thiết kế NULL vì nó có thể dẫn đến các lỗi thầm lặng trong ứng dụng.
    1. Mẫu thiết kế NULL hữu ích trong thử nghiệm đơn vị Mock và phát triển Agile.
    2. Các lớp NULL là trường hợp điển hình để áp dụng mẫu thiết kế Singleton và làm cho các lớp không thay đổi.

Mẫu này chủ yếu được kết hợp với kiểu trang trí và nhà máy.

Các vấn đề liên quan