2011-07-31 25 views

Trả lời

6

Sự kiện là tuyệt vời cho khi bạn có một "có" trong khi ghi đè rất nhiều tốt hơn cho tình huống mà bạn có một "là một" mối quan hệ

Đối với một ví dụ, nếu bạn có một con vật lớp cơ sở, nó có khả năng là trường hợp mỗi con vật sẽ có cách di chuyển riêng. tuy nhiên mỗi động vật đều có cách nào đó muốn di chuyển.

Bây giờ hãy nghĩ đến một người lớp có thể 'có' một con vật cưng. trong trường hợp này, Người có thể phản ứng với động vật đang di chuyển nhưng nó sẽ không thực sự xử lý động vật di chuyển.

+0

Câu trả lời hay! Tôi đoán nó có lý! –

+0

Ý tưởng này hấp dẫn tôi. Tiếp tục tuyên bố của bạn, bạn có thể mở rộng câu trả lời của mình để sử dụng các cụm từ đó trong một hoặc hai câu ví dụ? – ckittel

7

Hai tính năng tương tự mơ hồ (cả hai đều được thiết kế để thực hiện một số dạng công văn động), nhưng không thể so sánh trực tiếp được.

Sự kiện phải thông báo cho các đối tượng khác rằng đối tượng đã đến một số loại state transition. Đây là một tính năng ngôn ngữ thể hiện the Observer Design Pattern. Điều này có thể hữu ích trong nhiều trường hợp, nhưng không phải lúc nào cũng hữu ích hoặc mong muốn. Nó là một công cụ để hoàn thành công việc cụ thể.

Chức năng ảo được sử dụng để tạo Object Oriented Polymorphism. Chúng là một khối xây dựng cơ bản của gần như mọi mẫu thiết kế, và rất nhiều thiết kế hướng đối tượng.

Để thử so sánh chúng, tôi giả sử bạn đang cố triển khai một số dạng mẫu quan sát với một trong hai tính năng. Với hạn chế đó, vẫn không có quy tắc đơn giản nào bạn có thể quay lại để quyết định nên sử dụng cái gì. Thay vào đó, bạn sẽ phải tự hỏi mình những câu hỏi như:

  • Ai gây ra nó: sẽ hành động mà gây nên chuyển trạng thái của bạn xảy ra trong nội bộ, hoặc nó sẽ được kích hoạt từ bên ngoài?

Nếu được kích hoạt nội bộ, bạn có thể sử dụng sự kiện hoặc phương pháp ảo. Nếu nó được kích hoạt bên ngoài, bạn phải sử dụng một phương thức ảo.

  • Ai quan tâm về nó: nên class định nghĩa nhà nước xử lý các hậu quả của quá trình chuyển đổi trạng thái, hoặc nên một lớp bên ngoài xử lý nó?

Nếu lớp sở hữu tiểu bang cần xử lý chuyển tiếp thì đó phải là phương pháp ảo. Nếu một lớp riêng biệt nên phản ứng với quá trình chuyển đổi, nó phải là một sự kiện.

  • Có bao nhiêu bộ xử lý tôi cần: Bạn luôn cần một handler để phản ứng với sự chuyển đổi trạng thái, hoặc làm bạn cần nhiều?

Nếu bạn cần, sau đó sử dụng phương pháp ảo hoặc sự kiện có thể chấp nhận được. Nếu bạn cần nhiều, thì sẽ dễ dàng hơn khi sử dụng một sự kiện.

  • Tôi biết mà xử lý tôi muốn tại thời gian biên dịch: Tôi có liên kết với một handler nổi tiếng duy nhất, hoặc để tôi liên kết với bộ xử lý không rõ, có thể thay đổi theo thời gian?

Nếu bạn cần trình xử lý của mình thay đổi, bạn phải sử dụng sự kiện. Nếu bạn chỉ có một trình xử lý duy nhất được biết ở thời gian biên dịch, bạn có thể sử dụng một phương thức ảo.

  • Làm thế nào cùng nên mã của tôi là: Liệu mã xử lý của mình thuộc về một lớp học có nguồn gốc của loại hình ban đầu của bạn, hoặc dùng nó thuộc về một nơi khác?

Nếu nó thuộc lớp dẫn xuất, bạn cần một phương pháp ảo. Nếu nó thuộc về nơi khác, thì bạn cần một sự kiện.

Như bạn có thể thấy, các câu trả lời sẽ phụ thuộc rất nhiều vào miền và vấn đề kiến ​​trúc đối tượng cụ thể của bạn. Thiết kế tốt không phải là một cái gì đó kỳ diệu rơi vào lòng bạn thông qua một số danh sách kiểm tra. Bạn cần phải suy nghĩ về nó, rất nhiều :)

Edit:

Nó có thể không được áp dụng trực tiếp cho C# sự kiện, nhưng nó có thể hữu ích để lấy một ví dụ từ công việc hiện tại. Đây là một bài viết ngắn tôi vừa tìm thấy (trong khi trả lời một câu hỏi khác) về các lựa chọn thay thế thiết kế trong Java cho các mẫu sự kiện: http://csis.pace.edu/~bergin/patterns/event.html

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