icylogic
2019-02-22 01:14:10 +08:00
Python 当然有 callback,任何事件驱动的框架都或多或少需要。但为什么很少有”长得像 callback hell 的代码”,有一点很实际的:python 的匿名函数故意设计成不支持多行的,闭包捕获也设计成受限的形式, 所以要求你每次想传一个不方便在一行内表达的函数,就得起个名字。python 程序员或许称之为 pythonic,进一步可以参考下 GvR 为什么要这样设计。
即使是 java 这样的语言,遇到大量复杂的事件场景,依然会出现 Handler.OnEvent(event e) 这样的设计,这种形式与提供轻量级的 callback 相比是各有优劣的。
从语言本身来说,越是依赖于把一块有名字的内存改来改去的语言 /范式,可能越适用于前者,因为这种语言的捕获往往是 bugprone ( by ref,需要解决生命周期或者作用域) / poor perfomance ( by copy ),一般需要专门有个框架来给你处理这种事。当然有的语言和平台直接把框架做进基础库了。
而对 closure,pure function 等概念有精良设计的语言,就可以鼓励程序员多用 callback。括号就可以叠很多层。
还有一些觉得程序员很聪明的语言,会把这两种方式都拿出来给你用,你自己去管理到底怎么用 closure,到底用哪种方式。所以这些语言的程序员就可以把它们搅和在一起,写出彼此都看不懂的代码。
现在我们发现大部分程序员其实没有那么聪明,只能写好同步的代码,于是现代语言纷纷加上了 async 关键字,这样你就可以用同步的方式写异步的代码了(理想)。这件事的一个积极意义在于,大家终于发现自己一直在用扭曲的方式实现本来就应该由编译器 /runtime 干的事。