1 接口改进
1) 之前判断电梯是否闲置的函数不太好理解,重新修改了,如下所示:
//是否停顿状态(停止的以及开门间隔>=0) public bool IsIdle { get { return CurrentStatus.CurrentDirection == Direction.No && CurrentStatus.DoorCloseOpenTicks < 0; } }
2) 原来的程序将每一个电梯的target都初始化为0,感觉并不合理。因为最开始电梯的状态应该是没有目标楼层的,而且在我们的算法中target如果一开始为0,会导致重复开门的问题。所以我们把target初始化为-1,代表电梯那时候并没有目标楼层。
3) IElevator接口中定义的函数public bool ReqStopAt(int targetFloor) ,先看函数名很容易让人联想到这个函数的作用是是调度电梯前往目标楼层,再看它的返回值是布尔类型,也就自然想到返回值标志着是否成功到达目标楼层。可是 看具体的函数时,发现这个函数其实主要作用是将targetFloor这个参数的值赋给电梯的target,修改当前方向,并未把target如何具体发 生改变的过程展现出来,而且返回值标志的是是否接受调度请求。所以感觉这个函数的问题要么是名字起得不好,要么是实现过程和名称不符。
其实这个函数的主要作用就是更新电梯状态(包括当前运行方向以及当前的目标楼层),所以我们觉得这部分代码完全可以放到StatusUpdateForEveryTick(int ticks)这个函数里,感觉这样更方便使用。
2 UI设计
运行时的窗体用录屏工具做成了视频,然后转成了gif,就是有点小(免费软件理解一下)……
主要的界面设计参照了上一级某Pair的设计,但是鉴于时间关系我们只展示了电梯的运行,没有展示出乘客的状态。
不过做到这一点已经比较纠结了,因为窗体是在主线程创建的,而TickGoes中如果想对窗体的控件进行修改的话是不允许的。参考的Pair用的方法我们试着没有成功……最后用了委托这个东西,但是比较遗憾的是不能不能直接重复开始,要关掉重来才可以。
限于时间关系关系暂时只能这样了。这一版没有上传TFS,这个没有关系吧?
需要的话可以在博客贴出代码。
3 MVC与MVVM
3.1 MVC(Model View Controller)
即模型(model)-视图(view)-控制器(controller)。
MVC本来是存在于Desktop程序中的,M是指数据模型,V是指用户界面,C则是控制器。使用MVC是将M和V的实现代码分离,从而使同一个程序可以使用不同的表现形式。比如一批统计数据你可以分别用柱状图、饼图来表示。C存在的目的则是确保M和V的同步,一旦M改变,V应该同步更新,从例子可以看出MVC就是Observer设计模式的一个特例。