作业小结

第一次作业

度量分析

methodev(G)iv(G)v(G)
top.buaaoo.main.Main.main(String[]) 5.0 1.0 5.0
top.buaaoo.main.Monomial.clone() 1.0 2.0 2.0
top.buaaoo.main.Monomial.Monomial() 1.0 1.0 1.0
top.buaaoo.main.Polynomial.AddPolynomial(Polynomial) 1.0 2.0 2.0
top.buaaoo.main.Polynomial.AddTerm(int,int) 1.0 1.0 2.0
top.buaaoo.main.Polynomial.AddTerm(Monomial) 1.0 1.0 1.0
top.buaaoo.main.Polynomial.DeleteZeroMonomial() 1.0 3.0 3.0
top.buaaoo.main.Polynomial.FindDegree(int) 3.0 1.0 3.0
top.buaaoo.main.Polynomial.NewTerm(int,int) 2.0 1.0 2.0
top.buaaoo.main.Polynomial.Polynomial() 1.0 1.0 2.0
top.buaaoo.main.Polynomial.Polynomial(int) 1.0 1.0 2.0
top.buaaoo.main.Polynomial.Sort() 1.0 4.0 4.0
top.buaaoo.main.PolynomialIO.Calculate() 1.0 2.0 2.0
top.buaaoo.main.PolynomialIO.CheckCharacter() 2.0 2.0 2.0
top.buaaoo.main.PolynomialIO.CheckPolynomial() 5.0 5.0 5.0
top.buaaoo.main.PolynomialIO.DividePolynomial() 3.0 2.0 3.0
top.buaaoo.main.PolynomialIO.GetAllPolynomial() 3.0 2.0 3.0
top.buaaoo.main.PolynomialIO.GetPolynomial(int) 6.0 6.0 7.0
top.buaaoo.main.PolynomialIO.Input() 2.0 1.0 3.0
top.buaaoo.main.PolynomialIO.PolynomialIO() 1.0 1.0 2.0
top.buaaoo.main.PolynomialIO.Print(Polynomial) 1.0 4.0 4.0
Total 43.0 44.0 60.0
Average 2.05 2.10 2.86
classCyclicDcyDcy*DptDpt*
top.buaaoo.main.Main 0.0 1.0 3.0 0.0 0.0
top.buaaoo.main.Monomial 0.0 0.0 0.0 2.0 3.0
top.buaaoo.main.Polynomial 0.0 1.0 1.0 1.0 2.0
top.buaaoo.main.PolynomialIO 0.0 2.0 2.0 1.0 1.0
Total          
Average 0.0 1.0 1.5 1.0 1.5

从分析中可以看出,Main.main()方法、PolynomialIO.CheckPolynomial()方法、PolynomialIO.GetPolynomial()方法的Essentail Complexity值较高,被IDEA的分析工具标红以示警告。从源代码中也可以看出,这三个方法结构确实有点冗杂:

Main.main()大量调用PolynomialIO的方法,而这些完全可以在PolynomialIO中实现,而不必在类外部频繁调用。

PolynomialIO.CheckPolynomial()由于为了精确定位到输入错误类型,所以匹配了多次正则表达式,逻辑也较为冗长。

PolynomialIO.GetPolynomial()通过循环一层一层的获取多项式内单项式的值,结构也较为复杂,可以通过写一个其他的方法来使之结构简化。

总之,除了这三个方法的结构较为复杂外,各个类所实现的功能也相对独立,方法的设置也还比较合理,在一定程度上能体现“高内聚、低耦合”的原则,这也是本人设计的追求。

类图

从类图中可以看出,各个类之间的耦合程度非常低,功能相对独立,每个类提供给另外的类一定的接口,而接口只在特定的类中调用。这样带来的好处是,当某个类接口改变时,只需要改动很少的代码,就可以保证程序的正确修改。

公测

由于个人没有来得及对程序进行系统性的测试,而本程序中有一个方法:PolynomialIO.DividePolynomial()出现了一个问题:某循环常量本应为0,却错误设置成了1。这导致的结果就是所有输出的多项式,如果项数只有一项,那么该项会被忽略,直接输出0。因此,凡是公测正确输出为1项的多项式,本程序都会错误输出0。导致公测结果WA了5个。

这本是一个非常容易发现的bug,属于功能性bug,完全是没有进行系统测试带来的结果。因此之后提交作业前一定要预留足够的时间,进行系统性测试,至少保证自己程序逻辑的正确性和功能的正确性,否则公测会WA很多测试点。

互测

由于本程序有功能性bug,所以互测中被找到了2个ERROR。但都属于上述错误带来的结果。

当我在互测他人的bug时,利用了分支树来进行系统性的测试,从输入格式错误、到输入格式正确、再到边界数据测试、压力测试等等。这样测试较为系统,也较为全面。另外,我还看了对方的源代码,期望从中发现一些逻辑错误。

 

第二次作业

度量分析

methodev(G)iv(G)v(G)
top.buaaoo.gitlab.Elevator.Elevator() 1.0 1.0 2.0
top.buaaoo.gitlab.Elevator.getDirection() 4.0 3.0 4.0
top.buaaoo.gitlab.Elevator.getFloor() 1.0 1.0 1.0
top.buaaoo.gitlab.Elevator.pressButton(Request) 2.0 2.0 2.0
top.buaaoo.gitlab.Elevator.responseButton(int) 1.0 1.0 1.0
top.buaaoo.gitlab.Elevator.setAim(int) 1.0 1.0 3.0
top.buaaoo.gitlab.Floor.Floor(int) 1.0 1.0 1.0
top.buaaoo.gitlab.Floor.pressDown(Request) 2.0 2.0 2.0
top.buaaoo.gitlab.Floor.pressUp(Request) 2.0 2.0 2.0
top.buaaoo.gitlab.Floor.responseDown() 1.0 1.0 1.0
top.buaaoo.gitlab.Floor.responseUp() 1.0 1.0 1.0
top.buaaoo.gitlab.Main.ErrorFeedback(int,String,String) 1.0 1.0 1.0
top.buaaoo.gitlab.Main.Input() 18.0 19.0 26.0
top.buaaoo.gitlab.Main.Main() 1.0 1.0 2.0
top.buaaoo.gitlab.Main.main(String[]) 1.0 1.0 1.0
top.buaaoo.gitlab.Main.run() 1.0 1.0 1.0
top.buaaoo.gitlab.Request.getDirection() 1.0 1.0 1.0
top.buaaoo.gitlab.Request.getFloor() 1.0 1.0 1.0
top.buaaoo.gitlab.Request.getKind() 1.0 1.0 1.0
top.buaaoo.gitlab.Request.getLine() 1.0 1.0 1.0
top.buaaoo.gitlab.Request.getStr() 1.0 1.0 1.0
top.buaaoo.gitlab.Request.getTime() 1.0 1.0 1.0
top.buaaoo.gitlab.Request.Request(int,Direction,double,int,String) 1.0 1.0 1.0
top.buaaoo.gitlab.Request.Request(int,double,int,String) 1.0 1.0 1.0
top.buaaoo.gitlab.RequestList.addRequest(Request) 1.0 1.0 1.0
top.buaaoo.gitlab.RequestList.getNextRequest() 2.0 1.0 2.0
top.buaaoo.gitlab.RequestList.getRequestListByTime(double) 2.0 3.0 4.0
top.buaaoo.gitlab.RequestList.getTime(int) 1.0 1.0 1.0
top.buaaoo.gitlab.RequestList.removeRequest(Request) 1.0 1.0 1.0
top.buaaoo.gitlab.RequestList.RequestList() 1.0 1.0 1.0
top.buaaoo.gitlab.Scheduler.addRequest(Request) 1.0 1.0 1.0
top.buaaoo.gitlab.Scheduler.handleRequest() 13.0 21.0 25.0
top.buaaoo.gitlab.Scheduler.Scheduler(Elevator,Floor[]) 1.0 1.0 1.0
Total 70.0 78.0 96.0
Average 2.12 2.36 2.91
classCyclicDcyDcy*DptDpt*
top.buaaoo.gitlab.Elevator 0.0 2.0 4.0 2.0 2.0
top.buaaoo.gitlab.Elevator.Direction 0.0 0.0 0.0 1.0 3.0
top.buaaoo.gitlab.Floor 0.0 1.0 3.0 2.0 2.0
top.buaaoo.gitlab.Floor.Direction 0.0 0.0 0.0 3.0 6.0
top.buaaoo.gitlab.Main 0.0 5.0 8.0 0.0 0.0
top.buaaoo.gitlab.Request 0.0 2.0 2.0 5.0 5.0
top.buaaoo.gitlab.Request.Kind 0.0 0.0 0.0 2.0 6.0
top.buaaoo.gitlab.RequestList 0.0 1.0 3.0 1.0 2.0
top.buaaoo.gitlab.Scheduler 0.0 6.0 7.0 1.0 1.0
Total          
Average 0.0 1.89 3.0 1.89 3.0

从分析中可以看出,Main.Input()方法、Scheduler.handleRequest()方法的Essentail Complexity值、Design Complexity值、循环复杂度均较高,被IDEA的分析工具标红以示警告。从源代码中也可以看出,这三个方法结构确实有点冗杂:

Main.Input()方法为了精确定位到输入错误类型,所以进行了多次if判断,从而为用户输出具体的错误类型、错误原因,因此逻辑较为冗长。导致循环复杂度也很高。

Scheduler.handleRequest()方法是调度器Scheduler中处理请求队列的主方法,因此其内部的逻辑也较为冗长。本人认为还可以通过进一步划分过程、分为多个子过程,以方法的形式将其逻辑划分开来,使得一个方法实现一个功能,并在handleRequest方法中一步一步调用这些方法来实现其功能,这样一定会有很大改善。

总之,除了这两个方法的结构较为复杂外,各个类所实现的功能也相对独立,方法的设置也还比较合理,在一定程度上能体现“高内聚、低耦合”的原则,这也是本人设计的追求。

类图

从类图中可以看出,Main类是程序的入口,里面主要处理的用户的输入,并且在Main类生成了电梯、楼层、调度器,将电梯和楼层以参数形式传递给调度器,另外,用户输入的请求队列也会通过调度器的某方法传给调度器。

公测

由于测试程序没有拉取最新的git版本,测试时WA了1个,其实git上已经是可以公测全过的版本。

互测

对方没有找到本程序的bug。

本人在寻找测试任务的bug时,采用了两种方案,一:系统性测试。按照测试树,依次检查对方的程序是否能满足测试树的要求。二:阅读对方代码,对比readme,检查对方代码的逻辑错误。

最终,本人找到了对方两个ERROR错误。其中一个是在测试树中找到的,另一个是阅读对方代码时,发现了逻辑错误,从而造了数据卡对方的bug。

心得体会

当然本程序也确实有一些不合理的地方。在于Main类直接生成了Request,在Scheduler的方法中,以参数形式传递给Scheduler,这样导致Main和Request两个类有直接的关联,这种设计就不太好。较好的设计是,将生成Request需要的参数,以addRequest方法传递给Scheduler,然后Scheduler的addRequest方法将这些参数传递给RequestList的addRequest的方法,在RequestList的方法addRequest中,生成Request实例。这样的话,Main类不会直接与Request类交互,更能体现“高内聚、低耦合”的设计原则。

编程时程序逻辑首先是不能错的。在设计程序时,要在逻辑完备的基础上,再去检查边界情况。

 

第三次作业

度量分析

methodev(G)iv(G)v(G)
top.buaaoo.gitlab.ALSScheduler.ALSScheduler(Elevator,Floor[]) 1.0 1.0 1.0
top.buaaoo.gitlab.ALSScheduler.handleRequest() 10.0 37.0 41.0
top.buaaoo.gitlab.ALSScheduler.output(Request) 1.0 2.0 2.0
top.buaaoo.gitlab.ALSScheduler.simulate(int,int) 1.0 1.0 1.0
top.buaaoo.gitlab.Elevator.Elevator() 1.0 1.0 2.0
top.buaaoo.gitlab.Elevator.getDirection() 4.0 3.0 4.0
top.buaaoo.gitlab.Elevator.getFloor() 1.0 1.0 1.0
top.buaaoo.gitlab.Elevator.pressButton(Request) 3.0 2.0 3.0
top.buaaoo.gitlab.Elevator.responseAllButton() 1.0 1.0 2.0
top.buaaoo.gitlab.Elevator.responseButton(int) 1.0 1.0 1.0
top.buaaoo.gitlab.Elevator.setAim(int) 1.0 3.0 3.0
top.buaaoo.gitlab.Elevator.toString() 1.0 1.0 1.0
top.buaaoo.gitlab.Floor.Floor() 1.0 1.0 1.0
top.buaaoo.gitlab.Floor.output(Request) 1.0 1.0 1.0
top.buaaoo.gitlab.Floor.pressButton(Request) 3.0 3.0 4.0
top.buaaoo.gitlab.Floor.pressDown(Request) 2.0 2.0 2.0
top.buaaoo.gitlab.Floor.pressUp(Request) 2.0 2.0 2.0
top.buaaoo.gitlab.Floor.responseButton(Direction) 2.0 3.0 4.0
top.buaaoo.gitlab.Floor.responseDown() 1.0 1.0 1.0
top.buaaoo.gitlab.Floor.responseUp() 1.0 1.0 1.0
top.buaaoo.gitlab.Main.ErrorFeedback(int,String,String) 1.0 3.0 3.0
top.buaaoo.gitlab.Main.Input() 17.0 21.0 27.0
top.buaaoo.gitlab.Main.Main() 1.0 2.0 4.0
top.buaaoo.gitlab.Main.main(String[]) 1.0 1.0 1.0
top.buaaoo.gitlab.Main.run() 1.0 1.0 1.0
top.buaaoo.gitlab.Request.getDirection() 1.0 1.0 1.0
top.buaaoo.gitlab.Request.getFloor() 1.0 1.0 1.0
top.buaaoo.gitlab.Request.getKind() 1.0 1.0 1.0
top.buaaoo.gitlab.Request.getLine() 1.0 1.0 1.0
top.buaaoo.gitlab.Request.getTime() 1.0 1.0 1.0
top.buaaoo.gitlab.Request.Request(int,BigDecimal,int,String) 1.0 1.0 1.0
top.buaaoo.gitlab.Request.Request(int,Direction,BigDecimal,int,String) 1.0 1.0 1.0
top.buaaoo.gitlab.Request.toString() 1.0 1.0 1.0
top.buaaoo.gitlab.RequestList.addRequest(Request) 1.0 1.0 1.0
top.buaaoo.gitlab.RequestList.getNextNRequestNotRemove(int) 2.0 1.0 2.0
top.buaaoo.gitlab.RequestList.getNextRequest() 2.0 1.0 2.0
top.buaaoo.gitlab.RequestList.getNextRequestNotRemove() 2.0 1.0 2.0
top.buaaoo.gitlab.RequestList.getRequestListByTime(BigDecimal) 2.0 3.0 4.0
top.buaaoo.gitlab.RequestList.getTime(int) 1.0 1.0 1.0
top.buaaoo.gitlab.RequestList.removeRequest(Request) 1.0 1.0 1.0
top.buaaoo.gitlab.RequestList.RequestList() 1.0 1.0 1.0
top.buaaoo.gitlab.RequestList.sortByFloor(Direction) 1.0 2.0 2.0
top.buaaoo.gitlab.RequestList.SortByFloorDOWN.compare(Object,Object) 1.0 1.0 1.0
top.buaaoo.gitlab.RequestList.SortByFloorUP.compare(Object,Object) 1.0 1.0 1.0
top.buaaoo.gitlab.RequestList.sortByLine() 1.0 1.0 1.0
top.buaaoo.gitlab.RequestList.SortByLine.compare(Object,Object) 1.0 1.0 1.0
top.buaaoo.gitlab.Scheduler.addRequest(Request) 1.0 1.0 1.0
top.buaaoo.gitlab.Scheduler.deleteSameRequest(RequestList,Request) 3.0 9.0 10.0
top.buaaoo.gitlab.Scheduler.handleRequest() 3.0 5.0 6.0
top.buaaoo.gitlab.Scheduler.output() 1.0 2.0 2.0
top.buaaoo.gitlab.Scheduler.print_same(Request) 1.0 1.0 1.0
top.buaaoo.gitlab.Scheduler.Scheduler(Elevator,Floor[]) 1.0 1.0 1.0
Total 95.0 139.0 163.0
Average 1.83 2.67 3.13
classCyclicDcyDcy*DptDpt*
top.buaaoo.gitlab.ALSScheduler 0.0 8.0 12.0 1.0 1.0
top.buaaoo.gitlab.Elevator 3.0 5.0 11.0 4.0 5.0
top.buaaoo.gitlab.Elevator.Direction 0.0 0.0 0.0 3.0 6.0
top.buaaoo.gitlab.Floor 3.0 4.0 11.0 3.0 5.0
top.buaaoo.gitlab.Floor.Direction 0.0 0.0 0.0 4.0 11.0
top.buaaoo.gitlab.Main 0.0 7.0 14.0 0.0 0.0
top.buaaoo.gitlab.Main.Mode 0.0 0.0 0.0 1.0 1.0
top.buaaoo.gitlab.Request 0.0 2.0 2.0 10.0 10.0
top.buaaoo.gitlab.Request.Kind 0.0 0.0 0.0 5.0 11.0
top.buaaoo.gitlab.RequestList 3.0 6.0 11.0 2.0 5.0
top.buaaoo.gitlab.RequestList.SortByFloorDOWN 0.0 1.0 3.0 1.0 6.0
top.buaaoo.gitlab.RequestList.SortByFloorUP 0.0 1.0 3.0 1.0 6.0
top.buaaoo.gitlab.RequestList.SortByLine 0.0 1.0 3.0 1.0 6.0
top.buaaoo.gitlab.Scheduler 3.0 5.0 11.0 4.0 5.0
Total          
Average 0.86 2.86 5.79 2.86 5.58

从分析中可以看出,Main.Input()方法、ALSScheduler.handleRequest()方法的Essentail Complexity值、Design Complexity值、循环复杂度均较高,被IDEA的分析工具标红以示警告。从源代码中也可以看出,这三个方法结构确实有点冗杂:

Main.Input()方法为了精确定位到输入错误类型,所以进行了多次if判断,从而为用户输出具体的错误类型、错误原因,因此逻辑较为冗长。导致循环复杂度也很高。

ALSScheduler.handleRequest()方法是调度器Scheduler中处理请求队列的主方法,因此其内部的逻辑也较为冗长。本人认为还可以通过进一步划分过程、分为多个子过程,以方法的形式将其逻辑划分开来,使得一个方法实现一个功能,并在handleRequest方法中一步一步调用这些方法来实现其功能,这样一定会有很大改善。

总之,除了这两个方法的结构较为复杂外,各个类所实现的功能也相对独立,方法的设置也还比较合理,在一定程度上能体现“高内聚、低耦合”的原则,这也是本人设计的追求。

类图

从类图中可以看出,Main类是程序的入口,里面主要处理的用户的输入,并且在Main类生成了电梯、楼层、调度器,将电梯和楼层以参数形式传递给调度器,另外,用户输入的请求队列也会通过调度器的某方法传给调度器。此外,ALSScheduler继承了Scheduler,并重写了其handleRequest方法。

公测

由于逻辑上有一个开闭区间没有处理,导致公测WA了1个。

互测

对方未找到bug。

本人在寻找测试任务的bug时,采用了三种方案,一:系统性测试。按照测试树,依次检查对方的程序是否能满足测试树的要求。二:阅读对方代码,对比readme,检查对方代码的逻辑错误。

最终,本人找到了对方ERROR错误。包括在测试树中找到的,阅读对方代码时发现的逻辑错误,以及程序行为与readme不符的错误。

心得体会

编程前,最好提前想好类的划分,想好各个类之间如何协作。想好类之后,想每个类实现什么方法,再根据方法定义这个类的属性。最终,确定好程序的整个框架,先将接口写好,之后在具体实现这些接口。这样做,虽然短期内不能立即测试程序,只能从逻辑上判断程序的正确与否,但是在编码时的速度确实比较快的,且非常容易debug。当你程序逻辑正确时,程序出错只可能是某个方法或某些方法出现了错误。但是如果程序逻辑有问题,那么恐怕就需要重新设计整个程序了。所以提前的规划是非常重要的,程序逻辑是非常重要的。

posted @ 2018-04-04 15:50  Hull  阅读(315)  评论(0编辑  收藏  举报