第一次Blog作业
- 前言
一. 题目集中蕴含的知识点:
-
类与对象:定义了多个类,如 Elevator(电梯类)、RequestQueue(请求队列类)、Controller(控制器类)等。每个类封装了相关的属性和方法,通过创建类的实例(对象)来实现具体功能 ,如 Elevator 类的对象表示电梯,包含当前楼层、运行方向等属性。
-
封装:类中的属性大多被声明为私有(如 Elevator 类的 currentFloor、direction 等属性 ),通过公共的访问器方法(getter)和修改器方法(setter)来对属性进行访问和修改,保证了数据的安全性和一致性 。
-
继承与多态:代码中未直接体现继承和多态特性,但从整体架构设计上,后续可以通过继承扩展不同类型电梯或请求队列等功能,利用多态实现不同行为的统一处理。
枚举类型定义了 Direction(方向枚举,包含 UP、DOWN、IDLE )和 State(状态枚举,包含 MOVING、STOPPED )枚举类型,用于更清晰、安全地表示电梯的运行方向和状态,避免使用普通常量可能带来的混淆和错误 。
数据结构
使用 LinkedList 来实现请求队列,RequestQueue 类中分别用 LinkedList 存储内部请
求(internalRequests )和外部请求(externalRequests ) 。LinkedList 适合频繁的插
入和删除操作,符合请求队列不断添加和移除请求的特点。
控制流程
- 条件判断:在 determineDirection、shouldStop、getNextFloor 等方法中,大量使用 if-else 条件判断语句,根据不同条件(如请求情况、电梯当前状态等)来决定电梯的运行方向、是否停靠等逻辑。
- 循环结构:processRequests 方法中的 while 循环用于持续处理请求队列中的请求,直到队列为空。
输入输出处理
通过 Scanner 类从控制台读取用户输入,包括电梯的最小和最大楼层,以及内部和外部请求。同时,通过 System.out.println 方法输出电梯运行过程中的相关信息,如当前楼层、运行方向、开关门提示等。
算法逻辑
实现了电梯运行逻辑的核心算法,包括确定运行方向(determineDirection 方法 )、计算下一个目标楼层(getNextFloor 方法 )、判断是否停靠(shouldStop 方法 )以及处理请求(removeRequests 方法 )等,模拟了现实中电梯的运行调度机制。
二. 关于题目集的题量及难度:
- 对于5~7题目集中题目数量总体上来说并没有太多,只有13道题目左右。
但题目对java学习者具有较强的针对性,能够有效的考查对所学知识点的运用。 - 题目集在难度上的设计是层层递进的,由易到难,由简入繁。从对知识点的简单运用到对“面对对象设计”理念的深入了解。
- 设计与分析
一. 第一次作业:
-
作业要求:
设计一个电梯类,具体包含电梯的最大楼层数、最小楼层数(默认为1层)当前楼层、运行方向、运行状态,以及电梯内部乘客的请求队列和电梯外部楼层乘客的请求队列,其中,电梯外部请求队列需要区分上行和下行。 -
实现方式:
通过ArrayList和LinkedList等处理和存储内外部请求。 -
类图:
-
复杂度分析:
复杂度较高的几个函数:
-
Main.main():
承担了程序的主入口,具有判断内外部请求的作用。
优化建议:
模块化拆分:将初始化、输入处理、对象创建等功能拆分成独立小方法,降低 main 方法的功能聚合度。比如把输入读取和校验独立成一个方法,让 main 方法只负责调用相关方法并控制整体流程。
简化条件判断:梳理条件判断逻辑,提取重复判断或合并相似逻辑分支,减少不必要的嵌套 -
Main.run():
电梯的基本运行函数均存放在此函数中,还需考虑内外部请求的优先级。
优化建议:
提取子逻辑:把运行方向确定、请求处理等逻辑分别提取成独立方法,降低单个方法复杂度。例如把电梯运行方向确定逻辑封装成一个方法,根据电梯状态和请求队列返回合适方向。
使用设计模式:考虑引入状态模式等设计模式来管理电梯状态,使状态转换逻辑更清晰,减少代码耦合度。 -
Bug分析:
这次作业我并没有成功的得到正确的测试结果。但对大致的类进行了编写以及分类,也在给定类图的基础上添加了一些成员方法使得程序运行更加快速。
在输入与输出上第一次程序的代码完成了基础要求实现,导致代码测试点错误的原因在于程序处理内外部请求时逻辑发生了错误,会同时当遍历到一个请求时会删除内外部相同的请求。
在处理内外部请求时进行判断的逻辑在处理内外部请求时的优先级不同导致代码出现错误。
二.第二次作业:
- 作业要求:
设计一个电梯类,具体包含电梯的最大楼层数、最小楼层数(默认为1层)当前楼层、运行方向、运行状态,以及电梯内部乘客的请求队列和电梯外部楼层乘客的请求队列,其中,电梯外部请求队列需要区分上行和下行。
在上述基础上处理以下可能出现的情况:
乘客请求楼层数有误,具体为高于最高楼层数或低于最低楼层数,处理方法:程序自动忽略此类输入,继续执行
乘客请求不合理,具体为输入时出现连续的相同请求,例如<3><3><3>或者<5,DOWN><5,DOWN>,处理方法:程序自动忽略相同的多余输入,继续执行,例如<3><3><3>过滤为<3>
-
实现方法:
在main方法中对接受内部请求时加以修改使得能够实现过滤请求的功能。 -
类图:
-
复杂度分析:
-
代码中Controller.processRequests()函数复杂度较高,因为函数内包含了许多的电梯运行逻辑处理逻辑以及需要调用多个函数。
优化建议:
提取子逻辑:把运行方向确定、请求优先级判断等核心逻辑分别提取成独立方法,降低单个方法的复杂度。例如将电梯运行方向确定逻辑封装成一个方法,根据电梯和请求队列状态返回合适方向。
引入设计模式:考虑使用责任链模式等设计模式来优化请求处理流程,使各处理环节职责更清晰,减少代码间的耦合度。 -
Bug分析:
在对main方法进行请求过滤改进时出现无法有效到达效果的问题,最后通过正则表达式的学习以及运用使得功能得以实现。
在处理请求出入队时的逻辑还是无法得到解决,当出现内外部请求相同时会同时删除内外部相同的请求,使得电梯测试结果出现错误。
三. 第三次作业:
-
作业要求:
设计一个电梯类,具体包含电梯的最大楼层数、最小楼层数(默认为1层)当前楼层、运行方向、运行状态,以及电梯内部乘客的请求队列和电梯外部楼层乘客的请求队列,其中,电梯外部请求队列需要区分上行和下行。
再前两次需求的基础上,对之前电梯调度程序再次进行迭代性设计,加入乘客类(Passenger),取消乘客请求类,类设计要求遵循单一职责原则(SRP),要求必须包含但不限于设计电梯类、乘客类、队列类以及控制类。 -
实现方法:
添加乘客类,部分修改main方法。 -
类图:
-
复杂度分析:
代码中Controller.processRequests()函数复杂度较高,该方法涉及与电梯对象(Elevator)、请求队列等多个
模块频繁交互。既要获取电梯的实时状态信息,又要根据请求处理情况更新电梯状态,同时还要管理请求队列(添加、移除请求等)
优化建议:
分出几个子模块进行功能的调用或采取更简单的算法进行优化。
- Bug分析:
本次编码通过了部分测试点,但在第一个测试点运行超时了。
改进建议 - 对于第三次作业出现超时,原因是processRequest()函数中太多if-else的基础语法的嵌套导致复杂度过高从而运行超时,希望可以通过后续的学习加强算法的能力。
- 前两次作业均没有得分,在于对电梯逻辑的不理解以及转换为编码能力的欠缺。
可以通过多解题积累“面对对象思想”的思维。
- 总结
在完成这一系列电梯调度程序作业的过程中,我经历了从困惑到逐渐明晰的过程,不仅深入掌握了Java编程的核心技术,更对面向对象编程思想有了全新的认识。这三次作业如同层层递进的阶梯,让我在实践中不断成长与进步。
一、知识与技能的全面提升
-
面向对象编程的深度应用
通过对电梯类、请求队列类和控制器类等的设计与实现,我熟练掌握了类与对象的构建方法。将电梯的属性和行为封装在类中,通过对象实现具体功能,真正理解了封装的意义。虽然作业中未涉及继承与多态,但也意识到它们在系统扩展中的重要性,为后续学习指明了方向。 -
数据结构与算法的实践运用
使用LinkedList实现请求队列,充分发挥了其在频繁插入和删除操作中的优势。在电梯运行逻辑算法设计上,从确定运行方向到判断是否停靠,每一个环节都让我体会到算法设计的精妙之处,提升了逻辑思维能力。 -
输入输出与异常处理
学会了使用Scanner读取控制台输入,并通过System.out.println输出关键信息。在处理请求楼层错误和重复请求时,掌握了异常处理和数据过滤的方法,增强了程序的健壮性。
二、作业过程的深入剖析
-
第一次作业:探索与失误
首次尝试设计电梯类,虽然完成了基础框架搭建,但在请求处理逻辑上出现严重错误。由于没有正确区分内部和外部请求的优先级,导致请求处理混乱,未能通过测试。这次失败让我意识到逻辑严谨性的重要性。 -
第二次作业:改进与突破
针对第一次作业的问题,在main方法中引入正则表达式进行请求过滤,成功解决了重复请求和无效请求的处理问题。然而,请求出入队逻辑的错误依然存在,这说明对程序细节的把控还需加强。 -
第三次作业:优化与挑战
添加乘客类并遵循单一职责原则重构代码,虽然通过了部分测试点,但在第一个测试点出现运行超时问题。分析发现,过多的if-else嵌套导致算法复杂度升高,这也暴露出我在算法优化方面的不足。
三.对课程的建议与展望
-
教学内容的优化
建议在课程中增加更多实际案例的讲解,特别是在算法优化和设计模式应用方面,帮助学生更好地理解和掌握相关知识。 -
实践环节的加强
希望能提供更多的实践项目和编程挑战,让学生在实践中巩固所学知识,提高解决实际问题的能力。同时,增加代码评审和交流环节,促进学生之间的学习和进步。 -
学习资源的丰富
提供更多的学习资源,如优秀的开源项目、技术博客和在线课程等,拓宽学生的学习渠道,激发学习兴趣。