PairProject 电梯调度 【附加题】
[附加题] 改进电梯调度的interface 设计, 让它更好地反映现实, 更能让学生练习算法, 更好地实现信息隐藏和信息共享。
目前的设计有什么缺点, 你会如何改进它?
1.之前判断电梯是否闲置的函数不太好理解,重新修改了,如下所示:
//是否停顿状态(停止的以及开门间隔>=0)
public bool IsIdle
{
get
{
return CurrentStatus.CurrentDirection == Direction.No
&& CurrentStatus.DoorCloseOpenTicks < ;
}
}
2.原来的程序将每一个电梯的target都初始化为0,感觉并不合理。因为最开始电梯的状态应该是没有目标楼层的,而且在我们的算法中target如果一开始为0,会导致重复开门的问题。所以我们把target初始化为-1,代表电梯那时候并没有目标楼层。
3.IElevator接口中定义的函数public bool ReqStopAt(int targetFloor) ,先看函数名很容易让人联想到这个函数的作用是是调度电梯前往目标楼层,再看它的返回值是布尔类型,也就自然想到返回值标志着是否成功到达目标楼层。可是看具体的函数时,发现这个函数其实主要作用是将targetFloor这个参数的值赋给电梯的target,修改当前方向,并未把target如何具体发生改变的过程展现出来,而且返回值标志的是是否接受调度请求。所以感觉这个函数的问题要么是名字起得不好,要么是实现过程和名称不符。
其实这个函数的主要作用就是更新电梯状态(包括当前运行方向以及当前的目标楼层),所以我们觉得这部分代码完全可以放到StatusUpdateForEveryTick(int ticks)这个函数里,感觉这样更方便使用。
[附加题] 目前的这个测试程序只有命令行界面, 请给它设计UI界面, 显示乘客/电梯的运动, 并实现之。
运行时的窗体用录屏工具做成了视频,然后转成了gif,就是有点小(免费软件理解一下)……
主要的界面设计参照了上一级某Pair的设计,但是鉴于时间关系我们只展示了电梯的运行,没有展示出乘客的状态。
不过做到这一点已经比较纠结了,因为窗体是在主线程创建的,而TickGoes中如果想对窗体的控件进行修改的话是不允许的。参考的Pair用的方法我们试着没有成功……最后用了委托这个东西,但是比较遗憾的是不能不能直接重复开始,要关掉重来才可以。
限于时间关系关系暂时只能这样了。这一版没有上传TFS,这个没有关系吧?
需要的话可以在博客贴出代码。
[附加题] 阅读有关 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设计模式的一个特例。
1) 低耦合性
2) 高重用性和可适用性
3) 较低的生命周期成本
5) 可维护性
6) 有利于软件工程化管理
缺点:
MVC的缺点是由于它没有明确的定义,所以完全理解MVC并不是很容易。使用MVC需要精心的计划,由于它的内部原理比较复杂,所以需要花费一些时间去思考。由于模型和视图要严格的分离,这样也给调试应用程序带来了一定的困难。每个构件在使用之前都需要经过彻底的测试。一旦构件经过了测试,就可以毫无顾忌的重用它们了。
根据开发者经验,由于开发者将一个应用程序分成了三个部件,所以使用MVC同时也意味着将要管理比以前更多的文件。
MVC并不适合小型甚至中等规模的应用程序,花费大量时间将MVC应用到规模并不是很大的应用程序通常会得不偿失。
MVC设计模式是一个很好创建软件的途径,它所提倡的一些原则,像内容和显示互相分离可能比较好理解。但是如果你要隔离模型、视图和控制器的构件,你 可能需要重新思考你的应用程序,尤其是应用程序的构架方面。如果你肯接受MVC,并且有能力应付它所带来的额外的工作和复杂性,MVC将会使你的软件在健壮性,代码重用和结构方面上一个新的台阶。
PairProject 电梯调度 【附加题】的更多相关文章
- 软件工程 --- Pair Project: Elevator Scheduler [电梯调度算法的实现和测试] [附加题]
软件工程 --- Pair Project: Elevator Scheduler [电梯调度算法的实现和测试] [附加题] 首先,在分组之前,我和室友薛亚杰已经详细阅读了往届学长的博客,认为电梯调度 ...
- pair work-Elevator Schedule附加题
[电梯调度算法的实现和测试] [附加题] 首先,我要感谢周敏轩同学和薛亚杰,吴渊渊小组.UI的编写是在两个小组成员的共同努力下完成的,希望在第二次结对编程中能够再一起对UI界面进行更新和完善.UI编写 ...
- 软件工程-pair work[附加题]
首先,在分组之前,我和室友周敏轩已经详细阅读了往届学长的博客,认为电梯调度这个项目应该先做UI会比较好一点,于是动手展开了UI的编写;但分组结果并没有如我们所愿,但我们依然共同进行了UI的编写,希望在 ...
- PAIR PROJECTS 附加题
[附加题] 改进电梯调度的interface 设计, 让它更好地反映现实, 更能让学生练习算法, 更好地实现信息隐藏和信息共享. 答:首先,就原有的StopAtEach方法而言,此算法的实现既是非常低 ...
- oo第二次博客-三次电梯调度的总结与反思
本单元从电梯调度相关问题层层深入,带领我们学习并运用了了多线程相关的知识. 三次电梯调度依次为单电梯单容量.单电梯可携带.多电梯可携带. 一.我的设计 在第一次作业中,使用了最简单的FIFO调度方法. ...
- 阿里巴巴集团2016校园招聘-Python工程师笔试题(附加题+部分答案)
前言 第一次网上笔试,被虐的很惨.一是不太习惯,最主要的是还是自己对Python的掌握,还不够熟练.下面是这次阿里笔试相关信息 笔试时间是,2015年8月23日,10:00——12:00 对于笔试题, ...
- 【软件工程】电梯调度的初步实现 李亚文&&郭莉莉
一.开门见山,代码粘 using System; using System.Collections.Generic; using System.Data; using System.Drawing; ...
- 电梯调度--c++--软件工程
一.设计思路 (1)将乘客要去的楼层数存起来. (2)假设yi为乘客要爬楼层数之和,yi=n1*|(n1-ni)|+n2*|(n2-ni)|+..+n18*|(n18-ni)| (3)比较y1到y18 ...
- 附加题-stack的理解
这次的附加题推荐的博客是http://www.ruanyifeng.com/blog/2013/11/stack.html阮一峰的,感觉讲的深入浅出,比较适合对计算机刚刚接触的人: 下面谈谈感想: 这 ...
随机推荐
- php解决前后端验证字符串长度不一致
前端代码 function getStrleng(str){ var myLen =0; for(var i=0;i<str.length;i++){ if(str.charCodeAt(i)& ...
- 建立标准编码规则(四)-C#编码规范分类及实现
1 现实中的问题 在任何一个公司,每个程序员编写的习惯可能都是不一样的,大到命名空间,小到变量的名字.甚至,我们去github,里面的大牛每个开源的项目的命名规则可能都不一样. 我们通常会遇到下面的问 ...
- 转 VMware虚拟机三种联网方式(图文详细解说)
原文地址https://blog.csdn.net/lucienduan/article/details/38233147 VMware三种网络模式联网 首先说一下VMware的几个虚拟设备 安装了V ...
- 关于new
JS通过new关键字,可以调用相关的 构造方法 生成一个 对象 ,function ---> object
- centos7下安装docker(9.1容器对资源的使用限制-CPU)
默认情况下,所有容器可以平等的使用host上的CPU资源并没有限制 1.docker可以通过-c或者--cpu-shares设置容器使用的权重.如果不指定,默认值为1024. 与内存的限额不同,通过- ...
- solidity学习-cryptoPunks为实例
在这里使用cryptoPunks为实例来进行solidity的介绍,一般这些内容理解了就能够进行相对简单的智能合约的编写了,同时会添加一些我认为也十分重要的内容学习文档为http://solidity ...
- 使用js切割URL的参数
对于一些开发场景,不使用Jsp或freemarker及其其他的模板引擎时,通常通过切割url获得对应的参数,然后通过AJAX与后台交互得到对应的数据 下面是演示实例: test.html <!D ...
- Linux中添加、修改和删除用户和用户组
宽为限 紧用功 功夫到 滞塞通 一.用户: 在创建用户时,需要为新建用户指定一用户组,如果不指定其用户所属的工作组,自动会生成一个与用户名同名的工作组.创建用户user1的时候指定其所属工作组user ...
- 深入浅出的webpack4构建工具---Scope Hoisting(十六)
一:什么是Scope Hoisting? 它有什么作用?Scope Hoisting 它可以让webpack打包出来的代码文件更小,运行更快,它可以被称作为 "作用域提升".是在w ...
- JAVA 8的新特性
1.Lambda表达式:允许把函数作为一个方法的参数 Lambda的优点: 1)简洁 2)非常容易并行计算 3)可能代表未来编程趋势 Lambda的缺点: 1)若不要并行计算,很多时候计算速度没有传统 ...