之前为了写node.js的服务器端,根据回调式的编程风格,设计了一种OperationNode(简称Op,而不是On,防歧义)概念,然后用它写了很多代码。不过后来我的服务器端就越写越慢,越来越没有干劲,明明目标很清楚,实现也完全不难,但就是不想动手。怎么办呢,我停下来仔细品味了一下当时的心情,好象是因为代码写不优雅,自己不甘心,觉得写起来没劲,或者是隐约感觉到自己在一条错误的道路上行走,本能的不愿意快走。
那好,”怎么写你(我)才会开心嘛,你写个样子出来看看呗“。这是我设计代码的时候经常用到的一种战术,就是先写一些(有时是很多甚至全部)上层代码,感觉这么写舒服了,再去想怎么实现底层,才能让刚才写的代码生效。我看了看我的卡牌游戏里经常出现的询问玩家是否怎样怎样的AskYesNoOp,至今为止的语法是这样的:
// 询问意向,时限10秒,超时等于选否
this.game.pushOp( new AskYesNoOp( opts, “是否发动场地效果?”, 10 ), function( error, result ){
if ( result ){
/* … */
}else{
/* … */
}
} );
选是的话,后面还要套很多层逻辑,而且每层逻辑都要新写一个Op类,挺痛苦的。理想的写法显然是
var result = asyncAskYesNo( opts, “…”, 10 ) ;
switch ( result ){
case ASK_YES_NO_RESULT_YES:
break;
case ASK_YES_NO_RESULT_NO:
case ASK_YES_NO_RESULT_TIMEOUT:
break;
}
所以我需要异步功能同步写法。
这种写法我以前常常写的,在lua里,这个叫coroutine,协程。
稍微搜了一下,node.js里就有Fibers库来实现协程功能嘛,安装也很简单,功能也和lua的一样。好,接下来就是逐步割爱换下我的Op,再设计一套coroutine的包装了。估计最后是Op管理大的逻辑,coroutine负责随处可见的琐碎异步。
以前我是听说C++语言里没有协程,所以还挺开心自己掌握了一个少数人可用的秘技,后来搜了一下服务器部分的coroutine,似乎也是有一些的。嗯,又一个扑空了的蓝海,唉。
C++11加入的携程和匿名函数= = Lua很早就支持了。哈哈哈,不算秘籍啦~~
看node.js的协程库时,还顺便学到了库里示例包装类用到的那个“future模式”。赚好多~哈哈
不愧是我在lua时代就爱用的协程,在现在的node.js项目里小改几行就实现了异步事件同步写法,开心!
我太强啦,哇哈哈哈哈哈~(难得这么开心,让我笑一会儿先)