0

我试图理解Deprecating the Observer Pattern这个文件,它似乎对“Reactive”编程的开发有些影响。“弃用观察者模式” - 某些其他语言的代码示例?

但是,所有的例子都在斯卡拉,这是阻碍我的理解。 有没有人将这些例子翻译成更常用的语言,如Java或JavaScript?还是有比7人更多的语言使用的例子吗? :)

如果这属于不同的stackwhatever,请让我知道。

+4

有几十人。许多! – Dylan

+4

7人? :((((( –

+0

)仍然阅读论文,但我会说在Java中做同样的事情会很麻烦。可能在JavaScript中可能,但没有相同类型的安全性... – Governa

回答

2

文章认为观察者模式导致了许多错误,因为这是很难推理(需要使用的副作用,以保持状态,缺乏统一性,控制反转,...)而且很难将良好实践(关注点分离,封装......)应用于此。

然后,继续说明如何使用Scala.React库,可以从基于可观察的代码库转换为反应型代码库。

在这个答案中,我将使用“scalenglish”和“javenglish”来尝试解释我所了解的代码。

第一步(第2项)是创建事件抽象。有了Event,你现在有了一个统一的接口,可以用来封装observables。然后它继续并定义“合并”方法,从而可以编写不同的事件。

第二步(项目3)是解决控制问题的反演问题。要做到这一点,利用Scala.React库,它们定义DSL那里可以把这种:

var state = null 
observe(event1).then{ 
    state = new StartState() 
    remove_observer(event1) 
    observe(event2).then { 
     state = new AccumulateState(old_state+new_data) 
    } 
    observe(event3).then { 
     do_something() 
     state = null 
     remove_observer(event2) 
     remove_observer(event3) 
    } 
} 

到:

once { 
    state = new StartState(when(event1)) 
    until(event3) { 
     state = new AccumulateState(when(event2)) 
    } 
    do_something() 
} 

库透明地定义函数,将等待预期的事件但不会停止执行您的程序。在上面的代码中,方法“once”,“when”和“until”负责等待事件并在需要时继续执行代码。你也可以看到,在第二个片段中,你不需要关联/删除观察者。

第三步(项目4)然后创建一个信号。 Signal是一个随时间变化的值,可用于定义如何评估当前信号的值(“now”方法),并通过返回与之关联的Event来观察信号更改(“更改”方法)信号。 (作为一个侧面说明,scala中的特征与java中的接口相同,但是增加了在特征本身中实现某些所需行为的可能性。)

然后第四步(第5项)信号和事件进入Scala.Reactor。它使信号和事件特征扩展了反应性特征,并解释了如何(在斯卡拉)定义将事件和信号转换为数据流的方法含蓄(用户定义的隐式转换是我试图在其他语言上找到的,但是它似乎只是一个scala特性)。

然后,它定义了combinators(统一的方法,可以对任何数据流进行操作),并解释在此过程中发现的问题。

然后,项目6继续解释它是如何在scala中实现的。

该项目7列出其他语言/图书馆(包括Java)的相关作品

2

您可能也有兴趣RxJava?描述:

JVM的反应式扩展 - 用于使用Java VM的可观察序列编写异步和基于事件的程序的库。

This page解释了使用Java 7 en 8进行反应式编程(示例见7)。例如:

Integer[] numbers = { 0, 1, 2, 3, 4, 5 }; 

Observable numberObservable = Observable.from(numbers); 

numberObservable.subscribe(
     new Action1<Integer>() { 
      @Override 
      public void call(Integer incomingNumber) { 
       System.out.println(incomingNumber); 
      } 
     }, 
     new Action1<Throwable>() { 
      @Override 
      public void call(Throwable error) { 
       System.out.println("Error in synchronous observable"); 
      } 
     }, 
     new Action0() { 
      @Override 
      public void call() { 
       System.out.println("This observable is finished"); 
      } 

     } 
); 
+0

我不知道它是否适合。这篇文章是关于抽象观察者模式,因为它认为这种模式是一些软件中的错误的主要原因 – Governa

+0

事实上,RxJava似乎是来自该论文的Java思想的化身,所以至少你可以看到一个程序的反应版本会看起来像,并将其与基于观察者模式的版本(您可能必须创建自己)进行比较。 – rinde

+0

@Governa是的,这似乎是本文的前提,观察者模式会导致太多的错误,“他们”的方法被称为“Reactive”,当然是那些崇拜虚伪的Observable(或类似的东西)的救世主。RxJava页面让我感到困惑,因为它的全部回合可观察。 –