面向对象课程 HW6
本次作业在第五次作业的基础上新增了两个功能:
- 允许新增自定义电梯。
- 允许电梯进入维护状态(即从系统中移除此电梯)
自定义电梯里可自定义的参数:运行速度、载客数量、起始楼层
新增电梯与维护电梯
新增电梯没什么特别好说的,获取电梯的各个参数然后直接 add 进 building 的电梯数组里就可以。
维护电梯事实上就是给电梯发出一个死亡信号,让这个电梯立刻停下手中的工作,然后让其去世,最后将其从 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。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Bluebean's Blog!
评论