工程
- 软件工程是将
系统化
、规范化
、可度量
的方法应用于软件的开发
、运行和维护
的工程。
生命周期模型
-
瀑布模型:
- 阶段间具有顺序性和依赖性特点:阶段间具有顺序性和依赖性
- 推迟实现的特点:
- 质量保证的观点:每个阶段要求写文档,每个阶段结束时进行文档评审
- 缺点:瀑布模型由文档驱动,可能导致最后的结果不能满足用户需求。
- 现在大多包含反馈环
-
增量模型
- 使用增量模型开发软件时,把软件产品作为一系列的增量构件来设计、编码、集成和测试。每个构件由多个相互作用的模块构成,并且能够完成特定的功能。
- 当把新构件集成到现有构件中时,所形成的产品必须是可测试的。
- 特点:将软件看作一系列相互联系的增量,在开发过程的各次迭代中,每次完成其中的一个增量。
- 缺点:开发过程中,修改需求会边做边改,导致软件过程的控制失去整体性。需要软件具有开放性,
-
演化模型
- 主要针对事先不能完整定义需求的软件开发。把项目需求分组,分批循环开发,
- 缺点:需要严格的过程管理,一开始弄清产品需求。
-
并发模型
-
统一软件过程
横轴各阶段以时间坐标组织,具有过程展开的生命周期特征,体现开发过程的动态结构,用来描述它的术语主要包括周期,阶段,迭代何里程碑。纵轴以内容来组织为自然的逻辑活动,体现开发过程的静态结构,用来描述它的术语主要包括活动,产物,工作者和工作流。
被分为四个顺序阶段,初始阶段,细化阶段,构造阶段和交付阶段。
-
螺旋模型
管理
- 4p:人员,管理,过程,项目
估算
-
功能点:FP=总计数 × [ 0.65 + 0.01 × ∑ F i ] \times[0.65+0.01\times\sum F_i] ×[0.65+0.01×∑Fi]
总计数和项目各功能点,简单,一般,复杂相关。
F i F_i Fi和项目的复杂度调整因子相关
-
代码行: n 1 n_1 n1=在一个程序中出现的不同操作符的个数,分号,括号也都算
n 2 n_2 n2=在一个程序中出现的不同操作数的个数
程序长度N= n 1 log 2 n 1 + n 2 log 2 n 2 n_1\log_2n_1+n_2\log_2n_2 n1log2n1+n2log2n2
程序体积V= N log 2 n 1 + n 2 N\log_2n_1+n_2 Nlog2n1+n2
-
COCOMOII
- 对象点数目:累加所有带权重的对象实例
- 将开发的新对象点数目NOP=对象点数目 × ( 100 − R E U S E % ) / 100 \times(100-REUSE\%)/100 ×(100−REUSE%)/100
- 生产率PROD=NOP/人月
- 项目需要的人月数PM=NOP/PROD
-
复利,单利
-
复利现值计算
-
年金终值:指一定时期内每期期末等额收付款的复利终值和(每年给银行存x元,最后有多少钱,用于算赚的钱)
F = A × ( 1 + i ) n − 1 i F=A\times\frac{(1+i)^{n}-1}{i} F=A×i(1+i)n−1
-
-
年金现值计算
-
年金现值:指一定时期内每期期末收付款项的复利现值之和(每年给银行还x元,算一开始借了多少钱,交的x元包括借的本金和产生的利息)
P = A × 1 − ( 1 + i ) − n i P=A\times\frac{1-(1+i)^{-n}}{i} P=A×i1−(1+i)−n
-
-
质量
风险(机遇)
- 项目风险源于任何项目中都存在的
不确定性
。 - 一般认为软件风险有3种类型,即
项目风险
、技术风险
和商业风险
。 - 风险曝光度=风险按预期值=风险发生概率 × \times ×风险发生时带来的项目成本
分析指标
- 期望值
- 标准离差(标准差)
- 标准离差率:标准离差与期望值之比
- 预期值不同的时候用标准离差率,预期值相同的时候用标准差
决策树
分析-----设计-----实现-----测试-----度量
测试
- 单元,集成,系统,确认
- 驱动模块
- 桩模块
- 结构化,面向对象,覆盖路径,随机测试,划分测试
黑盒
白盒
-
路径覆盖:指选择足够的测试用例,使流程图中的每条路径至少经过一次。
-
判断覆盖:又叫分支覆盖,就是使每个判定的所有可能结果至少出现一次。
-
条件覆盖:不仅每个判定都取得各种结果,而且判定表达式中的每个条件也都取得各种可能的结果。
-
测试用例
环复杂度
计算方法
- V(G)=流图中区域的数量
- V(G)=E-N+2 (E指流图中边的数目,N是流图中结点的数目)
- V(G)=P+1 (P是流图中判定节点的数目,有多条出去的箭头)
流程图
- ER图
- 用例图
- 活动图
- 类图
- 顺序图
- 状态图
流图
数据流图
-
输入,处理,输出
-
转换成软件结构图
软件结构图
设计原则
- 开闭原则:一个模块在扩展性方面应该是开放的而在修改方面应该是封闭的。
- 里氏替换:子类应当可以替换父类并出现在父类能够出现的任何地方。
- 接口分离:采用多个与特定客户类有关的接口比采用一个通用的涵盖多个业务方法的接口要好。
- 依赖位置:在进行业务设计时,与特定业务有关的依赖关系应该尽量依赖接口和抽象类,而不是依赖于具体类。
类的设计
可见性
实现对象A 到对象B 的可见性
- 参数可见性:B 是A 中方法的参数。
- 属性可见性:B 是A 的属性。
- 局部可见性:B 是A 中方法的局部对象。
- 全局可见性:B 具有某种方式的全局可见性。
面向类的度量
CK套件度量
-
WMC=每个方法的权重的和(不要漏了类的构造方法)
如果有多个类,算平均值
-
DIT=继承树的深度(自己不算)
-
NOC=子女的数量(直接从属)
-
CBO=与该类有关联的类的个数
-
RFC=该类可以调用的方法个数(不要漏了类的构造方法)
MOOD度量套件
-
方法继承因子
M I F = ∑ i = 1 T C M i ( C i ) ∑ i = 1 T C M a ( C i ) MIF=\frac{\sum_{i=1}^{TC}M_i(C_i)}{\sum_{i=1}^{TC}M_a(C_i)} MIF=∑i=1TCMa(Ci)∑i=1TCMi(Ci)
M i M_i Mi为继承的但是没有被覆盖的方法
M a M_a Ma为该类所有能用到方法
每个类继承的方法的和 除 每个类继承的方法+自己的方法
-
耦合因子
C F = ∑ i = 1 T C ∑ j = 1 T C i s _ c l i e n t ( C i , C j ) T C 2 − T C CF=\frac{\sum_{i=1}^{TC}\sum_{j=1}^{TC}is\_client(C_i,C_j)}{TC^{2}-TC} CF=TC2−TC∑i=1TC∑j=1TCis_client(Ci,Cj)
关联个数 除 类的平方-类
-
多态因子
P F = ∑ i = 1 T C M o ( C i ) ∑ i = 1 T C [ M n ( C i ) × D C ( C i ) ] PF=\frac{\sum_{i=1}^{TC}M_o(C_i)}{\sum_{i=1}^{TC}[M_n(C_i)\times DC(C_i)]} PF=∑i=1TC[Mn(Ci)×DC(Ci)]∑i=1TCMo(Ci)
M o M_o Mo为覆盖的方法个数
M n M_n Mn为新的方法个数
D C DC DC为后代类的个数
每个类重写的方法个数 除 每个类子类个数*自己新方法个数
项目进度获取值分析
- BCWS 计划完成工作的预算成本:到目前为止的总预算成本。计划上到当前应该完成的工作的估计成本。
- ACWP 以完成工作的实际成本:到目前为止所完成工作的实际成本。实际已经完成的工作的实际成本。
- BCWP 已完成工作的预算成本:到目前为止已经完成的工作的原来预算成本。实际已经完成的工作的估计成本。
- BAC 完成工作的预算成本:是项目计划中的成本估算结果,是项目完成的预计总成本。所有工作的估计成本。