【软件构造】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程序

直接枚举,同样没有什么算法上的难点,仔细阅读即可读懂。

posted @ 2020-06-18 09:30  dugudashen  阅读(323)  评论(0编辑  收藏  举报