2012-02-15 35 views
18

Tôi đã có một mini-discussion on the topic trong một chủ đề khác và muốn có dữ liệu nhập của mọi người về mặt "xấu" của các chủ đề.Đối tượng RX - chúng có thể tránh được không?

Những người thường xuyên diễn đàn RX biết rằng E.Meijer does not like Subjects. Trong khi tôi có một sự tôn trọng sâu sắc nhất đối với ý kiến ​​của người sáng tạo RX, tôi đã sử dụng Chủ đề khá rộng rãi trong nhiều dự án trong một vài năm và không gặp bất kỳ vấn đề kiến ​​trúc hoặc lỗi nào vì chúng.

"Điểm yếu" duy nhất với Chủ đề tôi có thể đặt tên là chúng không được "tái sử dụng" - sau khi bạn đã hoàn thành một đối tượng có thể quan sát được, bạn cần phải tạo lại nó trước khi người đăng ký mới có thể nhận sự kiện từ chủ đề đó.

"Mùi mã" và "Không thích chúng" cần được hỗ trợ bởi các ví dụ "thực dụng" - bạn có thể mang đến các tình huống có thể chú ý khi sử dụng Chủ đề có thể dẫn đến lỗi hoặc sự cố không? Hoặc có thể bạn nghĩ rằng chúng dễ dàng và vô hại hoàn toàn - sau đó cố gắng xác định một khu vực nơi chúng sẽ được sử dụng.

Trả lời

22

Erik Meijer đang suy nghĩ theo cách hoàn toàn chức năng - Chủ thể là các biến có thể thay đổi của Rx. Vì vậy, nói chung cách sử dụng anh ta đúng - sử dụng Subjects đôi khi là một cách để tránh khỏi tư duy chức năng, và nếu bạn sử dụng chúng quá nhiều, bạn đang cố gắng để upstream.

Tuy nhiên! Chủ đề cực kỳ hữu ích khi bạn đang giao tiếp với thế giới không phải chức năng của .NET. Gói một sự kiện hoặc phương thức gọi lại? Đối tượng là tuyệt vời cho điều đó. Cố gắng đặt một giao diện Rx vào một số mã hiện có? Sử dụng một chủ đề!

+3

Âm thanh hợp lý. Ngoại trừ việc tôi sẽ đề nghị đã có cách để bọc các sự kiện tức là Observable.FromEvent (Pattern) mà một lần nữa là thích hợp hơn cho các đối tượng. –

+2

Tôi tin rằng anh ta không chỉ có nghĩa là chỉ đơn giản là gói các sự kiện và các cuộc gọi không đồng bộ, nhưng sử dụng dữ liệu từ chúng. Ví dụ, gói cặp 'BeginRead'/'EndRead' của các cuộc gọi không đồng bộ -' EndRead' chỉ trả về số byte đã đọc, để lấy dữ liệu thực tế bạn phải truy cập vào mảng byte có thể thay đổi được truyền vào 'BeginRead'. – Tyson

+0

Giải thích hay. – axel22

2

Tôi sử dụng Subject/Publish bất cứ khi nào các bộ phối hợp phản ứng đang được nhân đôi do lỗi lười.

Tuy nhiên, để sử dụng bình thường, tôi cảm thấy Chủ đề hơi nặng - OnNext có thể là cổ chai tiềm ẩn - hiển thị dưới dạng điểm phát sóng trong quá trình lược tả, có thể do kiểm tra đồng thời trong khi đẩy giá trị cho người đăng ký.

Tôi cảm thấy nó cũng sạch hơn đối với Đài quan sát bạn biết là nóng theo định nghĩa.

6

Có vẻ như rất nhiều người bình luận đang nói chuyện với nhau.

Thời gian qua tôi đã sử dụng một Chủ đề là khi tôi cần chuyển một đại biểu đến một phần mềm trung gian trong một cuộc gọi khởi tạo để nó có thể gọi lại cho tôi khi có điều gì đó xảy ra. Các đại biểu đã có sự kiện quen thuộc args chữ ký, nhưng tôi không thể sử dụng FromEvent vì không có sự kiện.

Tôi không cảm thấy xấu về điều đó - tôi không thấy bất kỳ lựa chọn nào khác.

Về cơ bản, tôi chỉ sử dụng Chủ đề khi tôi đang khởi tạo một số sự kiện và đưa nó vào thế giới Rx hoặc khi tôi cần xử lý đối với một số người đăng ký trong tương lai chưa đến. Đối tượng cho phép tôi liên kết những gì tôi có ngay bây giờ với người đăng ký sau.

+0

Tôi suy ra từ nhận xét của bạn rằng phương pháp 'Observable.FromEvent' không phục vụ cho các đại biểu thường xuyên vào thời điểm đó. Hoặc có thể họ vẫn không làm và họ cho rằng thứ đó là một "sự kiện" thay vì chỉ đơn giản là một đại biểu. Tôi phải kiểm tra cái đó. Nhưng bạn có thể xin vui lòng gửi một số mã để hiển thị những gì bạn đã làm? Tôi tò mò muốn hiểu cách bạn sử dụng 'Subject '. –

1

Một lý do mà tôi sẽ cảnh giác khi sử dụng một số Subject<T> như một phần của API công khai là nó trộn lẫn các mối quan tâm; một người quan sát là một mối quan tâm khác với quan sát.

gì nếu một số nhà quan sát hư gọi OnNext hoặc OnCompleted hoặc OnError trên Subject<T> nơi nó được chỉ vụ phải là một người quan sát ?

Thậm chí nếu nó không phải là một phần của API, và bạn giấu nó đi trong máy chủ của bạn như một trường sao lưu riêng tư, chỉ thực tế là nó có vai trò kép là đáng lo ngại. Trong trường hợp sử dụng nó như là một lĩnh vực ủng hộ, bạn vẫn chỉ mong đợi nó để thực hiện một vai trò/mối quan tâm - đó là một quan sát. Tuy nhiên, nó có tiềm năng để làm hai điều và đó chỉ là tinh thần đáng lo ngại.

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