Đồng nghiệp của tôi và tôi có tranh chấp. Chúng tôi đang viết một ứng dụng .NET xử lý một lượng lớn dữ liệu. Nó nhận các phần tử dữ liệu, nhóm các tập hợp con của chúng thành các khối theo một số tiêu chí và xử lý các khối đó.Tôi có nên để IObservable <T> trên giao diện của mình không?
Giả sử chúng tôi có các mục dữ liệu thuộc loại Foo
đến một số nguồn (từ mạng, chẳng hạn) từng cái một. Chúng tôi muốn thu thập tập hợp con của các đối tượng liên quan thuộc loại Foo
, xây dựng một đối tượng thuộc loại Bar
từ mỗi tập hợp con này và xử lý các đối tượng thuộc loại Bar
.
Một trong số chúng tôi đã đề xuất thiết kế sau. Chủ đề chính của nó là phơi bày các đối tượng trực tiếp từ các giao diện của các thành phần của chúng tôi IObservable<T>
.
Thiết kế khác được đề xuất khác rằng chủ đề chính của nó là sử dụng giao diện nhà xuất bản/thuê bao của riêng chúng tôi và chỉ sử dụng Rx bên trong triển khai khi cần.
//********** interfaces *********
interface IPublisher<T>
{
void Subscribe(ISubscriber<T> subscriber);
}
interface ISubscriber<T>
{
Action<T> Callback { get; }
}
//********** implementations *********
class FooSource : IPublisher<Foo>
{
public void Subscribe(ISubscriber<Foo> subscriber) { /* ... */ }
// here we put logic that receives Foo objects from some source (the network?) publishes them to the registered subscribers
}
class FooSubsetsToBarConverter : ISubscriber<Foo>, IPublisher<Bar>
{
void Callback(Foo foo)
{
// here we put logic that aggregates Foo objects and publishes Bars when we have received a subset of Foos that match our criteria
// maybe we use Rx here internally.
}
public void Subscribe(ISubscriber<Bar> subscriber) { /* ... */ }
}
class BarsProcessor : ISubscriber<Bar>
{
void Callback(Bar bar)
{
// here we put code that processes Bar objects
}
}
//********** program *********
class Program
{
public static void Main(string[] args)
{
var fooSource = fooSourceFactory.Create();
var barsProcessor = barsProcessorFactory.Create(fooSource) // this will create BarsProcessor and perform all the necessary subscriptions
fooSource.Run(); // this enters a loop of listening for Foo objects from the network and notifying about their arrival.
}
}
Bạn nghĩ điều gì tốt hơn? Phơi bày IObservable<T>
và làm cho các thành phần của chúng tôi tạo luồng sự kiện mới từ các nhà khai thác Rx hoặc xác định giao diện nhà xuất bản/thuê bao của riêng chúng tôi và sử dụng Rx nội bộ nếu cần?
Dưới đây là một số điều cần lưu ý về thiết kế:
Trong thiết kế đầu tiên cho người tiêu dùng các giao diện của chúng tôi có toàn bộ sức mạnh của Rx ở/đầu ngón tay của mình và có thể thực hiện bất kỳ nhà khai thác Rx. Một trong số chúng tôi tuyên bố đây là một lợi thế và những người khác cho rằng đây là một nhược điểm.
Thiết kế thứ hai cho phép chúng tôi sử dụng bất kỳ kiến trúc nhà xuất bản/người đăng ký nào dưới mui xe. Thiết kế đầu tiên liên kết chúng tôi với Rx.
Nếu muốn sử dụng sức mạnh của Rx, nó đòi hỏi nhiều công việc hơn trong thiết kế thứ hai bởi vì chúng tôi cần dịch triển khai nhà xuất bản/người đăng ký tùy chỉnh thành Rx và ngược lại. Nó đòi hỏi phải viết mã keo cho mỗi lớp muốn thực hiện một số xử lý sự kiện.
Tôi thích cách bạn bắt đầu câu hỏi này. "Tôi và đồng nghiệp của tôi có tranh chấp." +1. –
Tại sao không phơi bày tất cả các công cụ IObservable như * phương pháp mở rộng * mà chăm sóc của tất cả những "mã keo".Giữ tất cả các công cụ IObs tách biệt khỏi các mô hình đối tượng của bạn, trong khi cung cấp tùy chọn. 'public IObservable AsObservable (IPublisher publisher)' hoặc một cái gì đó tương tự –
Will
Bạn đã làm tốt công việc hỏi câu hỏi một cách cân bằng. –