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

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

  • 相关阅读:
    20220506 08:00:02
    20220504 08:00:02
    20220505 08:00:02
    20220508 08:00:02
    20220501 08:00:02
    20220509 08:00:02
    数据结构哈夫曼编码
    数据结构邻接矩阵、邻接表
    数据结构数据挖掘算法
    数据结构二叉树遍历
  • 原文地址:https://www.cnblogs.com/dugudashen/p/13154740.html
Copyright © 2020-2023  润新知