Posted on 2013-05-19 11:04
S.l.e!ep.¢% 阅读(2395)
评论(6) 编辑 收藏 引用 所属分类:
Other
在写网络服务器的逻辑时,常常避免不了需要向 另一个服务器 发送协议, 直到等待返回成功, 再继续下一步的操作
这时候, 代码可能是这样的
RemoteObj.call( PROTOCOL_A, param, callBackFun );
注:
PROTOCOL_A 是协议号
param 是参数
callBackFun 是回调函数
甚至有时还需要写 onError / onTimeout 之类的回调
这样, 一个业务逻辑被"分割"在两个甚至多个函数内去写
再假设,
向 服务器A 请求, 需要等待 服务器A 返回成功后, 取到数据, 再向 服务器B 请求, 需要等待 服务器B 返回成功后, ...... (后面省略10000字)
这样的话,
在写业务逻辑时, 思路常常被中断, :) 有时写完一个回调函数, 前面考虑的异常已经忘记了
在看业务逻辑时, 思绪在不同的函数间 跳来跳去, 容易看错或看漏东西.
我还假设, 如果代码只需要这样写
Response resp = RemoteObj.call( PROTOCOL_A, param);
if ( resp.RetCode == SUCCESS )
......
call 函数内部其实是一个远程调用, 发协议到其它服务器, 等其返回协议后, 直接在 Response 就可以取 对方返回的协议内容, 当然 timeout
Response 也应该返回错误码
再简单一点说, 就是写 远程调用不需要 callback, 不需要实现 onError / onTimeout 之类的东西
写法就跟调用一个函数一样方便
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
现阶段, 似乎对 "远程调用 同步的写法" 并没有很好的解决方案,
网上看了些远程调用框架, 也避免不了要写 callback
需要实现也可以, 但并不是优雅的实现方案
例如:
可以在 call() 里面等待一个信号, 另一个线程等待接受协议返回后, 再激活这个信号, 但总不能一个 call() 调用就阻塞一条线程吧?
还可以 用 throw expcetion / long jump / goto 来实现调用 call() 发完协议后先 return , 等协议返回后, 再继续 goto到 call() 之后的代码, 这是最不优雅的做法了
再可以 用 一堆宏把 callback / ontimeout / onerror 之类的函数"屏蔽"掉, 也不是优雅的做法, 用宏实现, 有时一个简单的语法错, 可能都要找半天
甚至可以 弄自己的一套语法解析, 自己写一个语法解析的工具, 写完代码后, 再运行去 解析代码里的所有 callback , 再换成 callback / ontimeout / onerror 的函数
无论哪种实现, 都要注意, 在调用 callback 时, 要缓存当前所有的临时变量, 在对方服务器返回协议后, 再恢复这些临时变量, 这样才可以真正做到
"远程调用 同步的写法"
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
说了大半天, 还是没有解决方案, 只是一时突发的一个想法, 记录之