0

Reactive Extensionsを使用して単純なシミュレーションエンジンをどのように構築しますか?たとえば、MotorプロパティIsPoweredと。を持つクラスがあるとしますSpeed。100秒間、毎秒10RPMずつ0から1000RPMにランプアップするIsPoweredことにより、falseからtrueへの変化に対応する必要があります。Speed

これを少し抽象化して、クラスとそのプロパティが事前に知られていないプラグ可能なAPIを提供したいとします。代わりに、シミュレーションエンジンは、プロパティの変更の観察可能なストリームを取得します。これは、追加のプロパティの変更を作成することによって反応します。その多くは、Rxを利用して時間の経過とともに段階的に発生します。そのようなAPIはどのように見えるでしょうか?

4

1 に答える 1

0

シミュレーションAPIには、プロパティの変更を表すタイプと、変更の着信ストリームと発信IObservable<T>ストリームを持つシミュレーションメソッドが必要です。シミュレーションエンジンの実装は、出力ストリームを更新するために着信プロパティの変更に反応するルールで構成されます。

タイプは次のようになります(ただし、構造体はクラスよりも優れている可能性があります)。

class PropertyChange
{
    public PropertyChange(string name, object value) { Name = name; Value = value; }
    public string Name { get; private set; }
    public object Value { get; private set; }
}

シミュレーション方法は次のようになります。複数のルールを示すために、このコードはIsLightOn単にを追跡するプロパティを前提としていますIsPowered

IObservable<PropertyChange> Simulate(IObservable<PropertyChange> incomingChanges)
{
    var isLightOnRule =
        from c in incomingChanges
        where c.Name == "IsPowered"
        select new PropertyChange("IsLightOn", c.Value);

    var ramp = Observable.Generate(0, speed => (speed <= 1000), speed => speed + 10, speed => new PropertyChange("Speed", speed), _ => TimeSpan.FromSeconds(1));
    var speedRule = incomingChanges
        .Where(c => c.Name == "IsPowered" && (bool)c.Value)
        .SelectMany(ramp);

    // Add more rules here.

    return Observable.Merge(isLightOnRule, speedRule /* merge more rules here */);
}
于 2012-05-03T20:39:07.847 に答える