Có phải trung tâm thông báo của Cameron mô hình chương trình khuyến khích tốt hay xấu?


13

Đôi khi tôi bắt gặp các API kiểu trung tâm thông báo này, ví dụ: Ca cao NSNotificationCenter: http://developer.apple.com/l Library / mac / #ốc /

Thông thường các API này cung cấp một điểm truy cập toàn cầu mà bạn đăng ký hoặc phát các tin nhắn / sự kiện. Tôi nghĩ đây là một vấn đề vì nó khuyến khích kiến ​​trúc chương trình phẳng và không có cấu trúc, trong đó các phụ thuộc không rõ ràng trong API, nhưng ẩn trong mã nguồn. Bạn không bị buộc phải suy nghĩ về quyền sở hữu và phân cấp đối tượng, nhưng có thể làm cho bất kỳ đối tượng nào trong chương trình của bạn dẫn đến bất kỳ mã nào ở bất cứ nơi nào được gọi. Nhưng có lẽ đây là một điều tốt?

Liệu mô hình này thường khuyến khích thiết kế chương trình tốt hay xấu, và tại sao lại như vậy? Nó làm cho mã khó hơn hoặc dễ kiểm tra hơn?

Hãy tha thứ cho tôi nếu câu hỏi này quá mơ hồ hoặc rộng. Tôi đang cố gắng che giấu những hậu quả tiềm tàng của việc sử dụng rộng rãi API như thế này và các cách khác nhau mà bạn có thể sử dụng.

Chỉnh sửa: Tôi đoán vấn đề lớn nhất của tôi với mẫu này là API "nói dối" về các phụ thuộc và khớp nối đối tượng và có thể được minh họa bằng ví dụ này:

myObj = new Foo();
myOtherObj = new Bar();
print myOtherObj.someValue; // prints 0
myObj.doSomething();
print myOtherObj.someValue; // prints 1, unexpectedly, because I never indicated that these objects had anything to do with each other

Bạn có đặt câu hỏi về ví dụ này cụ thể hoặc mẫu người nghe nói chung không?
TheLQ

Tôi tin rằng điều này là rộng hơn so với mô hình người nghe. Mẫu người nghe có thể được triển khai "sạch" với cấu trúc đối tượng được xác định rõ và đăng ký người nghe trên các đối tượng cụ thể. Sự không chắc chắn của tôi là về mô hình trung tâm thông điệp / sự kiện toàn cầu.
Magnus Wolffelt

Câu trả lời:


6

Tôi sẽ không đi xa như nói rằng nó khuyến khích lập trình xấu. Nhưng nó có thể dễ dàng bị lạm dụng.

Vâng, ý tưởng thực tế là gì?
Nguồn thông báo chỉ làm cho thông báo của nó. Nó không đưa ra một giả định về sự tồn tại của các nhà quan sát tiềm năng hoặc bất cứ điều gì. Một người quan sát đăng ký thông báo nó được thiết kế để xử lý. Người quan sát không đưa ra bất kỳ giả định nào về việc có bao nhiêu nguồn tiềm năng cho các thông báo mà nó có thể xử lý.

Đây là một cách để đạt được tiêm phụ thuộc, mà không bao giờ có nguồn biết người quan sát hoặc người quan sát biết nguồn. Tuy nhiên, để toàn bộ hệ thống hoạt động, bạn cần kết nối đúng người quan sát để nhận thông báo phù hợp và hệ thống này thậm chí còn dễ bị lỗi chính tả, vì không thể kiểm tra thời gian biên dịch.

Tất nhiên, mối nguy hiểm lớn nhất là ai đó sẽ sử dụng điều này để tạo ra hàng tấn vật thể trên toàn cầu cho các cuộc gọi 1-1.


6

Nhắn tin không đồng bộ là một hiệu trưởng kiến ​​trúc tốt cho các hệ thống lớn phải mở rộng

Tương đương với Java là JMS và thường được coi là một điều tốt .

Điều này là do nó thúc đẩy việc tách mã khách hàng của bạn khỏi mã thực sự phục vụ tin nhắn. Mã khách hàng chỉ cần biết nơi để gửi tin nhắn của họ. Mã dịch vụ chỉ cần biết nơi nhận tin nhắn. Khách hàng và dịch vụ không biết gì về nhau và do đó có thể thay đổi độc lập với nhau theo yêu cầu.

Bạn có thể dễ dàng đưa ra URI của trung tâm thông báo để làm cho nó có thể định cấu hình và không được nhúng trong mã nguồn.


4

Đây là một triển khai Mẫu Oberserver điển hình (hoặc đôi khi được gọi là mẫu Trình nghe hoặc đôi khi được gọi là mẫu Người đăng ký / Nhà xuất bản). Trong các ứng dụng có hành vi này hữu ích, đó là một mô hình tốt để thực hiện. Không nên thực hiện mô hình nếu nó không thêm giá trị cho giải pháp.

Từ câu hỏi của bạn, có vẻ như bạn lo ngại rằng mọi thứ đều biết về NotificationCenter và những thứ toàn cầu là BAD. Đôi khi, vâng, những thứ toàn cầu là xấu. Nhưng hãy nhìn vào sự thay thế. Giả sử bạn có 2 thành phần, ví dụ này không quan trọng chúng làm gì hay chúng là gì. Thành phần 1 có một số dữ liệu được hành động hoặc thay đổi theo một cách nào đó. Thành phần 2 muốn biết về bất kỳ thay đổi nào đối với dữ liệu thuộc loại mà Compoent1 quản lý. Thành phần 2 có nên biết về sự tồn tại của Hợp phần 1 không? Hoặc sẽ tốt hơn cho đăng ký thành phần / nghe một thông báo cho nó biết rằng một số thành phần ở đâu đó trong ứng dụng đã thay đổi một số dữ liệu mà nó quan tâm? Bây giờ lấy ví dụ này và nhân nó với hàng chục thành phần trở lên và bạn có thể thấy giá trị của mẫu nằm ở đâu.

Nó có phải là một giải pháp hoàn hảo cho mọi tình huống, không. Liệu nó có giao tiếp trừu tượng ở giữa các thành phần và cung cấp một khớp nối lỏng lẻo hơn, vâng.


1
Đọc trên wikipedia, định nghĩa mẫu quan sát viên dường như không bao gồm một trung tâm sự kiện có sẵn trên toàn cầu. Nếu trung tâm sự kiện được truyền vào hàm tạo / phương thức của tất cả các đối tượng liên quan, tôi sẽ coi đây là một mẫu tốt. Nó thực sự là điểm truy cập toàn cầu và trạng thái của nó làm cho tôi không chắc chắn.
Magnus Wolffelt

0

Điều này tốt cho các hệ thống hướng sự kiện và đẹp hơn so với việc có một nhóm Người quan sát quan sát lẫn nhau, vì bạn sẽ ít gặp phải các vòng lặp vô tình của các nhà quan sát bắn các sự kiện. Đây là một vấn đề thực sự trong những ngày VB cũ, khi bạn có các điều khiển ActiveX hướng sự kiện có thể được nối với nhau bằng các trình xử lý sự kiện.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.