【软件构造】Lab4基本流程指导及重难点分析
本篇文章旨在引导HIT软件构造Lab2的基本流程并进行一些重难点的解释,总体内容偏向基础,出发点是在实验过程中我遇到了很多问题并花了大量时间才解决,希望可以帮助大家更好地完成实验。
Lab4横向对比来说是任务量较小、思路比较简单的一个实验,并且完成难度和Lab3的完成质量挂钩,如果Lab3的实现时对于代码健壮性和测试做得比较到位那么Lab4会非常容易。
实验目标:训练健壮性和一些防御式编程技能,以及调试技能。
实验环境:相比之前的实验,需要安装一个新的工具spotbugs,提供一个较为简便的安装方式:在eclipse上方栏找到Help->Eclipse Marketplace,在find搜索框中输入spotbugs查找,找到后一键安装即可。可能这个安装过程会比较慢,需要等几分钟的时间。
3.1节需要自定义实现异常类,课上讲的非常清楚,不明白可以去看课件,按照要求实现错误处理即可。3.2节需要完成一些防御机制,包括checkRep函数和断言、异常机制,这一部分在课上也讲得比较详细,而且自由度非常高,就不给出比较固定的方法了。
3.3 Logging
实现日志功能,即每次抛出异常时将相关错误信息记录下来,事实上完全可以自己手动实现这一功能,但是使用工具较为方便。这里介绍第三方java日志库log4j的基本使用方法。
1.下载log4j包,将其导入java工程中。
2.创建配置文件,在src目录下新建一个名为log4j.properties的文件,内部编写示例如下。
1 log4j.rootLogger = debug,stdout,D,E 2 3 log4j.appender.stdout = org.apache.log4j.ConsoleAppender 4 5 log4j.appender.stdout.Target = System.out 6 7 log4j.appender.stdout.layout = org.apache.log4j.PatternLayout 8 9 log4j.appender.stdout.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n 10 11 12 log4j.appender.D = org.apache.log4j.DailyRollingFileAppender 13 14 log4j.appender.D.File = log/DEBUG.txt 15 16 log4j.appender.D.Append = true 17 18 log4j.appender.D.Threshold = DEBUG 19 20 log4j.appender.D.layout = org.apache.log4j.PatternLayout 21 22 log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n 23 24 25 26 log4j.appender.E = org.apache.log4j.DailyRollingFileAppender 27 28 log4j.appender.E.File =log/ERROR.txt 29 30 log4j.appender.E.Append = true 31 32 log4j.appender.E.Threshold = ERROR 33 34 log4j.appender.E.layout = org.apache.log4j.PatternLayout 35 36 log4j.appender.E.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
其中14行和28行为自定义的输出文件的路径,9行、22行和36行为自定义的输出条目的格式。
3.之后便可以使用log4j进行异常记录。
1 import org.apache.log4j.Logger; 2 3 ... 4 5 private static Logger logger = Logger.getLogger(CLASS.class); 6 7 ... 8 9 logger.error(e.getMessage(),e); 10 11 ...
其中CLASS为类名,e为异常类名。
4.调用并产生异常后,日志文件便会出现在之前指定的路径中。
3.4节为编写测试,按照等价类划分的方法补足实验三中设计不够好的测试用例,使得给出的测试在eclemma的覆盖度检测中达到良好效果。3.5节为使用spotbugs工具检验代码的潜在bug,直接运行安装好的spotbugs,根据警告信息逐个分析并修改即可。
3.6 Debugging
这一节与之前的内容没有关联,是独立的一部分。要求下载给定的三个有误的程序文件,分别阅读它们的spec,查看代码,分析错误并给出改正,改正位置添加注释说明修改原因。三个程序均规模较小,查错不算困难,但是存在一些比较奇妙的算法,不理解的话会不明白原程序在干什么。
3.6.1 EventManager程序
原程序运用了前缀和的思想,举一个例子,将a到b整段加1的操作可以转化为将a点加1,b点减1来执行,最后从开头开始扫描,维护一个前缀和信息,此时以x点为结尾的前缀和就是原序列中x点的值。原程序运用了这一思想,每次将区间加减转化为了两点加减。
3.6.2 LowestPrice程序
不断递归暴力算出每一种可能性,算法比较朴素。
3.6.3 FlightClient/Flight/Plane程序
直接枚举,同样没有什么算法上的难点,仔细阅读即可读懂。