第十四章:组织直线型代码
14.1 必须有明确顺序的语句:顺序与逻辑关系和依赖性有关,逻辑上需要顺序排列的,后面对前面有依赖的需要顺序组织;组织那些有顺序逻辑的语句,最好用名字、参数、注释等方法来显示的表明语句之间的联系。
14.2 顺序无关的语句:就近原则,声明和使用靠拢。这样能增强代码的可阅读性。(局部聚拢)
第十五章:使用条件语句
条件控制:if else case switch
15.1 if语句:首先处理正常逻辑和非正常逻辑取决于实际情况,通常先处理正常逻辑,在逻辑非常复杂的时候可以考虑使用卫语句或者重新梳理逻辑来减少if嵌套层数。if嵌套层数过多,不利于代码阅读,复杂度提高。有的时候我们根据se或者架构师的文档平铺直叙的开发会造成多层if嵌套,这个时候我们可以先理解下se和架构师的意图,重新编排逻辑以降低复杂度
15.2 case:为case选择有效的排列顺序,正常的case情况排在前,频率高的case排在前;如果case中的处理逻辑非常复杂,可以考虑将这些语句封装成过程。 c++语言的case中要记得加break,default条件可以用来检测错误,如果所有正常逻辑没覆盖到,跑到default分支里去了,说明出现了某种异常。
第十六章:控制循环
while、 for 、do while
16.1 选择循环的种类
计数循环:执行次数一定
连续求值的循环:迭代次数不一定
无线循环
迭代器循环:容器迭代元素
当不知道要循环多少次的时候使用循环while,当循环固定次数的时候建议使用for
16.2 循环控制:
注意事项:循环语句用大括号包起来,循环变量取名要有意义,循环语句最好不超过10行,嵌套层数小于2;循环上限或者退出界限一定要判断好,不要造成下标越界踩内存的情况。
16.3 轻松创建循环:有内到外,先写需要循环的语句,在用循环将语句包括起来。
16.4 循环与数组的关系:许多循环都是用来操作数组的
第十七章:不常见的控制结构
递归、goto
17.1 子程序中多出返回: 子程序中有多处return的情况,可以进一步排查下是否能将多处return合为一处,通过使用卫语句和逻辑整改的方法; 尽量减少逻辑重复,嵌套过深场景。
17.2 递归:选择性使用递归语句,除非能优雅的解决问题。递归在代码可读性上表现不太好,但是有的问题使用递归能优雅的解决。
递归对处理复杂逻辑的时候是很有价值的,比如走迷宫(算法类用的多),实际开发过程中,一般的逻辑都可以用循环代替递归,建议能用循环就不要用递归。
使用递归注意事项:确保递归能够停止(退出条件), 使用安全计数来防止无穷递归;把递归限制在一个子程序内(递归语句不要过长);注意考虑栈空间,防止栈溢出。
17.4 goto
坏处:goto影响逻辑的复杂度,代码的易读性,排版格式和编译器优化
好处:减少代码执行量,直接跳转可以跳过不需要执行的代码;跳转到指定位置,可以设计成try catch finally的处理方式,设计成异常处理;
c++代码编写过程中,建议不要写goto代码,需要用到goto逻辑的地方其实都是可以通过其他语句来替换的。
第十八章: 表驱动法
表驱动法是一种编程模式,从表里查找信息而不使用逻辑语句 if else
18.1 表驱动法使用总则:在适当条件下,使用表驱动法可以使得逻辑更简单、更容易修改。
访问表的方法:直接访问、索引访问、阶梯访问
表中存储的内容: 数据或者动作(函数)
18.2 直接访问表:将要使用的数据算好后放入表中,需要的时候直接取(难度在于设计表)
18.3 索引访问表:先用一个基本数据类型的数据从一张索引表中查出一个键值,然后在用这个键查出你感兴趣的主数据。主表(索引表)+ 主数据表
18.4 阶梯访问表:类似于索引表,索引的键为一个过程范围,而不是一个具体的kay值。阶梯要注意阶梯的端点。
第十九章:一般控制问题
19.1 布尔表达式
1.明确的使用true or false 而不是0 或 1
2. 把复杂的布尔表达式做成布尔函数,用一个好的命名来表示布尔结果
3. if判断的布尔表达式中;肯定的表达式比否定的表达式好。
4. 用括号使多个布尔表达式之间连接关系更清晰
5. 编译器对布尔表达式的理解可能不同,有的可能把所有布尔求出来在计算布尔值,有的可能是采用短路的方式,如果前一个布尔满足了条件后一个布尔就不执行了。
6.常量放在==符号左边可以避免因为将==错误写成=而带来的错误
19.2 复合语句:通过大括号包起来
19.3 空语句:用大括号代替分号;使用大括号的好处是避免错误、并且可以显示的声明这个是一个空语句
19.4 屈服危险的深层嵌套:不超过3层; 可以采用改变逻辑、使用卫语句、封装子函数等方法来简化深层嵌套。
19.5 结构化编程:三种基本的结构化编程
顺序,选择,循环
19.6 控制结构和复杂度
控制流是影响复杂度的绝大因素,将复杂语句提取为另一个子程序,不会降低整体的复杂度,但是会降低同一时刻所需关注的复杂度
总结:布尔是最基本的判读逻辑,如果布尔表达式的逻辑过于复杂或者布尔表达式中的布尔逻辑过多,可以考虑将布尔表达式单独封装成一个子函数或者一个语句,用一个具有实际意义的名字来接收这个布尔结果值。 应该避免写出嵌套过深的代码,如果嵌套过深,最方便的方法就是提取语句进行封装,如果时间允许可以分析使用卫语句或者改变逻辑来减少嵌套。 降低代码的复杂度是提高代码水平的关键。