你可以尝试打开一篇中文文章,大概几秒钟就能速读完了解大概;再打开一篇英文文章,需要多少时间呢?可能需要几十倍的时间。代码长度是一个永恒的争议,目前主流观点认为应该抽取小方法,消除长方法。在实践中,我发现其实抽取小方法和代码块的抉择和母语是否是英语有一定关系,作为英语不如汉语熟练的中国人,阅读英语方法名并不如中文注释来的直接(类比前面阅读中英文文章速读对比),下面展开叙述下这个想法。
代码块与小方法比较
比如我们有如下逻辑,先做第一件事,再做第二件事,代码如下: ``` void doSomething(){ //先做第一件事 xxxxxxxxxxxxxxxxxxxxxx; xxxxxxxxxxxxxxxxxxxxxxxxx; xxxxxxxxxxxxxxxxx;
//再做第二件事
xxxxxxxxxx;
xxxxxxxxxxxxxxxxx;
xxxxxxxxxx;
} 大部分经典书籍包括Uncle.Bob的《clean code》,或Martin Fowler的《重构》都认为应该抽出更小的方法,上面代码应该写成如下的样子:
void doSomething (){ doFirstThing(); doSecondThing(); }
void doFirstThing(){ xxxxxxxxxxxxxxxxxxxxxx; xxxxxxxxxxxxxxxxxxxxxxxxx; xxxxxxxxxxxxxxxxx; }
void doSecondThing(){ xxxxxxxxxx; xxxxxxxxxxxxxxxxx; xxxxxxxxxx; } ``` 我认为两种写法都可以接受,甚至我遇到很多人认为第一种写法更容易看懂。原因是是因为我们母语是汉语,对汉语阅读可以一目十行,通过注释很一眼就能看懂代码段的意思(我们大部分中文程序员潜意识其实是把注释当做方法名来看的),如下,我们脑中还原了小方法结构。
``` void doSomething(){ //先做第一件事(阅读的时候脑子会认为下面的代码段是一个方法,注释就是方法名) xxxxxxxxxxxxxxxxxxxxxx; xxxxxxxxxxxxxxxxxxxxxxxxx; xxxxxxxxxxxxxxxxx;
//再做第二件事(阅读的时候脑子会认为下面的代码段是一个方法,注释就是方法名)
xxxxxxxxxx;
xxxxxxxxxxxxxxxxx;
xxxxxxxxxx;
} ```
而英文母语的人阅读英语小方法的方法名就等同于阅读第一种写法的中文注释一样自然。所以才会出现这样的关于小方法的悖论,但其实大家都是喜欢小方法的,我们写的代码段约等于小方法了。
中文语系和英语语系阅读代码对比总结
中国人看第一种写法,其实已经把每个注释当做小方法阅读了,先看注释,再看代码块,代码块其实就是小方法的实现:
中国人看到的
void doSomething(){ //先做第一件事 //再做第二件事 }
其实就等于英国语系的人看到下面的代码 void doSomething(){ doFirstThing(); doSecondThing(); }
提升代码块至小方法
注释虽然充当了方法名,但方法签名还有入参和出参。代码块不能通过语法检查器来保证不同代码块之间是弱耦合的,而抽取的小方法是可以约束不同的方法一定是弱耦合的。
因为每个方法只可以访问传递给它的入参。
而代码块是可以访问到前面出现过的所有变量。
并且代码块不能复用,小方法也更有利于复用,所以小方法其实是优于代码块的。
我们中文语系如何能够突破语言障碍,能够熟练使用小方法,阅读者也能舒服的阅读呢?不太可能短时间提升英语到中文的水平,有一个方法就是约定术语,方法名只使用我们约定的术语,这样我们只要熟练掌握术语,就能相对愉快的阅读英文小方法了。