“弃用观察者模式” - 某些其他语言的代码示例?
我试图理解Deprecating the Observer Pattern这个文件,它似乎对“Reactive”编程的开发有些影响。“弃用观察者模式” - 某些其他语言的代码示例?
但是,所有的例子都在斯卡拉,这是阻碍我的理解。 有没有人将这些例子翻译成更常用的语言,如Java或JavaScript?还是有比7人更多的语言使用的例子吗? :)
如果这属于不同的stackwhatever,请让我知道。
文章认为观察者模式导致了许多错误,因为这是很难推理(需要使用的副作用,以保持状态,缺乏统一性,控制反转,...)而且很难将良好实践(关注点分离,封装......)应用于此。
然后,继续说明如何使用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)的相关作品
您可能也有兴趣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");
}
}
);
有几十人。许多! – Dylan
7人? :((((( –
)仍然阅读论文,但我会说在Java中做同样的事情会很麻烦。可能在JavaScript中可能,但没有相同类型的安全性... – Governa