1.源code→文件→包(组件子系统)
2.静态链接:库背靠背巾代码形成整体
动态链接:构建时仅做出标记,需提供库文件
3.外部质量因素:可被用户、使用库的程序员感知
内部质量因素:软件产品质量,影响开发者
内部决定外部因素
4.外部质量因素:
正确性:按照规约进行,最重要的指标
健壮性:出现异常情况不要崩溃
可扩展性:对规约修改是否容易
可复用性
兼容性:不同系统间不冲突(库不冲突)
性能:在正确性基础上
可移植性:不同的技术环境之间是否可以移植
易用性
功能性:不适宜的趋势
及时性:及时新版本
5.内部质量因素
源code:loc(代码行数)、逻辑复杂度
结构方面:低耦合(内部变量联系低),高内聚(类之间的联系紧密),质量更高
代码可读性
6.测试:发现不正确,调试:消除不正确
测试无法证明系统内不存在错误
7.测试分类:单元→集成→系统→验收测试
一旦程序被修改,重新执行之前的所有测试(回到单元)
8.静态测试:编码阶段有程序员或者编译器进行的检查
动态测试:通过测试用例实际执行(可能在编写完成前对特定节做出)
9.白盒测试:内部代码可见
黑盒测试:对程序外部行为的测试(输入输出)
10.编写测试过程:先写规约,在写测试用例
TDD:需求转化为实际的测试用例
11.等价类划分:对输入约束满足/违反的数据集合
考虑输入限制数值范围?指明特定值?计算方案如何?
边界值分析:0、max、-max、首个元素、最后一个元素
(实际验证时,只需验证规约规定的情况,对规约未规定的输入不需验证,输出什么都可以)
12.覆盖方式
笛卡尔积:全覆盖
每个取值最少覆盖一次
13.白盒测试:根据执行路径设计测试用例
基本路径测试:对最基本的路径测试(最简单,循环只有一次等)
测试效果:路径覆盖>分支覆盖>语句覆盖(每条可能路径都被覆盖;每个条件的可能结果至少出现一次,判断本身的结果至少出现一次;路径至少一次)
测试代价:同上
14.测试策略:显示记录
开头需写出测试逻辑
方法中需写覆盖情况
15.分析工具
动态检查(需执行代码):junit(单元测试)、eclemma(测试覆盖率)、visualVM、AppPerfect
静态检查:spotbugs、PMD、CheckStyle
16.SCM:软件配置管理
sci:配置项,软件中发生变生变化的基本单元(文件),形态:已修改,已暂存,已提交
head:程序员正在工作的版本
17.
git:分布式版本控制系统(分布式配置管理系统√)
暂存区:.git目录中的一个文件,隔离工作目录和git仓库
- git init - 初始化仓库。
- git add . - 添加文件到暂存区。
- git commit - 将暂存区内容添加到仓库中。
-
git clone
拷贝一份远程仓库,也就是下载一个项目。(从远程仓库到工作环境)
-
git rm
将文件从暂存区和工作区中删除。 git mv
移动或重命名工作区文件。 -
git diff
比较文件的不同,即暂存区和工作区的差异。 -
git remote
远程仓库操作 git fetch
从远程获取代码库(到本地仓库中) git pull
下载远程代码并合并(到工作区) git push
上传远程代码并合并(从本地仓库到remote 仓库) - 对象图:子指向父亲
- 一个commit可以指向零个/一个/两个父亲
- 多个commit可以指向一个父亲
- head指向当前工作的commit
- blob:内容相同的文件,只会有一个blob,多个commit tree指向其
- 文件变化,两个版本指向不同的blob
- git存储发生变化的文件(而不是代码行),不变化的文件不重复存储
18.数据类型
对象类型具有“身份”,在堆中分配内存(包括String)
基本类型在栈中分配内存
object是所有对象类型的父亲,所有类均有父类(除了object),若未写明,默认extend object
19.运行检查
静态:编译阶段,检查类型
动态:运行阶段,检查值
20.immutable?
改变变量:变量指向另外存储空间
改变变量的值:改变存储空间内存储的值
引用不变:对象不可改变指向的空间,若改变,静态检查不通过(但是指向空间内的值可变!)
final:类——无法创建子类,方法——无法被子类重写,变量——无法改变其引用
string:不可变类型,创建后不可改变,若改变则新创建空间写入改变后的值,然后指向新空间
stringbuilder:可变类型,可使用append改变
不可变——产生临时拷贝,但是更“安全”不怕被意外修改
21:snapshot代码快照
基本类型:箭头末端写值
对象类型:椭圆,写类名,可包含内部属性。可变对象单线,不可变对象双线圆
引用:可变单线,不可变双线
list:长度可变序列
set《类型》:随机指,无顺序,不会重复
map《key,valve》:一个一个的双格,第一格指key,第二格指valve
迭代器:havenext——返回是否有下一个数据(observer方法),next——返回下一个数据并且index++
不可变:基本类型、封装对象类型,biginteger、bigdecimal、ADT
可变:date、arrarlist、hashmap
wrapper包装器包装后如List《String》 listcopy=Collections.unmodifiablelist(list)
listcopy为immutable
static、final引用不可变