Subjects
可能是使用反應性庫最不理想的方式,儘管它當然可以工作。
功能反應式編程最適合沒有狀態。 Subjects
是一種狀態。我建議更改您的代碼,以便將Observable定義爲功能操作符的組合。這樣可以很容易地測試和管理您的可觀察信息正在發出的消息。
我更喜歡C#開發人員,所以我希望你能原諒不同的語法。這裏有一個例子:
void Main()
{
var tracker = new AddTracker();
tracker.getSums().Subscribe(i => Console.WriteLine(i));
Observable.Interval(TimeSpan.FromMilliseconds(100))
.Timestamp()
.Select(t => t.Timestamp.Second)
.Take(20)
.Subscribe(i => tracker.setA(i % 7));
Observable.Interval(TimeSpan.FromMilliseconds(75))
.Timestamp()
.Select(t => t.Timestamp.Millisecond)
.Take(30)
.Subscribe(i => tracker.setB(i % 9));
}
public class AddTracker
{
private readonly ISubject<int> _a;
private readonly ISubject<int> _b;
private readonly IObservable<int> _sums;
private readonly IDisposable _dummySub;
public AddTracker()
{
_a = new BehaviorSubject<int>(0);
_b = new BehaviorSubject<int>(0);
_sums = _a
.CombineLatest(_b, (a, b) => a + b)
.Replay(1)
.RefCount();
_dummySub = _sums.Subscribe(_ => { });
}
public void setA(int value)
{
_a.OnNext(value);
}
public void setB(int value)
{
_b.OnNext(value);
}
public IObservable<int> getSums()
{
return _sums;
}
}
在C#中的土地,你可以換出_a
和_b
科目的事件,這是一個溫和的改善。我知道Java中沒有一流的事件,所以我不確定這會轉化成什麼。
但更基本的是,在C#和Java中,你應該問的問題是......什麼導致setA
和setB
調用?你可以用它替換它們:
void Main()
{
var aStream = Observable.Interval(TimeSpan.FromMilliseconds(100))
.Timestamp()
.Select(t => t.Timestamp.Second)
.Take(20);
var bStream = Observable.Interval(TimeSpan.FromMilliseconds(75))
.Timestamp()
.Select(t => t.Timestamp.Millisecond)
.Take(30);
var tracker = new AddTracker(aStream, bStream);
tracker.getSums().Subscribe(i => Console.WriteLine(i));
}
public class AddTracker
{
private readonly IObservable<int> _sums;
private readonly IDisposable _dummySub;
public AddTracker(IObservable<int> a, IObservable<int> b)
{
_sums = a
.CombineLatest(b, (aItem, bItem) => (aItem % 9) + (bItem % 7))
.Replay(1)
.RefCount();
_dummySub = _sums.Subscribe(_ => {});
}
public IObservable<int> getSums()
{
return _sums;
}
}
總之,如果你必須,從主題開始。然後把你的主題,並儘可能遠離你的邏輯推動他們。
是的,這些都是非常好的點。但是,就我而言,我*需要保持一種狀態並向消費者公開變更(如果有的話)。你有沒有更適合我的案例的「功能操作員組合」的更具體的例子? –
增加了一個有點人爲的例子。 – Shlomo