我最近刚刚开始使用事件驱动的体系 struct ,它来自一种非常标准的面向对象的思维方式.
我注意到的第一件事是,理解和跟踪程序的难度似乎随着程序的大小呈指数增长.虽然小型宠物项目很容易遵循,但感觉代码很快就会变成意大利面条.
我知道我对这种开发思维方式还不熟悉,并不是所有面向对象的担忧都会延续下go .有没有关于编写可维护、可理解的事件驱动代码的资源?使用node的人应该做什么.js或Twisted或事件机对此怎么办?
我最近刚刚开始使用事件驱动的体系 struct ,它来自一种非常标准的面向对象的思维方式.
我注意到的第一件事是,理解和跟踪程序的难度似乎随着程序的大小呈指数增长.虽然小型宠物项目很容易遵循,但感觉代码很快就会变成意大利面条.
我知道我对这种开发思维方式还不熟悉,并不是所有面向对象的担忧都会延续下go .有没有关于编写可维护、可理解的事件驱动代码的资源?使用node的人应该做什么.js或Twisted或事件机对此怎么办?
我将以Python为例,因为这就是我现在用来构建大型分布式应用程序的方法.
Twisted 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打开twisted reactor调试.setDebugging(True)调用初始化代码中的某个地方.这将附加在代码中引发异常的原始回溯,以便您可以轻松地看到错误实际发生的位置.只需记住在开始制作之前对setDebugging语句进行修订,因为它会导致大量额外的内省(如果你想彻底震惊,请仔细观察).