体系结构-编写可维护的事件驱动的Cod

我最近才刚开始使用事件驱动的体系结构,它来自于非常标准的面向对象思想。

我注意到的第一件事是,理解和跟踪程序的难度似乎随着程序的大小成倍增加。 尽管小型宠物项目易于执行,但感觉代码很快就会变成意大利面条。

我了解我对这种开发思想是陌生的,并不是我所有的面向对象的忧虑都得以延续。 是否有编写可维护,可理解的事件驱动代码的资源? 使用node.js或Twisted或Event Machine的人对此有何处理?

7个解决方案
7 votes

去年,我在Yahoo上就这个话题做了演讲。

sh1mmer answered 2020-02-10T03:12:36Z
6 votes

尝试看看这些文章:

  • 了解node.js事件循环
  • 节点中的控制流
  • 节点第二部分中的控制流
yojimbo87 answered 2020-02-10T03:13:09Z
6 votes

马丁·拉夫兰(Martyn Loughran)撰写了一篇出色的短篇文章,完全是关于避免回调意大利面条的。

我真正喜欢他的文章的过程是将意大利面条制成漂亮干净的过程。 乍一看似乎有点形式化,但是当您看到最终结果时,我认为您会同意他以简洁,清晰易懂的代码显示出真正的技巧。

sarnold answered 2020-02-10T03:13:34Z
4 votes

我将以Python为例,因为这就是我现在用来构建大型分布式应用程序的东西。

扭曲的python使用inlinecallbacks或(稍微难看)的deferredGenerator样式允许使用非常命令式的样式。 这些方法使您可以编写使用事件驱动的回调代码的过程,该过程更易于阅读和理解。 该实现将您的函数转换为延迟序列,该延迟序列会产生一系列递延。

具体来说,您不必构建深度嵌套的回调函数/ lambdas / closures集,而是可以在任意点将对函数的控制权返回给事件循环。 如果愿意,您可以在脑海中将其重新标记为协程或协作式多任务处理。 它完成了工作。 例如(使用较丑陋的deferredGenerator样式):

@defer.deferredGenerator
def foo(arg):
    bar = nonBlockingFunction(foo)
    baz = waitForDeferred(aFunctionThatReturnsADeferredToo(bar))
    yield baz #Returns control to the event loop
    output = baz.getResult() #This gets the output of aFunctionThat...Too above
    yield output #This is how we return a result instead of using return

@defer.deferredGenerator
def aFunctionThatReturnsADeferredToo(put_bar_here):
    """Stuff happens here...."""
    ...etc...

这里还有另一篇文章显示了inlineCallbacks方法,该方法更干净,但是需要python 2.5或更高版本(意味着不属于Centos / RHEL 5系列,我很遗憾在我的应用程序中坚持使用它)。 如果可以使用,请这样做。

如您所见,这看起来像您熟悉和喜欢的老派python命令性内容,但是如果没有大量嵌套函数和lambda,它就更易于维护。 我仍然希望python有块。

至于调试,您可以在初始化代码中的某个位置使用defer.setDebugging(True)调用打开扭曲的反应堆调试。 这将附加在代码中引发异常的原始回溯,以便您可以轻松查看实际发生错误的位置。 只需记住在生产之前编辑setDebugging语句,因为它会产生大量的额外自省(如果要彻底惊恐,请在strace中观看)。

Enki answered 2020-02-10T03:12:16Z
4 votes

对于Twisted,建议不要使用旧的deferredGenerator,而建议使用inlineCallbacks;。 它使您可以完全编写阻塞式代码,并且仍然可以很好地与事件循环配合使用。

@defer.inlineCallbacks
def foo(arg):
    bar = nonBlockingFunction(foo)
    output = yield FunctionThatReturnsADeferredToo(bar)
    defer.returnValue(output) #This is how we return a result instead of using return
jrydberg answered 2020-02-10T03:13:54Z
1 votes

显然,已经有最佳实践和模型将随着时间的推移不断发展。

但是,还要考虑事件编程为“小型宠物项目”提供相互交流的机会的可能性。 想象一下一个世界,成千上万个分散的单个项目通过用户定义的回调进行实时交互。

用户和开发人员将能够通过现有协议从上到下重新连接Web和应用程序,而不必依赖现有的应用程序设计。 这样,应用程序设计人员将可以自由地专注于各个用例,而不必提供一种千篇一律的解决方案或担心每一种可能的偶然性。

查看Web Hooks,看看Twilio之类的服务已经如何运行

danielsiders answered 2020-02-10T03:14:28Z
1 votes

我唯一的建议是认为功能。

masylum answered 2020-02-10T03:14:49Z
translate from https://stackoverflow.com:/questions/5597512/writing-maintainable-event-driven-code