《代码大全》
读书笔记
软件工程
DOING
1 欢迎进入软件构建的世界
1.1 什么是软件构建
软件开发过程中的不同活动
- 定义问题
- 需求分析
- 规划构建
- 软件架构/高层设计
- 详细设计
- 编码与调试
- 单元测试
- 集成测试
- 集成
- 系统测试
- 保障维护
构建活动主要是编码与调试,但也涉及详细设计、规划构建、单元测试、集成、集成测试等其他活动。
1.2 软件构建为何如此重要
- 是软件开发的主要组成部分
- 是软件开发中的核心活动
- 把主要精力集中于构建活动,可以大大提高程序员的生产率
- 构建活动的产物-源代码-往往是对软件的唯一精确描述
- 构建活动是唯一一项确保会完成的工作
2 用隐喻来更充分地理解软件开发
2.1 隐喻的重要性
隐喻即是建模,其威力在生动性,让你把握整个概念。它能隐隐地暗示各种属性、关系以及需要补充查证的部分。不同的隐喻会有不同的启发能力(如钟摆和自由落体)。隐喻是对概念进行内在化和抽象的一种途径。
2.2 如何使用软件隐喻
隐喻的作用更像启示,而不是算法。
2.3 常见的软件隐喻
写作代码:不需要正规地做计划,可读性
培植系统:弱点在暗示人们无法对开发过程和方式进行任何直接的控制
系统生长:增量、迭代、自适应、演进
建造软件:暗示软件开发中存在多种阶段,需要仔细准备,并随着软件系统的大小类型不同,构建方法,阶段,内容也不一样
智慧工具箱:应用软件技术,因地制宜选用不同隐喻
隐喻可以组合,并不是互斥的
第3部分 变量
10 使用变量的一般事项
10.1 数据认知
掌握常见的数据结构
10.2 轻松掌握变量定义
- 隐式声明
- 有些语言支持隐式变量声明,显示声明更安全,解决方法:关闭隐式声明;声明全部的变量;遵循某种命名规则;检查变量名(使用静态分析工具)
10.3 变量初始化原则
问题
- 从未对变量赋值
- 变量值已经过期
- 变量的一部分被赋值,少赋值,多赋值(占用到其他内存)
建议
- 声明变量的时候初始化
- 在靠近变量第一次使用的位置初始化它
- 理想情况下,在靠近第一次使用变量的位置声明和定义该变量
- 在可能的情况下使用final或者const
- 特别注意计数器和累加器(重置的时候)
- 在类的构造函数里初始化该类的数据成员
- 检查是否需要重新初始化
- 一次性初始化具名常量:用可执行的代码来初始化变量
- 使用编译器设置来自动初始化所有变量
- 利用编译器的警告信息
- 检查输入参数的合法性
- 使用内存访问检查工具来检查错误的指针
- 在程序开始时初始化工作内存
- 可以预先填充内存为可预料的值
- 偶尔改变填充值,可能发现其他错误
- 可以让程序在启动时初始化工作内存
10.4 作用域
作用域或可见性是指的变量在程序内可见和可引用的范围
- 使变量引用局部化
- 将引用点集中起来,避免中间被误改,可读性更好,可以采用跨度来度量(变量的两次引用之间的间隔行数,衡量变量的集中度)
- 尽可能缩短变量的存活时间
- 存活时间(一个变量存在期间所跨越的语句总数,引用的第一句到最后一句),减少攻击窗口,代码更可读可理解
减少作用域的一般原则
- 在循环开始之前再去初始化该循环里使用的变量,而不是在该循环所属的子程序的开始处初始化这些变量
- 直到变量即将被初始化时再为其赋值
- 把相关语句放到一起
- 把相关语句组提取成单独的子程序
- 开始前采用最严格的可见性,然后根据需要扩展变量的作用域
- 需要均衡 方便性 和 智力可管理性
持续性
- 特定代码段或子程序的生命期,如for循环内的变量
- 较长时间或一直运行,new产生的堆对象
- 程序的生命期,全局对象,static对象
- 永远持续,数据库文本等数据
未完