作业小结
2018-06-18 02:19:36来源:未知 阅读 ()
度量分析
method | ev(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 |
class | Cyclic | Dcy | Dcy* | Dpt | Dpt* |
---|---|---|---|---|---|
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时,利用了分支树来进行系统性的测试,从输入格式错误、到输入格式正确、再到边界数据测试、压力测试等等。这样测试较为系统,也较为全面。另外,我还看了对方的源代码,期望从中发现一些逻辑错误。
第二次作业
度量分析
method | ev(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 |
class | Cyclic | Dcy | Dcy* | Dpt | Dpt* |
---|---|---|---|---|---|
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类交互,更能体现“高内聚、低耦合”的设计原则。
编程时程序逻辑首先是不能错的。在设计程序时,要在逻辑完备的基础上,再去检查边界情况。
第三次作业
度量分析
method | ev(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 |
class | Cyclic | Dcy | Dcy* | Dpt | Dpt* |
---|---|---|---|---|---|
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。当你程序逻辑正确时,程序出错只可能是某个方法或某些方法出现了错误。但是如果程序逻辑有问题,那么恐怕就需要重新设计整个程序了。所以提前的规划是非常重要的,程序逻辑是非常重要的。
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- JDK8的JVM内存模型小结 2020-06-03
- MapperReduce序列化自定义分区作业 2020-05-20
- 一起作业Java实习面试(offer到手含面试经验及答案) 2020-05-06
- OO第二阶段(5-8周)PTA作业总结 2020-05-02
- OO第二阶段作业总结 2020-04-30
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash