本次作业在第五次作业的基础上新增了两个功能:

  1. 允许新增自定义电梯。
  2. 允许电梯进入维护状态(即从系统中移除此电梯)

自定义电梯里可自定义的参数:运行速度、载客数量、起始楼层

新增电梯与维护电梯

新增电梯没什么特别好说的,获取电梯的各个参数然后直接 addbuilding 的电梯数组里就可以。

维护电梯事实上就是给电梯发出一个死亡信号,让这个电梯立刻停下手中的工作,然后让其去世,最后将其从 building 的电梯数组中删除。

在死亡过程中,首先释放电梯尚未接到的任务。然后让电梯立刻转到开门状态(如果已经处于开门状态则不开门),释放内部乘客后将其置为死亡状态。

重构部分

Hw6 的过程中小小的重构了一下自己的代码。

主要内容包括:将时钟周期置为 0.1s。为新的请求类型添加了解析方法。

复杂度分析

method CogC ev(G) iv(G) v(G)
AllRequest.AllRequest(ArrayList\) 0.0 1.0 1.0 1.0
AllRequest.getRequest() 4.0 3.0 3.0 3.0
AllRequest.getRequests() 0.0 1.0 1.0 1.0
AllRequest.isEmpty() 0.0 1.0 1.0 1.0
AllRequest.isEnd() 0.0 1.0 1.0 1.0
AllRequest.run() 1.0 1.0 1.0 2.0
Building.Building(AllRequest, ArrayList\) 1.0 1.0 2.0 2.0
Building.elevatorDie(Elevator) 15.0 6.0 14.0 14.0
Building.elevatorEnd() 3.0 3.0 2.0 3.0
Building.findNearEmpty(int) 6.0 1.0 4.0 4.0
Building.handleRequest() 12.0 7.0 7.0 7.0
Building.isEnd() 1.0 1.0 4.0 4.0
Building.pasAlloc(Passenger) 9.0 6.0 6.0 6.0
Building.run() 3.0 2.0 2.0 3.0
Building.step() 11.0 1.0 7.0 7.0
Elevator.capacityAllow(Passenger) 12.0 6.0 1.0 6.0
Elevator.carry(Passenger) 6.0 1.0 1.0 4.0
Elevator.checkBegin() 5.0 2.0 4.0 6.0
Elevator.Elevator(int, int, double, int, int, int, int) 1.0 1.0 1.0 2.0
Elevator.findBottom() 3.0 1.0 3.0 3.0
Elevator.findTop() 3.0 1.0 3.0 3.0
Elevator.getFloor() 0.0 1.0 1.0 1.0
Elevator.getId() 0.0 1.0 1.0 1.0
Elevator.getPassengers() 0.0 1.0 1.0 1.0
Elevator.getState() 0.0 1.0 1.0 1.0
Elevator.getTasks() 0.0 1.0 1.0 1.0
Elevator.ifOff() 3.0 3.0 2.0 3.0
Elevator.ifOff(Passenger) 0.0 1.0 1.0 1.0
Elevator.ifPassingly(Passenger) 11.0 7.0 4.0 7.0
Elevator.ifTake() 6.0 3.0 2.0 4.0
Elevator.ifTake(Passenger) 1.0 1.0 2.0 2.0
Elevator.isDie() 0.0 1.0 1.0 1.0
Elevator.isEmpty() 0.0 1.0 1.0 1.0
Elevator.isEnd() 1.0 1.0 2.0 2.0
Elevator.isFree() 1.0 1.0 2.0 2.0
Elevator.move() 20.0 2.0 6.0 9.0
Elevator.setDie(boolean) 0.0 1.0 1.0 1.0
Elevator.step() 21.0 3.0 14.0 16.0
Elevator.takeOff() 4.0 2.0 3.0 4.0
Elevator.takeOff(Passenger) 6.0 1.0 1.0 4.0
Elevator.takeOffAll() 1.0 1.0 2.0 2.0
Elevator.takeOn() 4.0 2.0 3.0 4.0
Elevator.takeOn(Passenger) 0.0 1.0 1.0 1.0
Elevator.toString() 0.0 1.0 1.0 1.0
Elevator.tryClose() 4.0 3.0 3.0 4.0
Elevator.tryOpen() 7.0 4.0 6.0 7.0
MainClass.main(String[]) 0.0 1.0 1.0 1.0
Passenger.getDirection() 0.0 1.0 1.0 1.0
Passenger.getFinish() 0.0 1.0 1.0 1.0
Passenger.getId() 0.0 1.0 1.0 1.0
Passenger.getStart() 0.0 1.0 1.0 1.0
Passenger.Passenger(int, int, int) 1.0 1.0 1.0 2.0
Passenger.takeOff(int) 0.0 1.0 1.0 1.0
Passenger.toString() 0.0 1.0 1.0 1.0
State.getValue() 0.0 1.0 1.0 1.0
State.isClosing() 0.0 1.0 1.0 1.0
State.isOpen() 0.0 1.0 1.0 1.0
State.isOpening() 0.0 1.0 1.0 1.0
State.isRunning() 0.0 1.0 1.0 1.0
State.isWait() 0.0 1.0 1.0 1.0
State.setClosing() 0.0 1.0 1.0 1.0
State.setOpen() 0.0 1.0 1.0 1.0
State.setOpening() 0.0 1.0 1.0 1.0
State.setRunning() 0.0 1.0 1.0 1.0
State.setWait() 0.0 1.0 1.0 1.0
State.State(int) 0.0 1.0 1.0 1.0
Total 187.0 113.0 152.0 185.0
Average 2.8333333333333335 1.7121212121212122 2.303030303030303 2.803030303030303

本次作业的复杂度依然控制在一个可以接受的程度。事后发现了一些架构上的优化方法,可以进一步优化复杂度。

bug 分析

本次作业没有出现 bug,并在强测中拿到了 96.5 的成绩。由于状态机本质上是单线程逻辑,所以所有 bug 都可以稳定复现,在 dbug 的时候也相对方便(在需要观察的地方添加 println)。

在本次作业中由于将时钟周期设置为 0.1s,导致整体刷新速度过于频繁,反而导致了更久的 CPU 时长。经过综合考虑,我决定在下次作业里将时钟周期重设为更合理的 0.2s