pairProject——电梯调度算法
关于结对编程
结对编程的队友:梁鸿(195)
我觉得结对编程与自己一个人编程有很大的区别。这两种编程方式各有利弊。
结对编程的优点有:1、两个人一起编程的bug少。首先,在编程之前,我们是讨论清楚算法才开始动手的,这样在写代码的时候思路比较清晰,不会像个人编程时候出现思维混乱逻辑错误的问题。此外在写代码的过程中,一个人写一个人看可以避免出现数组下标等小的问题,这些小问题一般要调试很久才发现。而且两个人一起调试程序也比较容易找出bug或者程序优化方法。2、结对编程的效率高,个人编程时可能会不专注,写一会儿程序就可能去做别的事情,结对编程时的专注程度就要高很多。
缺点呢,就是两个人要找共同的时间写程序,没有一个人编程的时候方便。
队友的优点:认真,写程序时思路清晰;善于思考;对整个工程及接口的设计理解深入。缺点:代码可读性比较差。
关于信息隐藏,接口,松散耦合
信息隐藏指在设计和确定模块时,使得一个模块内包含的特定信息(过程或数据),对于不需要这些信息的其他模块来说,是不可访问的。在面向对象编程中是指数据的封装。具备封装性的面向对象程序设计隐藏了某一方法的具体执行步骤,取而代之的是通过消息传递机制传送消息给它。
自从刚接触面向对象编程,学习java以来,我就不太会用接口。之前在c语言中,我理解的封装就是函数调用,把具有特定功能代码放到一个函数里面,这样在代码实现和维护的过程中更方便。学习面向对象语言以来,我对接口的理解就停留在书本上的介绍,自己写的程序也很少用接口。但是在做pairProject的时候,要读所给程序的代码,了解各个接口和类都是做什么的,读代码的过程加深了我对接口和封装的理解,也开始意识到要怎么去用接口。接口是用来表示某一特定的功能模块,在工程中,如果遇到某些功能就可以把它封装起来,并在类中实现它。
In computing and systems design a loosely coupled system is one in which each of its components has, or makes use of, little or no knowledge of the definitions of other separate components. The notion was introduced into organizational studies by Karl Weick. Sub-areas include the coupling of classes, interfaces, data, and services.——From Wikipedia
在实际的工程中,松散耦合是指模块之间要尽量保持独立,模块之间尽量少的牵连,以免修改一个模块后导致其他模块的异常。这样便于程序的修改和管理。
PS:在读代码的过程中,我有两点很深的体会:第一,没有注释的代码不是好代码。我知道这个工程里面老师没有加注释是想让我们认真读每一行程序,思考它的作用。但是读这样的代码很痛苦……所以我意识到注释在整个工程中很重要,不管是在自己写程序、调试程序的时候提示自己还是在其他人维护代码的时候。第二,规范的变量命名很重要,too。这个工程里面的变量名都很明确,基本看变量名就大致知道它是做什么的,想想自己平时写程序起变量名随心所欲的情景……
关于契约式编程
Design by contract (DbC), also known as contract programming, programming by contract and design-by-contract programming, is an approach for designing software. It prescribes that software designers should define formal, precise and verifiable interface specifications for software components, which extend the ordinary definition of abstract data types with preconditions, postconditions and invariants. These specifications are referred to as "contracts", in accordance with a conceptual metaphor with the conditions and obligations of business contracts.
"Design by Contract" is a registered trademark of Eiffel Software in the United States, and should not be confused with the general design approach. Microsoft calls their design-by-contract programming implementation "Code Contracts".——From Wikipedia
契约式编程是语言无关的软件工程的一种方法,它规定了开发者要遵守的规则。契约式编程是减少大型项目成本的突破性技术。契约由先验条件、后验条件、错误和不变量等概念组成。契约式编程使得多人合作的团队项目更好管理和协作,并降低了后期维护的成本。
我们的pairProject
类图:
算法:
我们这次只写了一个通用的电梯调度算法,并没有针对上下班高峰的特定需求做出优化。整体的思路是:优先响应电梯内部的请求,对于电梯外部的请求只响应运行方向相同的。具体来说是:如果电梯正在上行到达某一个楼层,只响应当前层上面楼层向上的请求,当电梯停的时候根据电梯内部的请求确定它的运行方向,然后考虑外部的请求。这样采用内部优先的调度算法,对于上下班高峰时期的处理很有优势,但是对于simpleTest的性能一般。
在做这个工程的时候,我们很纠结的写了两个版本。第一个版本很失败,首先是因为整个程序的接口没搞清楚,就只把自己想的状态转换过程写了上去导致运行后电梯的状态很奇怪,总是出现四部电梯同时响应一个请求的情况,在调试的过程中发现是我们对Request的操作有问题。其次,我们第一次的调度分配是更普遍的电梯调度算法,在rush hour的情况下性能很低。后来问了其他一些同学的算法,我们又结合自己的算法进行了改进,改成了现在的内部请求优先,提升了rush hour的性能。