南昌航空大学面向对象第一轮作业总结
目录[*]面向对象第一次作业总结
[*]前言
[*]
[*]关于题量
[*]关于知识点
[*]关于难度
[*]设计与分析
[*]第一次题集电梯调度分析
[*]
[*]类的设计
[*]SourceMonitor代码分析:
[*]第二次电梯调度分析
[*]
[*]类的设计
[*]SourceMonitor代码分析:
[*]第三次电梯调度分析
[*]
[*]类的设计
[*]SourceMonitor代码分析:
[*]踩坑心得
[*]
[*]第一次电梯调度
[*]第二次电梯调度
[*]第三次电梯调度
[*]改进建议
[*]总结
面向对象第一次作业总结
前言
关于题量
对于本次作业来说,题量并不算多,最多的一次时题集五的五题,后续两次题目量适中。
关于知识点
第一次题集的前两次只是一些简单的java语法,题目都与c对接。后续两题举行了一些简单的正则表达式的训练来为第三题做铺垫。第五题则是电梯调度,采用了LOOK算法,还没涉及到类的设计。
第二次题集开始涉及到类的设计了,第一题点与线和第二题的雨刷器涉及到了类关系中的关联与依赖。第三题是对第一次电梯调度设计的迭代,将电梯类拆分开来,实现单一职责原则。
第三次题集也是类的设计。第一题采用了依赖,减轻各个类之间的耦合。第二题蒙特卡罗方法求圆周率利用了java的随机数生成和蒙特卡罗方法来求圆周率。第三题是对第二题电梯调度设计的迭代,修改了类和输入方式。
关于难度
这三次题集的题目除了电梯调度难度不算高,只要认真写肯定能通过。第一次写电梯调度会感觉难度较高,不清楚内在逻辑,非常盲目。但在完成第一次电梯调度之后,后续的迭代难度就会有所降低。只要在原有的基础上举行修改,和重新拆分设计类。
设计与分析
第一次题集电梯调度分析
https://img2024.cnblogs.com/blog/3634163/202504/3634163-20250415191606100-2075370111.png
类的设计
在电梯类中设计了检查内部队列和外部队列队列空置,还有获取下一楼层的方法。
[*]数据输入
利用正则表达式来爬取信息,爬取到UP/DOWN就加入外部队列,没有爬取到则加入内部队列。
[*]模拟队列
因为不能利用ArrayList类,以是我利用数组和相对应的下标来举行模拟队列存储数据。这样的长处在于删除队头数据时不消移动后续数据以此来减少操作,缺点是空间占用比较高,利用空间来换时间。
[*]运行逻辑
我将其分为两个大方向,一个是上行一个是下行。在上行(或下行)时判断是否非空,再将其分为三类,第一类是内外部队列都非空时判断外部为同向来获取下一楼层,一个是外部差别向来获取下一楼层。第二类是与第三类为其中一个队列空置的情况。长处:逻辑较为清晰。缺点:将其做成了一个方法,if-else嵌套过多。
[*]电梯运行及转向
这个方法在主函数内举行完成,通过电梯类来获取到下一楼层,每经过一层举行输出,到达指定楼层后举行开门,关门操作。当获取不到下一楼层时更改电梯运行状态。然后判断队列是否清空,清空则竣事,否则就举行转向继续运行。
https://img2024.cnblogs.com/blog/3634163/202504/3634163-20250415151342996-350773869.png
SourceMonitor代码分析:
点击查看复杂度数据https://img2024.cnblogs.com/blog/3634163/202504/3634163-20250417085308616-1458900446.png
[*]函数复杂度
最大复杂度到达了6但是不知道为什么在kiviat图上却显示在公道范围内,第一次写只是想着把题目写出来,并没有关心圈复杂度,把大量的if-else嵌套在一个方法中了。由于其他方法比较简单并不消写许多嵌套以是均匀复杂度只有1.63,大概在拆分过后会有所进步。
[*]代码深度
代码得均匀深度在良好范围内,最大代码深度与函数圈复杂度一样到达了6,嵌套了太多if-else,影响可读性和可维护性。后续需要只管控制代码深度在4以下。
[*]代码注释率
代码注释处于良好范围内,有利于阅读。
[*]小心得:以后在设计方法是要留意代码的深度,确保代码的深度在4以下,这样有利于修改,可读性也更强。代码的注释也不能忘。
第二次电梯调度分析
https://img2024.cnblogs.com/blog/3634163/202504/3634163-20250415194616012-417074198.png
类的设计
[*]电梯类
定义私有属性最大最小楼层,当前楼层,以及运动状态。写了基本的get、set方法,符合单一职责原则。
[*]外部哀求类
私有属性目标楼层和运动方向。写了基本的get、set方法。与;哀求队列类举行关联。
[*]哀求队列类
两个ArrayList的数组来模拟队列。将第一次的判断队列空置的方法放在了哀求队列中。哀求入队方法和删除哀求方法也在此类中。别的在第一次电梯类的基础上增加了获取队列第一个数据和最后一个数据的方法。
[*]控制类
将电梯类和哀求队列类作为属性,将它们直接的耦合削弱。两个基本的get方法。将第一次电梯调度的获取下一楼层放在了此类中。与第一次相同的是,我同样并没有把获取下一楼层拆分成多个方法,导致if-else过多。但运行放在了主函数里。
https://img2024.cnblogs.com/blog/3634163/202504/3634163-20250415203242179-1624385909.png
SourceMonitor代码分析:
点击查看复杂度数据https://img2024.cnblogs.com/blog/3634163/202504/3634163-20250417091009250-472706136.png
[*]函数复杂度
代码的均匀复杂度处于良好范围内,数据分析上不知道为什么是显示17,但实际复杂度是与
最大深度是一致的都是6。因为没有把第一次电梯调度的方法举行拆分只是修改了代码以是最大复杂度和第一次一样。
[*]代码深度
代码的均匀深度是2.46,相较于第一次的2.10相差不大,处于java良好代码的范围内。最大得代码深度到达了6也是因为if-else嵌套过多。
[*]代码注释率
代码注释处于良好范围内,有利于阅读。需要继续保持。
[*]小心得:在代码迭代时要留意原有方法不公道的地方,要对其举行重构,由于第二次迭代没有重构导致函数复杂度相较与第一次有显着升高,以后要小心。
第三次电梯调度分析
https://img2024.cnblogs.com/blog/3634163/202504/3634163-20250415205130779-1977791678.png
类的设计
[*]电梯类
由于是删除了外部哀求队列,电梯类与外部哀求无关,第三次电梯类的设计与第二次保持一致。
[*]搭客类
第三次电梯迭代是在第二次的基础上删除了外部哀求队列将其替换成搭客类。定义了私有的目标楼层和原楼层。写了基础的get、和set。别的将状态从属性改成了从方法获取。
[*]哀求队列类
由于只编削了外部哀求类,只将哀求队列内的外部哀求属性改成搭客类,再把对应的方法举行修改。增加了将外部哀求的目的楼层加到内部队列队尾的方法。
[*]控制类
把原本调用外部搭客哀求方法修改成搭客类对应的方法。并且在第二次电梯迭代的基础上对获取下一楼层的方法举行了重构拆分。把放在主函数的运行改到了控制类中,通过调用控制类中的运行方法来实现运行。
[*]读取的修改
输入的外部数据不在时目的楼层和上下行,改为了哀求楼层目的楼层。对正则表达式举行了修改,通过给正则表达式分组来获取想要的信息。
https://img2024.cnblogs.com/blog/3634163/202504/3634163-20250415215305598-563438650.png
SourceMonitor代码分析:
点击查看复杂度数据https://img2024.cnblogs.com/blog/3634163/202504/3634163-20250417092500576-1553936547.png
[*]函数复杂度
代码的均匀复杂度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]