软件工程学习笔记

UML图(设计模式照搬)

一个方框三个格子,第一格是名字,第二格是成员变量,第三格是成员函数
+ public
- private
# protected
- products:List<Product>
函数:
+ walk(参数):void=默认返回值

单向关联:实线箭头,单方向持有对象(每个人都有一张船票)
双向关联:一根实线,互相持有对方对象(顾客买了什么产品(ArrayList),产品被哪个顾客买了)
自关联:一根实线箭头自己指向自己(point类内部有一个point对象)

强调”整体-部分”的关系(不一定非得持有多个部分的变量)
聚合关系:空心菱形+实线(菱形部位是多的),一个部门有很多员工(-List<Workers>),所以用聚合(部门与劳工的关系)
组合关系:实心菱形+实线,表示更强烈的聚合关系,一但整体对象不存在,那么部分对象也不会存在(身体与器官的关系)

依赖关系:虚线箭头,某个类的函数通过局部变量,或函数传递的参数是另一个类(人读书,书是一个对象,但是人只有”读”的函数和书有关,所以只构成依赖关系.)
继承关系:实线三角箭头(子类指向父类)耦合度最大的一种关系(你先是一个人才是一个学生,那么学生类继承”人类”)
实现关系:虚线三角箭头(实现的指向被实现的)某个类实现某个接口的时候可以用

耦合度:泛化(继承)/实现>组合>聚合>关联>依赖
方法(函数)应向父类集中,数据应向子类集中(保持抽象)

数据流图

1
2
3
4
5
6
7
8
9
10
11
12
+----------+
| 源点/终点 |
+----------+

圈住(处理)

-----------> 数据流(全是实线)


+------------
|数据存储
+------------

输入->圈住,处理->输出

两个方框的实体之间不能有数据流.

变换数据流图

好多步骤,链很长(一直变换)

事务数据流图

树形结构,不同结局(决策点)

软件结构图

两次分解.
第一次分解是一拆三,第二次分解是具体功能细分,看类型.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
+------+
| 模块 |
+------+

----------
调用

○-------->
数据(传递)

●-------->
控制信息


模块
/|\
输入 处理 输出
/|\/|\/|\
各种子函数,比如"获取xxx",计算xx,保存xx

复杂度

程序复杂度: 判断数+1
环路复杂度: V-E+2(边数-顶点数+2)=原子判定数+1

流图

把程序流程图转成流图删掉所有判定,仅用圈节点箭头表示,注意 and 和 or要拆开成不同节点

测试用例设计

白盒:
判定覆盖:每个if的真假取到就行
条件覆盖:每个原子语句都真假取到:(a&&b)a和b都要取到真假
路径覆盖:所有路径取过一遍.

黑盒:
等价类分析:合法的,不合法的

MTTF

第一问是标记重捕.

MTTF = IT/[K(ET-Ec)]
其中IT=程序长度,K=常数,ET=总错误数,Ec=已改正错误数
首先根据给出的式子算常数k,然后根据第二个式子算剩下的错误

用例图

小人
矩形
直线代表这个人能用的功能
虚线箭头A—>B include:A是主模块,A被调用B必被调用
A<—B extend:A是主模块,A被调用B不一定被调用

时序图

虚线生命线,直线箭头是请求,虚线箭头是回显.
最后用实线方框圈住生命线的活跃时期.

判定表

xxx是各种人,aaabbbccc是状态,这个人有没有这个状态,有就是1,没有就是0.
√是这个状态有没有被调用.

xxx 1
xxx 0
xxx 1
aaa √
bbb
ccc

Jackson图

全部都是矩形方块.
元素标干什么(或编号).

1
2
3
  A
/|\
B C D //代表A的模块先做B再C再D

1
2
3
I*代表循环
S o代表分支(只能选一个)
数字代表执行几次.

UML状态图

实心圆代表起始节点,实心圆+外面套一个圈代表结束节点,中间所有元素原型或判定的菱形.

工程网络图

用一个圆表示节点.

1
2
3
4
5
6
7
8
9
10
11
# 假设下面是个圆.
+-+-+
|A|3|# 最早开始时间(最短路)
| +-+
| |5|# 最晚开始时间
+-+-+

# 下面是边.
114(20)
------------>
# 边权 能拖延的最长时间

程序流程图

最经典的哪个菱形判定…那个图

PAD图

没劲.

N-S盒图

没劲.(这三者都用于描述程序,只是画图方法不太一致,看一眼就懂了)