南昌航空大学面向对象第一轮作业总结
目录[*]面向对象第一次作业总结
[*]前言
[*]
[*]关于题量
[*]关于知识点
[*]关于难度
[*]设计与分析
[*]第一次题集电梯调度分析
[*]
[*]类的设计
[*]SourceMonitor代码分析:
[*]第二次电梯调度分析
[*]
[*]类的设计
[*]SourceMonitor代码分析:
[*]第三次电梯调度分析
[*]
[*]类的设计
[*]SourceMonitor代码分析:
[*]踩坑心得
[*]
[*]第一次电梯调度
[*]第二次电梯调度
[*]第三次电梯调度
[*]改进建议
[*]总结
面向对象第一次作业总结
前言
关于题量
对于本次作业来说,题量并不算多,最多的一次时题集五的五题,后续两次题目量适中。
关于知识点
第一次题集的前两次只是一些简单的java语法,题目都与c对接。后续两题进行了一些简单的正则表达式的训练来为第三题做铺垫。第五题则是电梯调度,采用了LOOK算法,还没涉及到类的设计。
第二次题集开始涉及到类的设计了,第一题点与线和第二题的雨刷器涉及到了类关系中的关联与依赖。第三题是对第一次电梯调度设计的迭代,将电梯类拆分开来,实现单一职责原则。
第三次题集也是类的设计。第一题采用了依赖,减轻各个类之间的耦合。第二题蒙特卡罗方法求圆周率使用了java的随机数生成和蒙特卡罗方法来求圆周率。第三题是对第二题电梯调度设计的迭代,修改了类和输入方式。
关于难度
这三次题集的题目除了电梯调度难度不算高,只要认真写肯定能通过。第一次写电梯调度会感觉难度较高,不清楚内在逻辑,十分盲目。但在完成第一次电梯调度之后,后续的迭代难度就会有所降低。只要在原有的基础上进行修改,和重新拆分设计类。
设计与分析
第一次题集电梯调度分析
类的设计
在电梯类中设计了检查内部队列和外部队列队列空置,还有获取下一楼层的方法。
[*]数据输入
使用正则表达式来爬取信息,爬取到UP/DOWN就加入外部队列,没有爬取到则加入内部队列。
[*]模拟队列
因为不能使用ArrayList类,所以我使用数组和相对应的下标来进行模拟队列存储数据。这样的优点在于删除队头数据时不用移动后续数据以此来减少操作,缺点是空间占用比较高,使用空间来换时间。
[*]运行逻辑
我将其分为两个大方向,一个是上行一个是下行。在上行(或下行)时判断是否非空,再将其分为三类,第一类是内外部队列都非空时判断外部为同向来获取下一楼层,一个是外部不同向来获取下一楼层。第二类是与第三类为其中一个队列空置的情况。优点:逻辑较为清晰。缺点:将其做成了一个方法,if-else嵌套过多。
[*]电梯运行及转向
这个方法在主函数内进行完成,通过电梯类来获取到下一楼层,每经过一层进行输出,到达指定楼层后进行开门,关门操作。当获取不到下一楼层时更改电梯运行状态。然后判断队列是否清空,清空则结束,否则就进行转向继续运行。
SourceMonitor代码分析:
点击查看复杂度数据
[*]函数复杂度
最大复杂度达到了6但是不知道为什么在kiviat图上却显示在合理范围内,第一次写只是想着把题目写出来,并没有关心圈复杂度,把大量的if-else嵌套在一个方法中了。由于其他方法比较简单并不用写很多嵌套所以平均复杂度只有1.63,可能在拆分过后会有所提高。
[*]代码深度
代码得平均深度在良好范围内,最大代码深度与函数圈复杂度一样达到了6,嵌套了太多if-else,影响可读性和可维护性。后续需要尽量控制代码深度在4以下。
[*]代码注释率
代码注释处于良好范围内,有利于阅读。
[*]小心得:以后在设计方法是要注意代码的深度,确保代码的深度在4以下,这样有利于修改,可读性也更强。代码的注释也不能忘。
第二次电梯调度分析
类的设计
[*]电梯类
定义私有属性最大最小楼层,当前楼层,以及运动状态。写了基本的get、set方法,符合单一职责原则。
[*]外部请求类
私有属性目标楼层和运动方向。写了基本的get、set方法。与;请求队列类进行关联。
[*]请求队列类
两个ArrayList的数组来模拟队列。将第一次的判断队列空置的方法放在了请求队列中。请求入队方法和删除请求方法也在此类中。此外在第一次电梯类的基础上增加了获取队列第一个数据和最后一个数据的方法。
[*]控制类
将电梯类和请求队列类作为属性,将它们直接的耦合减弱。两个基本的get方法。将第一次电梯调度的获取下一楼层放在了此类中。与第一次相同的是,我同样并没有把获取下一楼层拆分成多个方法,导致if-else过多。但运行放在了主函数里。
SourceMonitor代码分析:
点击查看复杂度数据
[*]函数复杂度
代码的平均复杂度处于良好范围内,数据分析上不知道为什么是显示17,但实际复杂度是与
最大深度是一致的都是6。因为没有把第一次电梯调度的方法进行拆分只是修改了代码所以最大复杂度和第一次一样。
[*]代码深度
代码的平均深度是2.46,相较于第一次的2.10相差不大,处于java良好代码的范围内。最大得代码深度达到了6也是因为if-else嵌套过多。
[*]代码注释率
代码注释处于良好范围内,有利于阅读。需要继续保持。
[*]小心得:在代码迭代时要注意原有方法不合理的地方,要对其进行重构,由于第二次迭代没有重构导致函数复杂度相较与第一次有明显升高,以后要小心。
第三次电梯调度分析
类的设计
[*]电梯类
由于是删除了外部请求队列,电梯类与外部请求无关,第三次电梯类的设计与第二次保持一致。
[*]乘客类
第三次电梯迭代是在第二次的基础上删除了外部请求队列将其替换成乘客类。定义了私有的目标楼层和原楼层。写了基础的get、和set。此外将状态从属性改成了从方法获取。
[*]请求队列类
由于只删改了外部请求类,只将请求队列内的外部请求属性改成乘客类,再把对应的方法进行修改。增加了将外部请求的目的楼层加到内部队列队尾的方法。
[*]控制类
把原本调用外部乘客请求方法修改成乘客类对应的方法。并且在第二次电梯迭代的基础上对获取下一楼层的方法进行了重构拆分。把放在主函数的运行改到了控制类中,通过调用控制类中的运行方法来实现运行。
[*]读取的修改
输入的外部数据不在时目的楼层和上下行,改为了请求楼层目的楼层。对正则表达式进行了修改,通过给正则表达式分组来获取想要的信息。
SourceMonitor代码分析:
点击查看复杂度数据
[*]函数复杂度
代码的平均复杂度1.94接近良好范围,说明将方法拆分是正确的。最大复杂度是16,与第二次迭代的一样由于if-else嵌套过多导致最大复杂度过高,这说明我的重构和拆分并不是很合理。
[*]代码深度
平均深度是2.27,处于良好范围内。最大的代码深度仍然达到了6,也是因为拆分并不合理导致的。
[*]代码注释率
代码注释处于良好范围内,有利于阅读。要继续保持。
踩坑心得
第一次电梯调度
第一次看到串行时不知道什么意思,也没有去查,只靠自己的猜测这是不应该的。对电梯的运行规则不清楚,对电梯优先处理同方向的移动没理解到位。对反方向处理的特例没有进行判断。只是浮于表面的思考就开始写题目。导致测试例子出现逻辑问题。经过多次调试后才发现问题所在。在写题目之前就应该理清楚逻辑分析好需求,不然盲目的写代码也只是竹篮打水一场空。
点击查看代码public int getNextFloor(){ if(direct.equals("UP")){//两个队列都非空的判断 if(ii1 nowFloor){ min2 = exter; flag2 = 1; } if(flag1 == 1&&flag2 == 1){//都大于当前楼层 if(min1min2){//外部离得近 exst = 1; return exter; }else if(min1==min2){//一样近 inst = 1; exst = 1; return inter ; } }else if(flag1 == 1&&flag2 == 0){//内部大于当前楼层 inst = 1; return inter; }else if(flag1 == 0&&flag2 == 1){//外部请求大于当前楼层 exst = 1; return exter; } }else if(exterst.equals("DOWN")){//外部请求不同向 if(inter>nowFloor){ inst = 1; return inter; }else if(internowFloor){ exst = 1; direct = "DOWN"; return exter; } } }else if(ii1 == ii&&ee1
页:
[1]