今天公司给我们培训的代码的简洁之道,讲怎样编写出简洁的代码以及需要注意的地方,下面是我做的一些笔记。
什么样的代码是简洁的代码
让人最快读懂能理解的代码就是简洁的代码。
代码的坏味道
1.重复的代码
2.过长的方法
3.过大的类
4.过长的参数列
5.散弹式修改
6.不同的类别使用switch
7.临时变量
8.过多的抽象和代理
9.无用多余的方法代码
这些坏味道的代码往往会造成代码很多问题,如:
1.难于变化
2.难于重用
3.设计过于复杂,不利于当前编码
4.同样的逻辑多处出现,没有进行抽象的统一
5.命名混乱,结构杂乱,难以阅读和理解
6.难于测试和验证
公司制定的十三大原则
4不超
- 函数圈复杂度不超过15
- 函数代码行数不超过50行
- 函数参数不超过7个
- 函数嵌套层次不超过3层
2个一
- 每一行代码只表达一件事
- 每个变量只用于单一用途
7禁止
- 函数/变量命名要有真实准确的意义 (禁止含有Not、And、OR;禁止具有歧义的命名)
- 禁止使用do/while语句
- 禁止使用continue语句
- 禁止使用魔法数字
- 禁止使用三元表达式
- 禁止在if语句中使用运算表达式
- 禁止提交SVN的代码中含有死代码
编写函数注意的地方。
1.使用卫函数:卫函数是指减少程序的复杂度提前返回输出。
2.函数、变量的命名需要表达真实意图,不能词不达意。达到让人读方法名就能知道这个函数是做什么用的效果。
3.如果是一个public函数,尽量保持函数的单一抽象层次原则。即将这个函数抽离分解成若干个子函数组成,每个函数只做一件事情。这样的目的可以使得代码变得简洁易懂。
如下面的代码。
If(!readOnly){…}可以使用卫函数,改成if(readOnly){return };然后对函数进行抽象,可以抽成三部分,第一部分判断是否为只读,第二部门扩容,第三部门添加函数。如下:
这样代码就显得很简洁了,让人一眼就能明白是做什么的。最后一个函数addElement()中只有一条语句也单独的抽成一个函数,这样做的好处是保证的函数的单一抽象层次原则。像书的目录一样,整个add()方法中都是函数组成,显得更加的美观,并且抽成函数可以通过函数名就能知道这个函数是做什么的,比直接写语句更加的直观。
之前的理解是代码尽量多写注释,但是听完课之后理解到不要写无用的注释。当你想通过注释来说明一段代码是做什么的时候也许你就应该将其抽离出成函数,通过函数名来解释这个函数的作用,这样使得代码更加简洁。另外一段代码很乱,就不要给它再增加注释了,重写这个方法吧。
函数的四个一原则
一个变量只做一个用途
一行代码只做一件事
一个循环只做一件事
一个函数只做一件事
代码的圈复杂度计算
1.进入函数,开始执行代码 +1
2.遇关键字(if /else if /for /while /&& /|| ) +1
3.Switch的每个case/default +1
4.三元运算 a? b:c +1
5.Catch +1
6.Default +1
重构
重构就是在不改变软件系统外部行为的前提下,改善它的内部结构。
1、不改变外部行为
2、只改善内部结构——使其程序的设计模式和架构更趋合理,提高软件的扩展性和维护性
重构的目的:
1.找出程序中的错误
2.帮助我们提高变成速度
3.帮助我们提高设计和编码水平
重构的时机
1.增加新功能时一并重构,增加功能前需要理解修改的代码,如果发现代码不易于理解无法轻松的增加功能,此时就需要对代码进行重构
2.修补错误时一并重构,通过重构改善代码结构,帮助我们找到bug
3.Review 代码时一并重构
注意当代码实在是太混乱时请不要重构了,直接重写代码吧,还有当项目即将结束时不建议重构代码,因为已经没有时间来重构了
重构的对象:即哪些代码需要重构。
1.重复的代码,重复的代码需要提取出来形成函数以便于多处调用。
2.冗长的代码块,需要进行分析抽离成若干个简洁的函数实现。
3.循环过长和嵌套过深的代码,循环内部的复杂 代码往往可以转成子程序。
4.子程序命名不当,需要对子程序重新命名,拆分或合并。
5.难以理解的代码,需要进行整理流程并进行模块化。
课件:https://pan.baidu.com/s/1ICbLWJjzgiar6rr4wRV0kw
提取码:hpf3
欢迎交流获取更多资源。