OO第二单元博客作业
一、程序结构与设计策略分析
类图:
第一次作业:略(找不到了)
第二次作业:
- Main.java:仅用于启动调度器线程和输入进程,不涉及其他功能。
- Elevator.java:从实际的角度出发,调度器与电梯分离,电梯仅有一些基本的行为与属性,如开关门时间、电梯内乘客、开关门、上下行、进出乘客等。
- Person.java:用于表示电梯内的乘客,实际就是一个二元组,仅有id和to两个属性,及其get()方法。
- ElevatorInfo.java:接口,以常量的形式存储电梯的规格信息,如开关门时间、上下行时间、最大载客量等。
- RequestQueue.java:用于存储PersonRequest,通过保证了synchronized保证了线程安全。
- InputThread.java:输入线程,用于输入。
- SubDispatchThread.java:调度线程,采用一电梯一调度器的设计,通过wait()与notify()实现从RequestQueue取走PersonRequest的操作。
第三次作业:
- Main.java:仅用于启动调度器线程和输入进程,不涉及其他功能。
- Elevator.java:从实际的角度出发,调度器与电梯分离,电梯仅有一些基本的行为与属性,如开关门时间、电梯内乘客、开关门、上下行、进出乘客等。
- Floors.java:由于可运行楼层不连续,因此每一层使用floor和available来表示该层的楼层号以及是否可停,并封装成了Floors类。
- Person.java:用于表示电梯内的乘客,实际就是一个二元组,仅有id和to两个属性,及其get()方法。
- ElevatorInfo.java:接口,以常量的形式存储电梯的通用规格信息。
- InfoA/B/C.java:接口,以常量的形式存储A,B,C三类电梯的非通用规格信息。
- RequestQueue.java:用于存储PersonRequest,通过保证了synchronized保证了线程安全。
- InputThread.java:输入线程,用于输入。
- SubDispatchThread.java:调度线程,采用一电梯一调度器的设计,通过wait()与notify()实现从RequestQueue取走PersonRequest的操作。
二、可扩展性
- 第一次到第二次彻底重构了,感觉在写两个作业,8提了。
- 由于第二次作业为电梯预留出了一些额外的属性,而且采用的是一台电梯对应一个调度器的设计,因此从第二次到第三次并不需要重构。只需要针对多个不同的电梯修改一下调度策略即可
(说得轻巧)。
三、自己程序的bug
有的解决了,有的解决不了了
- 第二次作业中,在捎带的策略上遇到了一些问题,陷入了没有最优解的困惑
,还好后来用普通的捎带就能过。 - 第三次作业中,90%的bug出现在对于需要换乘的请求的处理,比如,拆分的后半段请求假如队列的时机不对、拆分之后乘客id出现重复等等等等
,写代码5分钟,dubug两小时。
四、他人程序的bug
- 没有采用自动化测试,知识根据自己的理解测试了几个容易出错的点
,但大家都好强T_T。