写点什么

代码方法长度与母语的关系

用户头像
sdutyq
关注
发布于: 2021 年 03 月 16 日

代码块与小方法比较

比如我们有如下逻辑,先做第一件事,再做第二件事,代码如下:

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(){    //先做第一件事    //再做第二件事}其实就等于英国语系的人看到下面的代码void doSomething(){    doFirstThing();    doSecondThing();}
复制代码

生活中的场景举例

比如我们有如下逻辑,把大象放入冰箱。大家都知道答案,先做一个大冰箱,然后把大象放进去。

第一种代码如下:

void fixElephantProblem(){    //先造一个大冰箱    xxxxxxxxxxxxxxxxxxxxxx;    xxxxxxxxxxxxxxxxxxxxxxxxx;    xxxxxxxxxxxxxxxxx;
//再把大象放入冰箱 xxxxxxxxxx; xxxxxxxxxxxxxxxxx; xxxxxxxxxx;}
复制代码

抽成小方法的写法:

void fixElephantProblem(){    buildBigRefrigerator();    putElephantInRefrigerator();}
void buildBigRefrigerator(){ xxxxxxxxxxxxxxxxxxxxxx; xxxxxxxxxxxxxxxxxxxxxxxxx; xxxxxxxxxxxxxxxxx;}
void putElephantInRefrigerator(){ xxxxxxxxxx; xxxxxxxxxxxxxxxxx; xxxxxxxxxx;}
复制代码

上面两种写法本质上,都是做了小方法的抽取的,知识阅读的方法不同。人脑更容易理解同一等级描述过程(方法),比如怎么把大象放入冰箱,如果描述为先找铁矿...此处省去 100 字...然后再造铁...做出铁板..挖煤..发电..造冰箱,听者很难抓住重点到底想干嘛。同等级的抽象更好听懂是因为人脑的思考方式就是如此。

可以参考《先考虑逻辑再写代码》,函数读懂的重点就是表述是统一抽象等级的语句。只不过很多中国程序员其实是用注释+代码块表示小方法而已。两者的优劣是:小方法更显示方便的体现入参出参,代码块离上下文更近更方便阅读,总体来看还是小方法更好些,如果英文更熟练推荐还是小方法。

注:本文方法为了表意方便,未体现方法入参和返回值。


发布于: 2021 年 03 月 16 日阅读数: 12
用户头像

sdutyq

关注

还未添加个人签名 2019.10.15 加入

还未添加个人简介

评论

发布
暂无评论
代码方法长度与母语的关系