电梯调度程序分析
一.前言
本次博客将完整复盘电梯调度系统的三次迭代开发历程。第一次迭代聚焦核心功能落地,以单一电梯类封装所有状态、队列与调度逻辑,实现 “同向优先、逐层停靠” 的基础运行规则,解决 “能跑起来” 的核心问题;第二次迭代针对单一类职责过载的痛点,拆分出乘客请求类、队列类与控制类,新增无效请求过滤、重复请求去重机制,在保证功能稳定的同时,让代码架构更符合面向对象设计原则;第三次迭代则进一步优化实体建模,取消独立请求类、新增乘客类,调整外部请求输入格式为 “源楼层 - 目的楼层”,并新增 “外部请求处理后自动将目的楼层加入内部队列” 的业务逻辑,让系统更贴近真实电梯的运行场景,同时强化各模块的职责单一性。将深入拆解每一次迭代的设计思路、核心难点与代码实现:从单一类的逻辑封装,到多模块的协同设计
二、设计与分析
1.第一次题目集设计与分析
(1)类结构设计
MoveDir枚举类:定义电梯运行方向的标准枚举,统一方向标识与输出格式CallNode数据结构类:作为请求队列的基础数据节点,封装单个电梯请求的关键信息
CallQueue数据管理类:封装请求队列的所有操作,负责请求的存储、查询、删除与统计,独立管理请求生命周期
ElevatorController核心控制类:电梯调度的核心大脑,负责电梯状态管理、输入解析、调度决策、运行控制与停靠处理,串联全流程业务逻辑
CallNode数据结构类:作为请求队列的基础数据节点,封装单个电梯请求的关键信息
Main程序入口类:程序启动与输入输出交互,初始化系统并触发调度流程
类图设计:

(2)调度逻辑分析
主要围绕着“同向优先,沿途服务” 策略展开:
(3)源码指标分析(基于SourceMonitor)


关键指标数据速览:
| Maximum Complexity(最大圈复杂度) | 衡量函数内独立执行路径的数量,数值越高逻辑越复杂(一般建议≤10) | 5,处于合理范围,但Main.processLevelStop()复杂度为 5,是最复杂的方法 |
| Maximum Block Depth(最大模块深度) | 函数内分支结构的嵌套层数(如if-else、循环的嵌套),层数越多可读性越差 |
5,说明存在嵌套较深的逻辑块(如多层if-else或循环嵌套) |
| Average Block Depth(平均模块深度) | 所有函数的模块深度平均值 | 2.42,整体嵌套层次较适中 |
| Lines(总行数) | 代码总行数(含空行、注释) | 427 行,属于中小型规模代码 |
| Statements(语句数) | 可执行语句的数量(如赋值、分支、循环等) | 97,语句密度适中 |
| Percent Branch Statements(分支语句占比) | if、for、while等分支语句占总语句的比例,反映逻辑分支密度 |
22.7%,说明约五分之一的语句是分支逻辑,逻辑不算过度分散 |
| Methods per Class(每类方法数) | 单个类包含的方法数量 | 9.00,类的方法数偏多,需关注类的职责是否单一 |
| Average Statements per Method(平均每方法语句数) | 单个方法的平均语句数,反映方法的颗粒度 | 8.78,方法颗粒度较合理,未出现过度冗长的方法 |
规模与结构:代码总行数 427 行,包含 97 条可执行语句,单个类(Main)承载 9 个方法,平均每个方法约 8.78 条语句。这种规模属于中小型程序,但类的方法数偏多,存在 “职责过载” 的潜在风险。
复杂度分布:整体平均复杂度 3.00,处于合理范围,但核心方法Main.processLevelStop()的圈复杂度达到 5,是代码中最复杂的方法,说明该方法内逻辑分支较多,维护成本较高。
结构深度:最大模块深度为 5(即分支嵌套最多 5 层),平均模块深度 2.42,主要逻辑集中在 2-3 层嵌套,整体结构层次较适中,但深度为 5 的嵌套块仍需关注可读性。
2.第二次题目集设计与分析
(1)类结构设计
Direction枚举类:定义电梯运行方向与请求方向的标准枚举,统一方向标识,避免字符串直接使用导致的格式混乱
Request抽象基类:封装所有电梯请求的公共属性与行为,定义请求类的抽象接口,为外部请求和内部请求提供统一的继承基础
InternalRequest(内部请求)请求子类:封装电梯内部的目的楼层请求(如电梯内乘客按下目标楼层按钮),继承并实现Request抽象类的抽象方法
ExternalRequest(外部请求)请求子类:封装电梯外部的呼叫请求(如楼层外乘客按下上行 / 下行按钮),继承并实现Request抽象类的抽象方法
RequestQueue队列管理类:统一管理所有请求的存储、去重、查询与删除,区分外部请求和内部请求的独立队列,独立承担请求生命周期管理职责。
Elevator电梯实体类:封装电梯的物理属性与基础行为,管理电梯自身状态(当前楼层、运行方向),提供楼层移动的基础方法
ElevatorController核心控制类:电梯调度的 “大脑”,负责协调电梯与请求队列,实现调度算法(请求优先级判断、运行方向设置)、电梯运行控制与停靠处理
Main程序入口类:程序启动与输入输出交互,负责初始化系统组件、解析用户输入、触发调度流程
类结构图设计:

(2)调度逻辑分析
一、核心策略 1:同向优先(效率第一原则,避免无效折返)
1. 核心逻辑
2. “顺路” 请求判定标准
向上运行时:仅处理 “目标楼层≥当前楼层” 且 “请求为向上需求” 的请求
外部请求:对应楼层外按的「上按钮」(比如电梯在 3 楼向上,5 楼有人按上→顺路)
内部请求:只要目标楼层在当前楼层之上→默认顺路
向下运行时:仅处理 “目标楼层≤当前楼层” 且 “请求为向下需求” 的请求
外部请求:对应楼层外按的「下按钮」(比如电梯在 6 楼向下,4 楼有人按下→顺路)
内部请求:只要目标楼层在当前楼层之下→默认顺路
二、核心策略 2:距离就近(方向切换时的决策规则)
1. 触发场景(仅两种情况生效)
场景 1:当前方向无顺路请求,需切换方向(比如电梯到 10 楼后,向上方向无请求,需向下处理请求)
场景 2:电梯初始处于空闲状态(未运行),同时收到多个不同方向的请求
2. 决策逻辑
三、核心策略 3:内部请求优先(乘客体验优化规则)
1. 优先前提(非绝对优先,需满足 “顺路”)
2. 与外部请求的差异
外部请求:仅对应按钮方向(上 / 下)与电梯运行方向一致时,才视为顺路
内部请求:无论电梯向上还是向下,只要目标楼层在路径上,就视为顺路
四、完整调度流程(从请求到执行)
请求入队:外部呼梯、内部按楼层的请求,经有效性校验后进入队列(避免重复请求)
方向决策:控制器判断当前最优请求,将电梯方向设为 “朝向该请求的目标楼层”
移动运行:电梯按设定方向逐层移动,过程中只处理同方向顺路请求
停靠处理:到达最优请求的目标楼层时,触发开关门动作,处理该请求并从队列中移除
循环执行:重复 “方向决策→移动→停靠”,直到所有请求处理完毕,电梯进入空闲状态
(3)源码指标分析(基于SourceMonitor)



关键指标数据速览:





浙公网安备 33010602011771号