Pairwork2 总结
成员 10061141 刘明 10061169 孙胜
设计与设计心得
10061141 刘明
在Scheduler中对于IRequest和IElevator的调度,将未进入电梯的乘客申请压入一个Arraylist中即 _Passenger_Wait并对四个电梯进行一个较优的选择,然后将该乘客装入该电梯,存入一个Arraylist中即elevStop[]电梯将要将乘客运往的目标楼层,进一步确定进入电梯的乘客的目标楼层的排序与调度。
其中对_Passenger_Wait的选择方法为:选择一个 HistoryDirection与申请运行方向不违背(相同或者电梯停靠未运行),离其距离最近并且剩余装载量FreeCapacity大于100或者乘客的平均体重的电梯,让其进入。停靠电梯的处理,这种情形比较多。如果电梯是到达了一个目标楼层后,就在数组_Passenger_Wait里该电梯对应的ArrayList里 面去掉当前电梯所在的楼层。这时候,如果数组_Passenger_Wait里该电梯对应的ArrayList不为空,就是说电梯的还有目标楼层没有到达,那 么就将电梯的下一个目标设为数组_Passenger_Wait里该电梯对应的ArrayList里面最近的那个目标楼层(这里,向上运行的电梯和向下运行的电梯情况不同);如果数组_Passenger_Wait里该电梯对应的ArrayList为空,即电梯已经完成了之前数组_Passenger_Wait里该电 梯对应的ArrayList里面的所有任务,那么如果这个时候所有楼层里都没有人发出请求了,那么电梯就往第零层和第一层走,如果有请求,那么电梯就去发 出请求的地方接人。
运行电梯的处理,又分为向上运行的电梯和向下运行的电梯,但这是一个对称的过程。如果电梯和电梯目前要前往的目标楼层之间楼层有和电梯运行方 向一样的的方向请求时,并且电梯的剩余重量还大于所有人统计平均质量时,就可以使电梯在这一层里停靠一下,接上发出请求的乘客。接上乘客之 后,乘客就会发出目标请求,目标请求会加入到数组elevStop里该电梯对应的ArrayList里面。
10061169 孙胜
1. 考虑到电梯的空置状态:
上班高峰期:两台电梯停在1层,两台电梯停在0层,这样可以减少乘客的等待时间。
下班高峰期:电梯全部停在中间层,这样可以满足不同楼层的人离开,减少等待时间。
平时情况:电梯停留在一层。
2.电梯运行情况:
电梯环形运行,当发生外部请求时:
电梯向上运行,响应的顺序为:同向上方
逆向上方
逆向下方
同向下方
电梯向下运行,相应的顺序为:同向下方
逆向下方
逆向上方
同向上方
当发生内部请求时:
电梯向上运行,响应的顺序为:上方,下方
电梯向下运行,响应的顺序为:下方,上方
如果请求超出范围,则报错删除内部和外部请求。
3.考虑高峰期优化方法:
上班高峰:
电梯空置状态
运行情况:三部电梯只接受上行请求,一部正常运行
下班高峰:
电梯空置装填
运行情况:三部电梯只接受下行请求,一部正常运行
4.电梯调度算法:
设置一个外部请求列表,设置一个内部请求列表,
设置方法,把每个外部请求都加入四个队列,按照时间先后来响应,有一部电梯响应之后则均删掉;把内部请求加入进入的电梯,等响应之后则删除请求。
根据乘客从第1层和第0层进入电梯的比例判断是否是上班高峰,是否启动上班电梯模式。
根据乘客从第1层和第0层出电梯的比例判断是否是下班高峰,是否启动下班电梯模式。
初始化之后,时钟开始计时
乘客:
如果当前时间和乘客请求的时间一致,乘客进入电梯并发送上行或下行请求。
如果电梯停在乘客所在楼层,并且开往方向与乘客去向一致,电梯停下,电梯开关门时间发生改变,乘客发出目的地请求,乘客的状态变为在里面。
如果乘客到达目的地,乘客的状态变为到达。
电梯:
根据时钟和电梯运行情况,对电梯的状态进行更新。
电梯停时,发送电梯停信号。
5.我们算法的特点:
首先,算法根据不同时间段的人员流动情况对四部电梯进行不同工作模式的分配,在上班高峰时多数电梯不接受下行请求,在下班高峰时多数电梯不接受上行请求,这样可以节省开关门和等待乘客进出电梯的时间,可以有效地节省乘客的乘坐电梯的时间。
再者,我们根据人员对电梯的请求分为内部请求队列和外部请求队列,根据不同的请求加入队列的顺序不同,对请求进行排序,可以很好的控制电梯开关门的顺序和时间。
其次,我们根据人员流动的比例判断高峰时间,这样可以很好的控制电梯运行模式何时开启,对电梯进行动态规划。
心得体会:
评价模块设计优劣的三个因素为:Information Hiding :信息隐藏,Interface design:接口设计,Loose couping:疏耦合。模块功能完善化,消除重复功能,降低模块接口的复杂性。每个模块都可以独立的开发,测试。
信息隐藏原则:将每个程序的成分隐藏在模块内,尽可能少的显露其内部的处理,可以提高软件的可修改性,可测试性和可移植性。
接口设计遵循的原则:简单原则,要求接口方法命名规范,接口相关参数的数据类型简单,减少模块间直接性的复杂数据的传递。封闭原则,模块内部的处理逻辑修改时,不会影响到其他模块的使用。完整性原则:可以方便的利用继承,重写,覆盖等技术手段来提高代码的复用率。可置换原则。接口隔离原则,使用多个专门的接口比使用单一的接口要好,在接口中尽少公布public方法。
耦合是模块之间依赖程度的度量,模块设计追求的是强内聚,疏耦合。耦合的强度依赖于以下几个因素:一个模块对另一个模块的调用,一个模块向另一个模块传递的数据量,一个模块施加到另一个模块控制的多少,模块之间接口的复杂程度。尽量减少两个模块之间的直接调用和控制,两个模块之间的联系最好全部通过主模块的控制和调用来实现。
在本次软工作业中,我深刻的体会到这三方面的重要性。
对一个程序而言,会有很多的模块,每个模块都有自己的功能,每个模块代表不同部件是如何运行的,比如说在本次作业电梯程序中,电梯类负责电梯的属性和电梯运行;乘客类负责发送请求,根据乘客的需求驱动电梯类运行;commons类用于存放接口,基类,结构等方法用于服务其他类的调用;Scheduler类用于存放电梯调度算法,使电梯按照算法运行搭载乘客;Program类是主模块,通过主模块的运行调动相应的模块,使电梯正常运行。
每个模块都有自己需要隐藏的信息,不能让别的类随意改动,并且每个模块都需要有自己的处理方法,不能随意调用其他的类,这样写会比较混乱。我们在设计接口或者方法的时候,命名的时候根据实意进行命名,方便他人阅读和理解,减少了模块之间直接的复杂数据的传递,基本上都是定义好的接口和方法。疏耦合是软件工程中设计追求的,尽量减少两个模块之间的联系,尽量通过主模块的调用来联系其他模块。
软件工程的优劣因素不仅是对我们编写的程序的使用情况的评测,更是提醒我们要养成较好的编程习惯,这样有利于程序的可移植性和可测试性,对我们今后有很大的帮助。