代码整洁之道-函数
什么是一个好的函数或者叫方法,只要能让函数明确的表达其意图,让读者能够一眼看出是一个怎样的函数,其接收什么参数,返回什么结果,做了什么事情。能做到这,大概就能算作一个好的函数了,看上去很简单。那么问题来了,如果做到这点呢?
1. 短小
想象一下,一个击败航的复杂函数和一个只有十几行的函数,哪一个能够让人一眼看出其意图并理解其行为呢?显然是后者。当然,现在大多数语言完全可以将几百行代码写到一行,那样毫无格式的代码只会让人难以理解。
2.代码块和缩进
对于if、else等语句来说,其中包含的代码块最好只有一行,而这一行应该是一个函数调用语句,让读者可以一看看出其意图
3.函数名
一个好的函数名十分重要,如何定义一个好的函数名呢?只可意会。如果一个函数,你仅看函数名,就能明白他是做了什么,返回什么,那它就是一个好的函数名了。
4.只做一件事
函数应该只做一件事,并且做好这一件事足矣。这个大家都承认吧,并且已经是一个共识了,但是说起来容易,做起来却并没有那么简单。那么如何确保函数只做一件事呢?我们可以尝试这在函数中再拆出一个函数来,当然,拆出的函数不能仅仅是将代码搬过去,它应该有自己的责任,能够对新的函数起一个好的函数名。如果不能再拆出这样的函数,那么他应该可以了。
5. 函数参数
最理想的参数数量是0,其次递增,3个参数就已经很多了。
就函数测试而言,没有参数的函数测试简直小菜一碟,若有了一个参数,就需要测试很多种组合,之后每多一个参数,测试的组合数量都是指数级增长。
就调用者而言,没有参数的函数直接调用即可,而有了参数就需要理解每一个参数是什么,也增加了调用者的时间。
如果函数的参数中存在布尔值,不好意思,并不推荐这样做,因为它明确的告诉调用者如果为true就会这样做,如果为false就会那样做。更好的做法是其拆分成两个函数。
同时,如果一个函数需要三个以上的参数,就可以考虑将其中的一些参数封装成类了。比如描绘笛卡尔坐标的x、y。
6.无副作用
副作用是函数的一个谎言,函数名承诺只做这一件事,但是他偷偷的做了其他事情。
比如,一个checkOrderStatus函数,明显它是在检查订单状态,但是如果它在检查的同时对状态进行了修改,就会让人很困惑,甚至在排查错误的时候,看到这样一个函数都不会点进去看。更好的做法是将其拆成两个函数。
7. 每个函数一个抽象层级
说起来很简单,我们在阅读代码时,往往采用自顶向下的顺序来看,如果每个函数都只处理自己所在层级的逻辑,阅读和维护就很舒服了。
这个虽然我觉得很有道理,但是我没看懂啊。
。。。等等
那么问题来了,如何写出符合这样规范的代码呢?
其实没有必要再一开始写的时候就按照规则来写,那样很容易打乱思路,甚至事倍功半。完全可以在写完后在返回来认真打磨、拆解函数、修改名称、消除重复代码等.