北航OO第二单元总结

  第二单元主要的任务是设计电梯的调度,主要的难点在于多线程的控制,需要考虑同时可以被多个线程访问的数据的安全。

  一、第一次作业

  1、类图:主要设计了三个类,电梯类,控制器类,Main函数,其中有三个线程,输入线程,控制器线程,电梯线程,输入线程将乘客数据传入控制器,再由控制器分发给电梯,电梯负责乘客的具体配送

  

  2、复杂度分析

  

  第一次作业总体复杂度较低,说明设计的还算可以接受

  3、优缺点分析:第一次作业个人感觉设计的较为流畅,但还是隐藏了一些问题在下一次作业才能发现,主要包括控制器线程究竟扮演了什么角色,因为后来讨论发现其实控制器可以不作为一个线程,可以通过一定的调度策略在输入到来时直接进行分配,而不需要单独的将控制器作为线程运行,否则控制器和电梯之间的逻辑关系在设计中稍显混乱,究竟什么时候结束整个程序难以判断。

  4、主要难点:对于访问数据的控制,因为第一次作业控制器内的乘客队列是电梯和输入同时可以读写的,这部分的访问控制需要做好,其次需要注意的是主线程结束的时候不代表程序全部结束,笔者第一次写的时候线程内部都写成了死循环导致评测超时,最后分析想到主线程结束在本次作业中代表输入线程,输入结束不代表电梯运行结束,想通此点就知道之前的错误想法是稍显可笑的。

  二、第二次作业

  1、类图:和上次作业相同的三个类,区别是这一次Controller我没有将他作为一个线程,只是作为一个类,作用是每次加入一个请求后直接传给电梯。

  

  2、复杂度分析:这次其实一些设计部分的解耦做的不是特别好,主要体现在每一层楼层中的操作,可以抽象为开门,进人,出人,关门四个步骤,更合理的方式是将几个步骤抽象成方法再由楼层操作调用,而不是将所有的步骤都写在一个方法里。

  

  3、优缺点分析:其实前两次作业虽然写的都很快,但最后还是设计部分的有瑕疵导致每次都有部分内容需要重构,这次虽然控制器不是一个线程了,但是对于多电梯的扩展难以分配请求,所以以后的作业对于架构还应该多下功夫,否则每次架构部分低需要重构还是挺花费时间的。

  4、主要难点:第二次作业其实跟第一次作业没什么很大的区别,唯一多的就是一个捎带功能,但我还是出现了一个问题就是处理完主请求后对于捎带请求队列一个请求变为主请求的部分,因为之前认为主请求都是要先接后送的,但捎带请求变为主请求可能可以跳过接的步骤,所以最后我设置了一个布尔型解决这方面的问题

  三、第三次作业

  1、类图:这次与上次不同的是加入了一个Output类,用于输出的控制,因为这次作业提示输出部分不保证线程安全,所以写了一个线程安全类Output。

  

  2、复杂度分析:

  

  

  3、优缺点分析:这次考虑了上次的问题在电梯内部的解耦做的更加合理,但是多电梯调度我希望使用自动化的方法生成调度表,又希望算法较为简单,所有有的调度策略可能没有特别的快速,但是保证了一定程度上的可扩展性。

  4、难点分析:这次作业相比前两次作业难度还是有所提升的,主要是请求分配给哪一步电梯,以及电梯使用的调度算法,我这次主要使用的调度算法有点类似于Look算法,上下一直扫描直到某个方向不再有操作就反向运行,算法本身实现没有特别的复杂,主要需要的是一些细节部分比如合适更换方向,而且这种算法稳定性较高,对于大多数情况性能较为稳定。

 

转载于:https://www.cnblogs.com/xzbuaa/p/10764330.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值