结对编程 附加作业
毛宇 11061171
程志 10061188
#1 [附加题] 改进电梯调度的interface 设计, 让它更好地反映现实, 更能让学生练习算法, 更好地实现信息隐藏和信息共享。
其实在学习这个框架的过程中,我们有很多很多的感受。
总体评价这个框架,感觉写得非常的规范,特别是接口的设计让人觉得耳目一新,但是还是存在着一些小问题,比如:
- 我非常不能理解的一点就是关于层高10,为什么不能用_FLOOR_HEIGHT_这样的宏定义,这样的接口设计让人觉得非常无力,而且如果修改起来,也非常麻烦。
- 其实我没有懂的一点就是,我看见说明里面有人数限制,但是具体API中没有,敢问实际电梯中还有人数的限制吗?电梯如何检测上来了多少人,这一点觉得很荒唐,也很多余,如果想让学生更好的练习算法,尽量吧这些细节设计得平常一点,不要这么奇葩。
3.接口中有些常量名字取得让人觉的很难理解,比如” DirectionReqSource”,为什么不能用start_floor来替代Source呢,在这样一个没有文档的框架中,变量起名绝对是非常重要,因为它直接决定了学生理解其的难度。比如Tick,为什么不能用Second来代替,等等等等。总之,我希望这些名字最好直观口语化。
#2 [附加题] 目前的这个测试程序只有命令行界面, 请给它设计UI界面, 显示乘客/电梯的运动, 并实现之。
实现一个UI界面的方法其实很简单,我们的作业中在solution下新建了一个WinForm工程,然后设置main函数开始运行的时候,winform工程也开始启动。这里其实借助了游戏开发的思想(类似的游戏开发思想在Cocos2d-x引擎以及微软XNA框架下比比皆是),也就是“轮询机制”,在每一帧的时候刷新当前电梯的位置的情况,从而达到动画的效果。
具体的代码已经迁入到TFS上面。(因为设计到部分框架下代码的改动(主要是几处成员变量改为了public形))
此外,为了达到更好的用户体验,我们还加入了测试文件的选择对话框:
在实现的过程中遇到了一些问题,比如C#不接受跨线程访问UI,这个问题开始困扰了我们很久,后面在百度知道求助专家,终于恍然大悟,通过改变安全等级来消除了这个问题,这里感谢百度网友 “矮矮的小孩”和”黑人_九天”的相助。
#3 [附加题] 阅读有关 MVC 和 MVVM 设计模式的文章。
首先贴出来一个MVC的定义
“MVC,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用于组织代码用一种业务逻辑和数据显示分离的方法,这个方法的假设前提是如果业务逻辑被聚集到一个部件里面,而且界面和用户围绕数据的交互能被改进和个性化定制而不需要重新编写业务逻辑。MVC被独特的发展起来用于映射传统的输入、处理和输出功能在一个逻辑的图形化用户界面的结构中。”
其实我个人的理解是,我们MVC是一种设计的结构,使得构成软件中三个比较重要的要素能够相互独立。举个例子,Android中的Activity(可以理解为界面)的开发使用了Xml,将控件(模型)添加到界面中 ,并且调整大小布局(视图)。而控制器,也就是逻辑代码的则采用了java,这样有一个好处,就是使之相互独立了起来。相比之下,这样的开发结构使得耦合性,重用性,可维护性都大大提高。
在这个项目中,基于WinForm工程的UI设计就是一个很好的例子,控件(比如Label等)就是模型,布局就是视图,然后逻辑代码就是控制器。
但是我个人觉得像电梯调度框架这样的比较小的项目,没有必要去采用MVC模式,因为过于在中小型的应用中强调这种模式肯定会浪费大量的时间。
#4 [附加题] 我们现在的题目是假设所有电梯到达所有的楼层。 在现实生活中, 多部电梯到达的楼层都不一样。如果是这样 (例如3号电梯能到达10 – 20 层, 4 号电梯能到达5-15 层),整个程序框架和你的电梯调度模块要做什么改变?
如果对于电梯的楼层做出了限定,那么改变的方法其实也非常简单。
主要的改变我个人认为应该是在电梯模块中,就是电梯对请求的处理中要增加出一个判定,比如某乘客要去4层,电梯不能去4层,就忽略这个乘客。
应该其他地方是不需要改变的(这个问题是想侧面证实框架中给出的设计优越性吗?)