文章目录
三类设计模式
-
创建型模式
-
结构型模式
-
行为型模式
内聚与耦合
测试用例
-
黑盒测试(不知道程序内部结构)
等价类划分 将所有数据类划分为许多个层次,每个数据层次挑选出一个最具代表性的数据进行测试 边界值分析 需要对等价类之间的边界值进行测试 错误推测 自己推测错误原因。需要经验 因果图 由结果反推原因 -
白盒测试(知道程序内部结构)
语句覆盖 选择足够多的测试用例,使得运行这些测试用例时,被测程序的每个语句至少执行一次(很弱的覆盖测试) 判定覆盖 所有判断的取真至少满足一次,取假至少满足一次 条件覆盖 判断中的每个判断条件的可能取值都至少满足一次 路径覆盖 选取足够多的测试用例,使得程序的每条可能执行到的路径都要至少经过一次(如果程序中有环路,则要求每条环路路径至少经过一次)
连续式模型的6个过程域能力等级
CL0 | 未完成的,未执行或未达到CL1定义的所有目标 |
---|---|
CL1 | 已执行的,共性目标是过程将可标识的输入工作产品转换成可标识的输出工作产品,以实现支持过程域的特定目标 |
CL2 | 已管理的,共性目标集中于已管理的过程的制度化 |
CL3 | 已定义级的,共性目标集中于已定义过程的制度化 |
CL4 | 定量管理的,共性目标集中于可定量管理的过程的制度化 |
CL5 | 优化的,使用量化(统计学)手段改变和优化过程域,已对付客户要求的可持续性改进计划中的过程域的功效 |
设计策略
-
分治法(分解)
把较大的、复杂的问题,拆分成一些比较小的子问题。
-
动态规划法(筛选)
对于每一步决策,列出各种可能的局部解,再依据某种判定条件,舍弃那些肯定不能得到最优解的局部解,在每一步都经过筛选,以每一步都是最优解来保证全局是最优解。
-
回溯法(探索与回退)
回溯法是一种选优搜索法,按选优条件向前搜索,以达到目标。但当搜索到某一步时,发现原先的选择并不优或达不到目标,就退一步重新选择。
-
贪心法(有局部最优的判断条件)
总是做出在当前来看说是最好的选择,而不从整体上加以考虑,它所做的每步选择只是当前步骤的局部最优选择,但从整体来说并不一定是最优的选择。
流水线
-
流水线周期为执行时间最长的一段。
-
计算公式:
理论(优先):(t1+…+tk)+(n-1)*Δt
t1…tk:指令中不同部分的执行时间
n:指令条数
Δt:流水线周期
实践:(k+n-1)*Δt
k:一条指令分为几个部分
局部性原理
-
局部性原理是指CPU访问存储器时,无论是存取指令还是存取数据,所访问的存储单元都趋于聚集在一个较小的连续区域中。局部性原理分为时间局部性、空间局部性和顺序局部性。
时间局部性:如果一个信息项正在被访问,那么在近期它很可能还会被再次访问。
空间局部性:在最近的将来将用到的信息很可能与正在使用的信息在空间地址上是临近的。
顺序局部性:在典型程序中,除转移类指令外,大部分指令是顺序进行的。顺序执行和非顺序执行的比例大致是5:1。此外,对大型数组访问也是顺序的。指令的顺序执行、数组的连续存放等是产生顺序局部性的原因
-
工作集理论:工作集是进程运行时被频繁访问的页面集合。
串并联系统可靠性分析
-
串联:
可靠性:R=R1* R2 * … * Rn
失效性:1-R
-
并联:
可靠性:R=1-(1-R1)(1-R2)…(1-Rn)
失效性:1-R
cache
- 功能:提高CPU输入输出速度
- cache与主存的地址映射是由硬件自动完成的
- 依据:程序的局部性原理
- cache是除寄存器外,访问速度最快的层次
主存分类
海明码
-
海明校验码的组成:海明校验码由n个信息为和k个校验位组成。
-
需要多少个校验位?
2k>=n+k+1
-
求解步骤
-
纠错
极限编程
四大价值观:
- 沟通
- 简单
- 反馈
- 勇气
五大原则:
- 快速反馈
- 简单性假设
- 逐步修改
- 提倡更改
- 优质工作
十二个最佳实践:
- 计划游戏
- 小型发布
- 隐喻
- 简单设计
- 测试先行
- 重构
- 结队编程
- 集体代码所有制
- 持续集成
- 每周工作40小时
- 现场客户
- 编码标准
面向对象设计原则
-
单一职责原则:设计目的单一的类。降低类与类之间的关联度,降低耦合度。
-
开放-封闭原则:对扩展开放,对修改封闭。使用新的类解决问题,而不是修改原有的类,避免引入新的问题。
-
李氏替换原则:子类可以替换父类。不要盲目的重载父类函数。
-
依赖倒置原则:要依赖于抽象,而不是具体实现;针对接口编程,不要针对实现编程。依赖于接口可以使得操作变得更加灵活。
-
接口隔离原则:使用多个专门的接口比使用单一的总接口要好。
-
组和重用原则:要尽量使用组合,而不是继承关系达到重用目的。因为继承是高耦合的关系。
-
迪米特原则(最小知识法则):一个对象应当对其他对象有尽可能少的了解。通过封装实现。
结构化设计原则
- 自顶向下,逐步求精
- 信息隐蔽
- 模块独立(高内聚、低耦合、复杂度)
- 保持模块的大小适中
- 尽可能减少调用深度
- 多扇出,少扇入(多入度,少出度)
- 单入口,单出口
- 模块的作用域应该在模块之内
- 功能应该是可预测的
编译过程五个阶段
-
词法分析
也就是从左到右一个一个地读入源程序,识别一个单词或符号,并进行归类。
-
语法分析
在词法分析地基础上,将单词序列分解成各类语法短语,如“程序”、“语句”,“表达式”等。
-
语义分析
审查源程序是否有语义的错误,当不符合语言规范的时候,程序就会报错。
-
代码优化
这个阶段是对前阶段地中间代码进行变换或改造,目的是使生成的目标代码更为高效,即节省时间和空间。
-
目标代码生成
也就是把优化后的中间代码变换成指令代码或汇编代码。