2008-11-25 38 views
5

Gần đây tôi đã xem this youtube tutorial trên mẫu thiết kế đối tượng Null. Mặc dù có một số lỗi trong đó: chẳng hạn như NullCar mà không làm bất cứ điều gì tạo ra một vòng lặp vô hạn, khái niệm này cũng được giải thích rõ ràng. Câu hỏi của tôi là, bạn sẽ làm gì khi các đối tượng có thể rỗng có getters và được sử dụng trong mã của bạn? Làm cách nào để bạn biết giá trị nào cần trả về theo mặc định? Hoặc tôi nên thực hiện mô hình này bên trong tất cả các đối tượng? Điều gì sẽ xảy ra nếu tôi cần trả lại các chuỗi hoặc nguyên thủy? Tôi đang nói từ một quan điểm Java.Null object design pattern question

EDIT: Tôi sẽ không giao dịch thử nghiệm đối tượng rỗng để thử nghiệm giá trị mặc định? Nếu không, tai sao không ?

Trả lời

4

Theo như tôi đã hiểu, ý tưởng là giá trị của đối tượng null càng gần với "không có gì" càng tốt. Thật không may nghĩa là bạn phải tự định nghĩa nó. Ví dụ cá nhân tôi sử dụng "" khi tôi không thể vượt qua một chuỗi null, số đối tượng null cho tôi là -1 (chủ yếu là vì theo mặc định, hầu hết các chuỗi cơ sở dữ liệu bắt đầu từ 1 và chúng ta sử dụng các đối tượng đó cho id mục: sa lot vì vậy -1 là giveaway chết nó là một đối tượng null), với danh sách/bản đồ/bộ nó là Collections.EMPTY_SET, EMPTY_MAP hoặc EMPTY_LIST và cứ tiếp tục như vậy. Nếu tôi có lớp tùy chỉnh, tôi phải tạo một đối tượng null từ, tôi xóa tất cả dữ liệu thực tế khỏi nó và xem nơi nào lấy tôi và sau đó áp dụng những gì tôi vừa đề cập cho đến khi nó "trống".

Vì vậy, bạn thực sự không "biết" giá trị nào cần trả về theo mặc định, bạn chỉ phải tự mình quyết định.

8

Mục tiêu của đối tượng Null là tránh có tham chiếu Null trong mã. Các giá trị được trả về bởi Gull Object getters phụ thuộc vào miền của bạn. Không hoặc chuỗi rỗng thường thích hợp.

Nếu chúng tôi chuyển đổi mẫu đối tượng Null sang đời thực, những gì bạn đang yêu cầu tương tự như yêu cầu "bao nhiêu tuổi không ai?".

Có lẽ thiết kế của bạn có thể được cải thiện khi bạn dường như không tuân theo nguyên tắc tell, don't ask.

CHỈNH SỬA: Null Object design pattern thường được sử dụng khi một đối tượng ủy thác hành vi cho một đối tượng khác (chẳng hạn như trong Chiến lược hoặc Mẫu thiết kế nhà nước); như Tom Hawtin - tackline nhận xét, sử dụng Special Case Objects cho các đối tượng trả về giá trị.

+0

Tôi nghĩ sẽ chính xác hơn khi nhận xét rằng ngữ cảnh cho mẫu Đối tượng Null được đáp ứng tốt hơn với các loại "nói, đừng hỏi". Đối với các kiểu trả về có giá trị, bạn có nhiều khả năng sẽ hướng đến các đối tượng trường hợp đặc biệt. Có thể. –

+2

Wow, một zen tao như gợi ý lập trình ... :-) – PhiLho

2

bạn sẽ làm gì khi các đối tượng có thể rỗng có getters và được sử dụng trong mã của bạn? Làm cách nào để bạn biết giá trị nào cần trả về theo mặc định?

Làm cách nào để bạn biết lớp nào cần triển khai? Đây là một câu hỏi thiết kế, nó phụ thuộc vào ứng dụng.

Nói chung mục đích của mẫu NullObject là hỗ trợ việc tái cấu trúc Replace Conditional with Polymorphism trong trường hợp đặc biệt khi điều kiện là so sánh với giá trị null của ngôn ngữ lập trình.

Việc triển khai đúng ví dụ trong video sẽ yêu cầu ủy quyền phương thức driveCar cho các lớp Car. Các lớp SlowCarFastCar sẽ thực hiện vòng lặp, có lẽ thông qua việc triển khai chia sẻ trong lớp cơ sở và NullCar sẽ chỉ trả về ngay lập tức.

Trong ngữ cảnh Java, thuộc tính NullCar.speed có thể là một int không được mở hộp. Vì vậy, thiết lập nó để null không phải là một lựa chọn.Tôi có lẽ sẽ ẩn thuộc tính phía sau accessor, và có NullCar.getSpeed nâng cao một ngoại lệ. Bất kỳ mã khách hàng nào cần thử nghiệm để tránh ngoại lệ này thay vào đó sẽ chuyển sang các lớp học xe hơi.

ủy thác tất cả các hoạt động mà phụ thuộc trực tiếp vào một giá trị tốc độ là có sẵn là một ứng dụng của nguyên tắc Tell Don't Ask của thiết kế hướng đối tượng được đề cập bởi philippe

0

gì nên là điểm hội nhập của mẫu thiết kế Null trong mã? Tôi nghĩ rằng các đối tượng DAO là trình khách cấp fisrt cho mẫu thiết kế này khi chúng tra cứu một thực thể trong cơ sở dữ liệu và trả về nó một cách đơn giản.

Kiểm tra tính vô hiệu của các đối tượng này gây ô nhiễm mã trong lớp dịch vụ hoặc lớp lệnh nơi chúng thực sự được truy cập và sử dụng.

Vui lòng nhận xét.

0

Nó sẽ trả về đối tượng null cho lớp bạn đang nhận. Ví dụ, nếu bạn có một lớp A với một getter trả về một đối tượng của lớp B, thì trình trả về của NullA tương ứng sẽ trả lại NullB.