面向对象第二单元总结

一、设计策略分析总结

第五次作业:因为作业的要求比较简单,只要实现简单的电梯功能既可,所以在第一次电梯作业中,我选择将输入处理放入到主线程中,电梯单独开一个单独的线程,通过电梯和处理输入的线程共享一个请求队列来实现电梯对输入请求的处理,实现起来比较简单。

第六次作业:此时实际上还是只有一部电梯,所以输入的请求还是都由一部电梯来实现,所以输入请求处理在主线程中相当于一个调度器的作用,通过电梯和处理输入的线程共享一个请求队列来实现电梯对输入请求的处理,此时为了实现电梯的捎带功能,在电梯线程中新增一个reqonele队列,表示此时已经在电梯上但还未到达目的楼层的请求。并且电梯每到一个楼层就会遍历请求队列和在电梯上的请求队列:进行相应的进入或者出电梯操作(实际为队列成员的增加和删减)。

第七次作业:此次作业电梯数变为3,所以输入的请求并不一定是由同一部电梯执行,所以新增一个调度线程,调度线程和输入处理线程共享请求队列,同时调度线程根据请求向三部电梯进行分配请求,三部电梯和调度线程分别共享自己相应的请求队列。同时每个电梯自己有一个在电梯上的请求队列来实现捎带功能,同时三部电梯和调度线程一起共享一个转乘线程,来处理需要乘坐两部电梯才能到达目的地的请求。

二、程序度量分析

第五次作业:
类图:

算法思路:main程序中处理输入的请求,电梯线程检测到请求队列不为空则取一个请求进行处理,否则放弃时间片,同时,电梯线程内有一个标识变量初始设置为true,当输入处理检测到null时,将该标识变量设置为false,使得电梯线程在下一次循环时直接结束运行。

复杂度分析:

缺点:由于第一次作业比较简单,所以在设计的考虑上不够充分,是程序显得非结构化,输入请求的处理选择直接放在主线程中而不是另外单独再开一个线程,使得程序再拓展功能时改动较大,并且电梯的运行调度没有坐优化

优点:程序的实现原理简单易懂

根据SOLID原则存在的问题:程序每个类的职责单一,但是为了能实现电梯线程的正确结束,设置了一个public方法改变电梯线程中的一个成员变量的值,封闭性不够好。同时扩展功能要一定程度的修改已存在的代码,不符合开放封闭原则。

第六次作业:

类图:

算法思路:在第一次作业的基础上,在电梯线程中新增加一个在电梯上的请求队列,同时电梯从第一次作业的直接有出发楼层到目的楼层的运行模式变为在每一层都会遍历请求队列和电梯上的请求队列,来检查是否要进行相应的上下电梯操作。

复杂度分析:

缺点:由于第二次作业相比较于第一次作业只是新增加了一个捎带原则,所以在设计上只是在电梯线程的进行了调整,没有单独开一个线程进行输入处理的问题还是存在,同时在结果的输出上也有一点小bug没有查出导致强测错了很多

优点:程序的比较正确的实现了捎带功能,同时对电梯有上有下且正好电梯反向运行的情况也有处理

根据SOLID原则存在的问题:程序每个类的职责单一,但是为了能实现电梯线程的正确结束,设置了一个public方法改变电梯线程中的一个成员变量的值,封闭性不够好。同时扩展功能要一定程度的修改已存在的代码,不符合开放封闭原则。

第七次作业:

类图:

算法思路:为了能将输入的请求正确的分配给三个不同的电梯,新增一个调度线程,调度线程和输入处理线程共享请求队列,同时调度线程根据请求向三部电梯进行分配请求,三部电梯和调度线程分别共享自己相应的请求队列。同时每个电梯自己有一个在电梯上的请求队列来实现捎带功能,同时三部电梯和调度线程一起共享一个转乘线程,来处理需要乘坐两部电梯才能到达目的地的请求。

复杂度分析:

缺点:由于为了满足代码风格检测,将类中很多代码单独写成了一个方法使得每个类的方法有很多,同时部分方法的使用增加了程序的复杂度,同时电梯的运行优化也做得不够充分。

优点:正确实现了3部电梯的同时运行和特定情况下的协同运行。

根据SOLID原则存在的问题:程序每个类的职责单一,但是为了能实现电梯线程的正确结束,设置了一个public方法改变电梯线程中的一个成员变量的值,封闭性不够好。同时扩展功能要一定程度的修改已存在的代码,不符合开放封闭原则。

三、bug分析

第五次作业:

因为作业的要求比较简单,同时自己实现的功能也比较简单,所以顺利通过了中强测没有发现明显的bug

第六次作业:

由于中测的数据比较简单,同时也是自己课下的自己测试不够完备,在处理捎带过程中的一个程序输出代码段出现问题,使得电梯每进一个人就会OPEN一次。同时在处理捎带时,如果电梯上行到一个楼层时,正好所有乘客下电梯,同时在该楼层有一个下行的请求时,处理会出现错误,通过相应的判断进行了修复。同时中测还出现了RUNTIMEERROR的错误,通过让电梯线程在没有请求时sleep进行了修复。

第七次作业:

在中测中出现了CPU时间超时的问题,通过让输入处理请求的线程在没有输入但为检测到null时sleep,但是还在研究为什么前两次作业没有sleep不会出现时间超时的问题。

四、心得体会

由于这几次作业时自己第一次接触多线程代码的编写,所以在一些同步控制方面的编写显得比较笨重,但是看了实验课上给的样例程序,觉得自己还有很大的学习提升空间。同时,自己之前一直对共享对象的线程安全问题不是特别理解,总觉得对一个队列一边进行写操作一边进行读操作没什么问题。通过这几次作业,我知道由于多线程的问题难以复现,我们不能保证不对它加锁不会出现问题,所以为了保险起见,还是要对多个线程的共享对象进行必要的同步访问控制。同时,第七次作业的弱测和中测我全部AC了,但是在强测中却错了很多,这些错误仅仅是一个很小的bug,自己在输出时少加了一个判断变量,使得很多情况下出现了重复输出。这种自己私下再都测试几组数据就可以避免的问题,希望以这次教训为鉴以后多加注意!

 

posted @ 2019-04-24 09:17  16231259  阅读(130)  评论(0编辑  收藏  举报