最近加班比较多,太监了一小下...
第三章 函数
感觉这章有些理想化,因为很多内容虽然会使代码好看,但是需要花费时间的(即使有很良好的编码习惯的人),具体的还是在各个要点中讨论。
1. 函数尽量短小
书中建议的是一个函数最多20行,一行150个字符,个人感觉150个字符不好数,直接用默认字体,但是不超过1024像素,也就是现在最差的屏幕也不需要横拉就能显示完全。20行封顶很难做到,虽然多层封装函数就行,但是就是又涉及那个时间问题,一般人有感觉都会一直写下去,其实我建议至少养成良好的空行习惯,每个空行分隔的部分,都是可以封装成短函数的部分,当然这样,函数层数太多也不行的,还是要平时尽量控制下。
2. 函数只做一件事
其实和上边的也类似,基本上只做一件事的函数基本长不了,所以也可以用空行来区分,但是呢,一个函数即使不能只做一件事,到那时这个函数必须做相关的几件事,而且可以通过文件名和注释等来明确函数的功能。
3. 函数都是一个抽象层级的
简单说就是函数划分的层次要合理,比如一个函数,要获取时间和地址信息,直接分两次获取就行了,而不能先获取时间,再获取城市的地址,再或者街道地址,再获取门牌号,后面三个应该封装成一个函数,这个也就是TO式程序。(TO)为了获取信息,要获取时间和地址。(TO)为了获取地址,需要获取城市,街道,门派。这个划分抽象层其实有时候很难,所以要设计期要设计好了,借助工具尽量划分模块。
4. switch语句
switch的存在基本就说明他不能满足只做一件事,所以呢,一般一个包含switch的函数只包含switch就行,或者用设计模式中的工厂模式,用抽象工厂来隐藏switch,用工厂的接口来分配工作。
5.使用描述性的名称,具体看上一章就行。
6.函数参数越少越好
虽然作者建议最好没有参数最好,但是大家都知道,这个只是面向对象的情况,只要类设计的好,成员函数都用成员变量,那样就零函数参数了,但是对于初始化函数,set函数,和一些需要外部输入的函数,还是需要一个参数两个参数的,比如fileOpen。如果一个函数有很多函数,就考虑封装成一个类。可变参数列表也是这样的。
7. 函数无副作用
函数只做一件事,但是可能改变了多个成员,这样就可能导致副作用。比如一个函数是确认密码正确然后执行初始化,一定不能单纯命名为checkpassword,当然这个函数可能是违法了只做一个事的原则。
8.分隔指令
感觉这个也是只做一件事的特殊情况,if(set("username","LUAN"))改成if(attrubuteExists("username")){setAttribute("username","LUAN');}
9. 使用异常处理代替返回错误码
这个容易理解,因为错误处理就是一件事,但是很多新人没有使用异常处理的习惯,比如我(笑),我建议就是至少把错误封装成一个专门的函数或者宏。
10. 结构化编程
函数一个入口,一个出口,这样基本职能有一个return,不能有break,continue,不过做到这点基本很难,作者都承认这个作用不大了(笑),不过咱们满足上面的一些条件,基本这些问题比较少,也没大影响。