15

関数型リアクティブプログラミングのコンテキストにおける「グリッチ」の定義は何ですか?

一部の FRP フレームワークでは「グリッチ」が発生する可能性があり、他のフレームワークでは発生しないことを私は知っています。たとえば、RX はグリッチ フリーではありませんが、ReactFX はグリッチ フリーです [ 1 ]。

RX を使用しているときにグリッチがいつどのように発生するかを示す非常に簡単な例を誰かが示して、対応する ReactFX ソリューションがグリッチフリーである方法と理由を同じ例で示すことができますか?

読んでくれてありがとう。

4

3 に答える 3

20

意味

私の(自分の)お気に入りの定義:

グリッチは、観測可能な状態での一時的な矛盾です。

Scala.Rxからの定義:

FRP のコンテキストでは、グリッチはデータフロー グラフの一時的な不整合です。更新は瞬時に行われるのではなく、計算に時間がかかるため、更新プロセス中に FRP システム内の値が一時的に同期しなくなる場合があります。さらに、FRP システムの性質によっては、ノードが伝播で複数回更新される可能性があります。

整数変数a、を考えてみましょうb。などを定義sumし、.prod
sum := a + b
prod := a * b

この例を JavaFX に書き直してみましょう。

IntegerProperty a = new SimpleIntegerProperty();
IntegerProperty b = new SimpleIntegerProperty();
NumberBinding sum = a.add(b);
NumberBinding prod = a.multiply(b);

それでは、少し一貫性チェックを書きましょう。

InvalidationListener consistencyCheck = obs -> {
    assert sum.intValue() == a.get() + b.get();
    assert prod.intValue() == a.get() * b.get();
};

sum.addListener(consistencyCheck);
prod.addListener(consistencyCheck);

a.set(1);
b.set(2);

次の理由により、このコードは最後の行でアサーション エラーで失敗します。

  • b更新されます (2 に)
    • sum更新されます(3に)
      • `consistencyCheck` がトリガーされ、`a == 1`、`b == 2`、しかし `prod == 0`、`prod` がまだ更新されていないため

これはグリッチです —一時的におよび とprod一致しません。ab

ReactFX を使用したグリッチの除去

最初に、ReactFX はすぐに使用できる「グリッチ フリー」ではありませんが、グリッチを排除するためのツールを提供することに注意してください。それらを使用するための意識的な努力をしない限り、ReactFX は RX (例えば rxJava) よりグリッチフリーではありません。

ReactFX の不具合を解消する手法は、イベントの伝播が同期的であるという事実に依存しています。一方、RX でのイベント伝搬は常に非同期であるため、これらの手法を RX システムに実装することはできません。

sum上記の例では、との両方prodが更新されるまでリスナー通知を延期します。ReactFX でこれを実現する方法は次のとおりです。

import org.reactfx.Guardian;
import org.reactfx.inhibeans.binding.Binding;

IntegerProperty a = new SimpleIntegerProperty();
IntegerProperty b = new SimpleIntegerProperty();
Binding<Number> sum = Binding.wrap(a.add(b)); // Binding imported from ReactFX
Binding<Number> prod = Binding.wrap(a.multiply(b)); // Binding imported from ReactFX

InvalidationListener consistencyCheck = obs -> {
    assert sum.getValue().intValue() == a.get() + b.get();
    assert prod.getValue().intValue() == a.get() * b.get();
};

sum.addListener(consistencyCheck);
prod.addListener(consistencyCheck);

// defer sum and prod listeners until the end of the block
Guardian.combine(sum, prod).guardWhile(() -> {
    a.set(1);
    b.set(2);
});
于 2014-08-05T14:24:59.490 に答える
4

簡単な答え: グリッチ = 不整合/違法/無意味な状態。

関連するリンクは次のとおりです

また、別の回答については、Sodium の著者の講演の 29 分を参照してください: http://youtu.be/gaG3tIb3Lbk

関連するSOFの回答:Rxでグリッチを回避する方法

トーマスの答えに基づいて、グリッチとは何かについての私の理解は次のとおりです。

A、B、C の 3 つのノードを持つデータフロー グラフがあります。

A->B

A->C

この単純な例では、A を変更するとグリッチが発生し、B が変更されますが、C はまだ更新されていません。これはグリッチです。

C は B と一致しません。

B=2*A、C=2*A とします。

次に、B が C と等しくない場合、それはグリッチです。

于 2015-01-27T13:49:44.310 に答える