第一次作业:电梯程序

前言
在OOP题目集5 - 7的练习中,涉及的知识点丰富多样,如类的封装,单一职责原则,迪米特法则,还有电梯调度算法等。
题目集5题量较多,主要聚焦基础语法与简单类的设计,最后要求在题目给出的要求下完成基础的电梯运行程序设计,对于初次编写的我此次的难度巨大,(以致现在来说还未彻底完成,弄清楚)需要花大量时间理解题目要求以及思考如何具体实现电梯运行逻辑。
题目集6相较于5题量少了一些,毕竟是迭代题目,可难度依旧不小,对之前电梯调度程序进行迭代性设计,需要把单个类拆分成多个类,并且类设计要求遵循单一职责原则。
题目集7则是重于多类设计,最后对题目集6单部电梯调度问题进一步优化,要求对题目集6的设计再次进行迭代性设计,主要是来锻炼写出有更高扩展性和可维护性的代码
(虽说三个题目都是一个核心电梯问题迭代,但需要彻底弄清运行逻辑才能弄清后期迭代,初次难度较大,部分测试点未完成)

第一次作业分析
单部电梯调度程序原题:
  设计一个电梯类,具体包含电梯的最大楼层数、最小楼层数(默认为1层)当前楼层、运行方向、运行状态,以及电梯内部乘客的请求队列和电梯外部楼层乘客的请求队列,其中,电梯外部请求队列需要区分上行和下行。
  电梯运行规则如下:电梯默认停留在1层,状态为静止,当有乘客对电梯发起请求时(各楼层电梯外部乘客按下上行或者下行按钮或者电梯内部乘客按下想要到达的楼层数字按钮),电梯开始移动,当电梯向某个方向移动时,优先处理同方向的请求,当同方向的请求均被处理完毕然后再处理相反方向的请求。电梯运行过程中的状态包括停止、移动中、开门、关门等状态。当电梯停止时,如果有新的请求,就根据请求的方向或位置决定移动方向。电梯在运行到某一楼层时,检查当前是否有请求(访问电梯内请求队列和电梯外请求队列),然后据此决定移动方向。每次移动一个楼层,检查是否有需要停靠的请求,如果有,则开门,处理该楼层的请求,然后关门继续移动。
  使用键盘模拟输入乘客的请求,此时要注意处理无效请求情况,例如无效楼层请求,比如超过大楼的最高或最低楼层。还需要考虑电梯的空闲状态,当没有请求时,电梯停留在当前楼层。

输入格式:

第一行输入最小电梯楼层数。
第二行输入最大电梯楼层数。
从第三行开始每行输入代表一个乘客请求。

电梯内乘客请求格式:<楼层数>
电梯外乘客请求格式:<乘客所在楼层数,乘梯方向>,其中,乘梯方向用UP代表上行,用DOWN代表下行(UP、DOWN必须大写)。
当输入“end”时代表输入结束(end不区分大小写)。
输出格式:

模拟电梯的运行过程,输出方式如下:

运行到某一楼层(不需要停留开门),输出一行文本:
Current Floor: 楼层数 Direction: 方向
运行到某一楼层(需要停留开门)输出两行文本:
Open Door # Floor 楼层数
Close Door

本题要求设计一个电梯类来模拟电梯的运行过程,核心在于对电梯的属性和行为进行合理建模,并根据输入的乘客请求准确模拟电梯的运行逻辑。这涉及到对输入数据的处理、电梯状态的管理以及运行规则的实现。
需求理解(分析题目需求,高效完成功能)
电梯属性
最大楼层数:明确电梯所能到达的最高楼层。
最小楼层数:默认值为 1 层,代表电梯所能到达的最低楼层。
当前楼层:电梯当前所处的位置。
运行方向:包括上行(UP)和下行(DOWN),用于确定电梯的移动方向。
运行状态:涵盖停止、移动中、开门、关门等状态,反映电梯当前的操作情况。
请求队列:分为电梯内部乘客的请求队列和电梯外部楼层乘客的请求队列,外部请求队列需区分上行和下行。
电梯运行规则(完成此题目的关键,真的卡了很久)
初始状态:电梯默认停留在 1 层,状态为静止。
启动条件:当有乘客发起请求时,电梯开始移动。
请求处理顺序:电梯向某个方向移动时,优先处理同方向的请求,同方向请求处理完后再处理相反方向的请求。
状态转换:电梯运行过程中会在停止、移动中、开门、关门等状态之间转换。停止时若有新请求,根据请求方向或位置决定移动方向。
停靠规则:运行到某一楼层时,检查是否有请求,若有则开门处理该楼层请求,然后关门继续移动。

总结:
第一次同前面说的一样对于题目的理解不透彻,导致中间走了许多弯路,运行规则的设计,导致输出开关门又不输出当前楼层,与预期输出不符合。总之第一次作业才初次了解电梯

第二次作业分析
单部电梯调度程序第一次迭代分析
  题目集6对之前电梯调度程序进行迭代性设计,目的为解决电梯类职责过多的问题,类设计要求遵循单一职责原则,要求必须包含但不限于设计电梯类、乘客请求类、队列类以及控制类。此次作业输入输出格式与先前的题目集5相同,只需要对题目集5中的类拆散成几个类,并且要合理调整类之间的关系

电梯运行规则与前阶段单类设计相同,但要处理如下情况:

乘客请求楼层数有误,具体为高于最高楼层数或低于最低楼层数,处理方法:程序自动忽略此类输入,继续执行
乘客请求不合理,具体为输入时出现连续的相同请求,

此次迭代针对异常请求的处理对主方法的数据读入进行修改,通过if-else语句进行判断,当输入的请求楼层位于正常范围内,并且与前一个请求楼层不同时,将请求楼层添加到电梯请求队列中,否则忽略该请求。这样能够保证电梯请求队列中的请求楼层不重复,同时解决了输入异常的情况,并且符合电梯运行规则。

反省与总结
由上述数据可知,本次的程序在复杂度上有下降,可以看出队列在处理这个问题的优越性,同时多类的划分也起到了巨大的作用,但是,调用语句依旧很多,耦合性还是很强,从中反应了我对分情况处理问题的思考上存在问题,我应该进一步优化程序的设计。

总结
三次作业给影响最为深刻的就是对需求的分析,不要盲目的写代码,一定要把需求研究清楚才能去做设计
学会了本阶段的核心AVA的23个模式之一类的设计要遵循单一职责原则(SRP)。
逻辑思维,对于复杂问题的分析能力,与抽象思维获得提升。

posted @ 2025-04-20 23:55  喻。  阅读(16)  评论(0)    收藏  举报