Posted on 2013-05-19 11:04 
S.l.e!ep.¢% 阅读(2431) 
评论(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 时, 要缓存当前所有的临时变量, 在对方服务器返回协议后, 再恢复这些临时变量, 这样才可以真正做到
"远程调用 同步的写法"
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
说了大半天, 还是没有解决方案, 只是一时突发的一个想法, 记录之