提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
目录
前言
本文从整体上介绍了软件构造的相关知识,宏观上理解软件构造并了解软件构造的大致过程。
一、软件构造的多维度视图和质量目标
1.多方面看软件构造系统
不同于我们的直观感受,认为软件构造仅仅是写代码。实际上,写代码仅仅是整个软件构造系统的很小的一部分。
大体上,可以将软件的整个构造系统视做一个循环,包括计划、分析、设计、实现、测试、维护,循环往复。
我们可以从多个角度来看软件构造的具体过程和特性,以表格的方式可以分为如下的多个视角:
2.构造阶段(build time)
如上图,在构造阶段看软件构造,我们能够了解:
在任意特定时刻,代码层次上有各种各样的编程语言,对应会有各种语法分析树,抽象的方法等;实体层次上有多个程序组织起来的包、第三方库、静态链接等。
而从代码随时间变化角度看,代码层次上会有代码的变化(如更新方法等);实体层次上,会有版本的更新、配置的改变。
3.运行阶段(run time)
程序运行时,在代码层面可以用快照图来看逻辑实体的具体实现和内部信息转储等;
从代码随时间变化角度,代码层面上可以用执行跟踪观察;实体层面上,可以采用系统层面的时间日志。
4.软件构造视角的转换
从外部表征来看,有许多评价一个软件系统好坏的指标,包括1.正确性2.健壮性3.可拓展性4.可复用性5.兼容性6.效率7.可移植性8.易用性9.功能性10.及时性
而从内部来衡量好坏的指标包括可读性、可理解性、清晰度和代码行数等
需要注意的是,有些指标之间是相矛盾的,这就需要我们做折中;但是正确性是不允许折中的。
3.软件构造的五个关键质量目标
1.Easy to understand易于理解
2.Ready for change易于改变
3.Cheap for develop代价低
4. Safe from bugs安全
5. Efficient to run可执行
二、软件测试与测试优先的编程
1.软件测试
要知道的是,不可能有完全的测试,再好的测试也无法达到100%正确。
常见的测试分类包括单元测试、集成测试、系统测试、回归测试、静态测试(检查代码)、动态测试等。
要区别测试和调试的区别,测试是为了发现错误而调试是为了发现测试的来源。
在程序测试时,有两种形式分别是白盒测试(对程序内部代码结构的测试 )和黑盒测试(对程序外部表现出来的行为的测试)。
要养成测试优先的习惯,也就是先编写测试用例,这样不仅能更好的理解规约,还可以尽 早发现设计问题,避免浪费时间做错误的事情。
2.单元测试(JUnit)
是用来自动进行单元测试的工具,编写时需要注意:
1.在每个测试方法前面使用@Test标注指明
2.测试方法间互不影响
3.学会使用assertXXX in JUnit方法
3.黑盒测试
不关心代码的内部实现,只从外部检查代码的功能。
重点理解等价类划分方法:将被测函数的输入域划分为等价类,从等价类中导出测试用例。
对于每个输入约束,都可以找到符合约束和不符合约束的部分,二者均属于不同的等价类。
如,输入限制了输入数值范围、特定数值、一组数值等等。
举例,若输入要求正数,则可以分为正数和负数两个等价类
若输入要求奇数,则可以分为奇数和偶数两个等价类
若输入要求字符串长度为10位,则可以分为>10、=10和<10三个等价类。
还需要注意的是,要重点关注特数值,对于很大的数、很小的数是否成立。
第二种方法,边界值分析法,是对等价类划分方法的补充,要求重点关注边界值。
4.技巧
1.记录下来测试策略
2.使用覆盖度测试,在Eclipse上使用EclEmma插件
3.回归测试,一旦代码有改动所有测试要重新执行
三、软件构造过程与配置管理
1.软件构造过程
大体上,软件构造流程如下图,细节将会在后续深入学习
2.git基础
这部分最重要的就是初步学习了git的相关操作。
git是一个免费开源的分布式版本控制系统,旨在快速高效地处理从小型到非常大型项目的所有内容。
首先要介绍版本树状图:
对于项目,在不同主机上的每一次修改或更新都意味着一个新的版本,可以使用版本树状图来形象的描述版本状况,对应每次提交。
其中称分支是在版本控制下对对象的复制,以便可以沿两个分支平行进行修改。
1.使用git clone命令从远端现有 Git 仓库中拷贝项目,这样可以实现对项目的本地修改等。
2.使用git init创建一个本地仓库,用来存放本地的并且希望传到远端的项目。
3.无论是远端clone的项目还是自己本地的项目,想要重新更新远端,首先要使用git add命令将修改的项目添加到缓冲区,可以使用git add .将目录里的所有文件都添加进去,若想单个添加,直接git add 文件名也是可以的。
4.要想查看仓库当前的状态,显示有变更的文件,可以使用git status命令
5.将文件都添加的暂存区后,需要执行git commit命令,将暂存区内容提交到本地仓库,可以使用git commit -m "本次提交的名称"来设置这次提交的名字。
6.要想将本地仓库的内容推送到远端,首先需要远端代码托管的https或ssh url,通常最常用的代码托管平台就是GitHub,取得url后,输入命令git remote add 名称 url,可以将远端以名称记录在本地,免得每次都要输链接。
7.最后,将本地仓库推送到远端使用 git push <远程主机名> <本地分支名>:<远程分支名>。
8.还有相关的命令如 git fetch:从远程仓库抓取数据到本地; git pull: 从一个仓库或者本地的分支拉取并且整合代码;git diff --cached :查看已暂存起来的文件和上次提交时的快照之间的差异等。详细教程可参见官网 https://git-scm.com/book/zh/v2
总结
本文从整体上介绍了软件构造的相关知识,宏观上理解软件构造并了解软件构造的大致过程,包括软件构造的多维度视图和质量目标、软件测试与测试优先的编程、软件构造过程与配置管理等内容,总体上理解软件构造需要学习的内容。