《编程匠艺》之代码的表面

第一部分: 处理代码的细节(代码的表面)

处理代码的细节,主要分为如下的几个方向,check:

  1. 善于防守, 考虑代码的健壮性.
  2. 好的样式.精心布局.
  3. 为文件和函数以及各部分起个好名字.
  4. 良好的注释.
  5. 错误处理,处理好可能会出现的错误.保证不崩溃.
  6. 逻辑清晰,可理解.

1. 防御性

防御性的诱因:

  1. 恶意用户
  2. 客户端错误的使用
  3. 运行环境不完整
  4. 外部运行库问题

如果可以使用函数局部变量,就不要使用全局变量.如果能使用循环体内的变量,就不使用函数级变量.

防御要义:

  1. 使用合适的风格和规范.
  2. 逻辑清晰, 而不是简洁.
  3. 开启合适的警告级别.
  4. 使用静态lint检查工具.
  5. 检查返回值,适当的处理之.
  6. 合理使用日志以及级别.
  7. 谨慎的进行类型转换.
  8. 适当的约束,检查数组边界, 指针

Q & A:

  1. 为每个修复的bug最好都做一个单元测试.

2. 精心布局

  1. 调整好风格, 调整好tab宽度等.

3. 起个好名字

需要命名的对象有:

  1. 变量
  2. 函数
  3. 类型
  4. 包名字
  5. 文件名
  • 为名字起好名字的关键是理解所命名的对象.
  • 进行命名时,重点放在清晰而非简洁上.但是如果是作为循环计数器,那么可以使用短的变量.
  • 命名函数时,因为函数是方法, 那么最好是一个动词开头, 表名某种逻辑功能.
  • 宏命名时,全大写, 并以项目名为前缀.
  • 文件名尽可能描述文件功能;可以拆分文件中的多个逻辑.
  • 命名要保持一致.
  • 起名字时,要确定其范围, 容易有明确的描述.

4. 编写自说明的代码技巧

  1. 不要编写需要外部文档支持的代码, 因为对于一个大型的项目, 维护文档本身就是一个很大的挑战, 尤其是代码在不断的迭代中.
  2. 那么使用注释是一个好主意么?No, 散落在各处的注释, 并不是好的自说明.
  3. 好的代码如同一本组织良好的书.
    • 前言对应文件的代码注释头, 说明文件的内容,作用,属于的项目等.
    • 目录对应文件中的函数,类,变量的列表(现代软件可以使用ide)
    • 部分对应一个代码部分.不推荐单文件过大, 可以把几个源文件打包成一个"部分",代表一个大的逻辑部分.
    • 章对应某一个源文件, 他是功能独立完整的逻辑函数集合.
    • 段落对应每个函数的代码组织,如变量在最前面等.
    • 语句对应每条语句.
  4. 使用好的样式编写简单的代码
    • 让正常的流程贯穿代码,处理错误或者正确的分支总是放在前面.
    • 避免过多的嵌套.
    • 谨慎的优化代码,如果不易理解, 要清晰的注释.
  5. 选择有意义的名称
    • 所有的变量, 函数, 文件名, 类型, 都应该有准确的含义.
  6. 分解为原子函数
    • 一个函数,一种操作.观察函数名字就能知道函数功能.
    • 保持简短.
  7. 使用合适的类型
    • 如变量不包含负值,那么就直接使用uint
    • 如果变量不可修改, 那么就用const修饰
  8. 突出重要的代码
    • 隐藏不重要的信息和代码
    • 限制嵌套的条件语句的数量.避免重要的处理条件被嵌套隐藏.
  9. 分组相关信息
    • 通过使用语言的机制,将相关信息分组, 在go中, 就是包.在c中, 就是文件.
  10. 恰当的处理错误
    • 不要返回无意义的错误, 每一层处理自己的错误.如在访问磁盘的代码中出现错误,那么这一层就处理磁盘错误,然后向上抛出错误, 上层可能处理的是打开文件错误等.
  11. 对于一个自描述的代码,还需要什么什么文档?
    • 需要一个描述整个系统和作用的文档
    • 系统的结构概要文档和设计文档
    • 测试规范

5. 编写合适的注释

  1. 只需要编写够用的注释,过犹不及.
  2. 对于复杂的地方, 要解释为什么这么做更重要, 至于做了什么, 如果是自说明的代码, 已经交代的很清楚了.
  3. 不要文档化差劲的代码, 重写它.可以使用单元测试来保证重写后不会破坏功能.
  4. 注释应该活在现在, 不要描述已经改变的事情, 也不要讲述某个事物过去是做什么的.
  5. 当你修改代码时,维护周边的所有注释.

6. 处理出现的错误

  1. 错误产生的原因总结一下归为三种:

    • 用户错误,用户错误的输入或者操作等
    • 程序员错误
    • 意外情况
  2. 为了控制代码的错误,我们需要做到:
    • 当出现错误时提出错误
    • 检测所有可能的错误报告
    • 恰当的处理错误
    • 传播我们不能处理的错误
  3. 错误报告机制
    • 不报告,比如出现错误, 就中止,但是不是好主意.
    • 使用返回值
    • 使用错误状态变量,如c语言的errno, 不要用这种方式
    • 异常
    • 使用信号
  4. 处理错误
    • 何时处理错误
    • 尽可能早的处理(尽可能晚的处理) ,没有好坏, 折中
  5. 错误后的清理的方法

原文地址:https://www.cnblogs.com/yhp-smarthome/p/11074552.html

时间: 2024-09-28 16:28:13

《编程匠艺》之代码的表面的相关文章

《编程匠艺》读书笔记

<编程匠艺>读书笔记之一 <编程匠艺>读书笔记之二 <编程匠艺>读书笔记之三 <编程匠艺>读书笔记之四 <编程匠艺>读书笔记之五 <编程匠艺>读书笔记之六 <编程匠艺>读书笔记之七 <编程匠艺>读书笔记之八 <编程匠艺>读书笔记之九 <编程匠艺>读书笔记之十 <编程匠艺>读书笔记之十一 <编程匠艺>读书笔记之十二 <编程匠艺>读书笔记之十三 <编

《编程匠艺》之开发工具与技巧

第二部分: 代码的神秘生命(代码开发的技术与技巧) 1. 欲善其事,先利其器(使用工具) 尽可能全面的了解你的常用工具, 为此投入的时间是值得的. 使用工具发挥作用: 了解它能做什么 学习如何驾驭它 了解它适合什么任务 检查它是否可用 找到了解更多信息的途径 工具链的组成 源代码编辑工具 代码编辑器 代码处理工具(diff比较工具, sed流查找修改工具, awk样式匹配工具, grep正则匹配工具, find/locate文件查找工具) 代码浏览工具 版本控制工具 源代码生成工具 源代码美化工

《编程匠艺》之软件的架构与改良

第三部分: 代码的形成过程(软件的架构) 1. 崇尚设计(如何做良好的软件设计) 软件设计的层次 系统体系结构(整体系统和子系统,以及子系统之间的连接方式) 模块于组件 类和数据类型 函数 设计良好的特征 简洁和优雅 模块化(高内聚,低耦合) 良好的接口(为了创建良好的接口,可以遵循下面的步骤:) 确定客户端, 了解它的需求 确定供应端, 了解它的能力 推断所需的接口类型(函数, 类, 网络协议?) 确定操作的性质(究竟需要提供什么样的功能?) 可扩展性(需要仔细评估现在的功能, 以后可能有的功

Linux - Unix环境高级编程(第三版) 代码编译

Unix环境高级编程(第三版) 代码编译 本文地址:http://blog.csdn.net/caroline_wendy 时间:2014.10.2 1. 下载代码:http://www.apuebook.com/code3e.html 2. 安装依赖库:sudo apt-get install libbsd-dev  3. 进入下载目录make 4. 复制头文件和动态链接库 sudo cp ./include/apue.h /usr/include/ sudo cp ./lib/libapue

编程算法 - 丑数 代码(C)

丑数 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 我们把只包含因子2, 3 和 5的数称作丑数. 求按从小到大的顺序的第5个丑数. 可以设置一个数组包含所需要的丑数, 依次比较乘以2, 乘以3, 乘以5的最小的数, 最后返回结果. 如第5个丑数是5, 如1, 2, 3, 4(2*2), 5均是丑数. 代码: /* * main.cpp * * Created on: 2014.6.12 * Author: Spike */ /*ecli

编程算法 - 硬币问题 代码(C)

硬币问题 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 有1, 5, 10, 50, 100, 500元硬币各若干枚, 现在要用这些硬币来支付A元, 最少需要多少枚硬币? 假定本题至少存在一种支付方案. 使用贪心算法, 优先选用最大的硬币, 并不断的调整硬币的数量. 代码: /* * main.cpp * * Created on: 2014.7.17 * Author: spike */ /*eclipse cdt, gcc 4.8.1

编程算法 - 区间调度问题 代码(C)

区间调度问题 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 有n项工作, 每项工作分别在s时间开始, 在t时间结束. 对于每项工作可以选择参与与否, 如果参与, 则全程参与. 参与时间段不能重叠, 包括起始结束瞬间也不能重叠. 求最多能参与多少项工作? 使用贪心法, 策略是在可选工作中, 每次都选取结束时间最早的工作. 代码: /* * main.cpp * * Created on: 2014.7.17 * Author: spike

编程算法 - 二分图判定 代码(C)

二分图判定 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 给定一个具有n个顶点的图. 要给图上每个顶点染色, 并且要使相邻的顶点颜色不同.  是否能最多用2种颜色进行染色. 没有重边和闭环. 即二分图问题. 使用深度优先搜索(dfs), 把顶点染成c, 然后相邻边染成-c. 如果相邻边被染色过, 且相同, 则图不是二分图; 如果所有边都被染色, 并且互不相同, 则是二分图. 进行多次搜索, 避免非连通图. 代码: /* * CppPrim

编程算法 - 快速排序算法 代码(C)

快速排序算法 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 经典的快速排序算法, 作为一个编程者, 任何时候都要完整的手写. 代码: /* * main.cpp * * Created on: 2014.6.12 * Author: Spike */ /*eclipse cdt, gcc 4.8.1*/ #include <stdio.h> #include <stdlib.h> int RandomInRange(int min,