码迷,mamicode.com
首页 > 其他好文 > 详细

有时候没必要用回调

时间:2015-05-16 20:38:37      阅读:116      评论:0      收藏:0      [点我收藏+]

标签:

  回调是个好东西。它可以让程序变得更灵活,模块与模块之间的代码更加隔离,尤其写异步逻辑的时候用回调写起来会很方便。在很长一段时间里我经常喜欢给自己的代码设计回调。比如当模块A的某段逻辑中需要执行模块B的函数,而这两个模块在语义上给人感觉没什么关联时,我就会在A的逻辑中安插回调,让B的函数注册这个回调。感觉这样代码更有设计感,更符合面向对象的风格。

 

  但如今写上层逻辑写多了之后,我这个喜好有了改变。如今在上面的情景里,如果模块A和模块B都在同一层,尤其是两者都在业务层的时候,我会倾向于在A的代码里直接调用B的函数。这样的好处是读A的代码时可以很快很清楚的知道A的逻辑都干了啥,每一步的时序是什么——如果逻辑有时序上的要求,这个好处会更明显;而且这样也可以少写几行代码——包括定义回调和注册回调的代码。

 

  那什么时候用回调会更好呢?目前我遇到的合适情况有三种:

 

  一种情况是模块A是库或框架,模块B是上层逻辑。一方面,所有对代码质量有点追求的程序员应该都有一个共识——上层代码不要污染底层代码;另一方面,底层——尤其是对外发布的库和框架是无法预知上层在某一个时间点具体要干什么事的,所以底层只能在指定的时间点给上层一个回调,具体要干什么由上层决定。

 

  二是A逻辑的某个时间点要做的事情太多,直接在A代码里写的话能写上很多很多行,而且这些事情在语义上相互之间并没什么关联,时序上也没有要求。其实这种情况下A相对于B已经具有了库的性质。

 

  三是A和B之间是在某种异步逻辑中相互协同工作,尤其这两个模块分别由不同的程序员甚至是不同部门在维护。通常这种时候A是框架或系统,B是上层逻辑。典型的场景是异步I/O。

 

  这样说起来,似乎只有一种情况,那就是当A相对于B处于更底层时,才适合用回调。

 

  于是在项目里,有时候问题就变成了:A和B,哪个更底层?还是都在同一层?这个问题的答案偶尔并不是那么显而易见。一是和代码模块设计的清晰度有关,二是每个程序员的理解有时候不太一样,三是和个人经验也有点关系。这个话题就不展开写了。

有时候没必要用回调

标签:

原文地址:http://blog.csdn.net/zzxiang1985/article/details/45770097

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!