首页 > 代码库 > 地铁出行项目(续)

地铁出行项目(续)

 地铁出行项目(续)

团队成员:(特殊三人组)

杨金键 谢振威 金豪

有图有真相:

技术分享

结对编程:

优点:

  1. 结对编程的时候可以一起工作,有什么错误立马发现,降低错误的概率,同时也是极好的交流学习的机会
  2. 所有人都可以专注于不同的方面,在坐一起写代码之外,如果要学新的知识,也可以分配下去各自攻克各自的任务然后再交流,这样的工作效率远比一个人要高
  3. 可以相互学习,相互借鉴,队伍里每个人都各有特点,各有所长,交流的时候进步很快
  4. 多人协作可以相互鼓励,相互督促,不容易被诱惑分心。

缺点:

  1. 分工交集的部分如果沟通不明确,提前没有规范的话容易混乱
  2. 如果没有特别的事情的话,有一点点浪费时间

 

杨金键优点:

  1. 学习新的知识特别快,好多事情感觉他都能一下子掌握的样子
  2. 思路很清晰,所以写代码效率高,速度很快
  3. 对于代码中的错误较为敏感

缺点:因为写的比较快吧,思维有一些跳,没有那么研究,所以也就容易留下一些隐患,会造成一些麻烦

谢振威优点:

  1. 思路清晰,代码的质量很少,几乎一次过关没有bug
  2. 刻苦努力,对于知识愿意用心钻研,爱思考
  3. 认真负责,对于自己的任务完成的很好

缺点:与队友缺乏沟通,很多时候有些想法不太会主动与人交流

自己优点

  1. 比较追求极致,愿意将作品做的尽善尽美
  2. 注意细节,可以关注到一些细枝末节的东西,所以也就不太容易犯错误
  3. 比较顾全大局,思维方式比较全面,可以照顾到多方面的感受

缺点:容易纠结于表面的错误无法自拔浪费时间,其实就是一些奇怪的问题啦。。。浪费大量时间

 

设计方法:

  好的设计方法包含信息隐藏、接口设计以及松耦合

  • 信息隐藏:首先就是类应该有私有变量,或者说除了度外的接口以外都应该是私有的。例如那些私有成员函数,内部使用的变量等,将信息公有化算是信息隐藏的大忌,如果要访问类的属性,也要通过get set方法来访问。这样可以极大程度的保证结构清晰。我们在编写过程中也一直都是这样做的。
  • 接口设计:信息隐藏之后很重要的就是接口设计了,而且这一点是在最初分配任务之后就应该协商好的。队伍内部彼此之间只要关心接口的功能是否正常,而不需要关心代码内部的实现原理。这一点在我们的前后端之间也是完成的比较好的,只是在前端内部分的不是特别的明确。
  • 松耦合:主要指的是降低模块与模块之间的依赖程度。各个模块之间应该相对的降低耦合度,这样如果一个模块发生问题,不会造成过多的影响。在我们的设计中,模块之间基本都是嵌套的。例如大的功能模块嵌套小一些的次级功能模块,小一些的再嵌套更小的模块,功能上也没有过多重复的地方,也算是复合了这一点设计思路。

 

契约式编程

  契约式设计是我们在编程中极为推崇的设计方法,最初是被Bertrand Meyer在设计他的Eiffel语言时所创造的概念,并且在1986年开始逐渐被各式各样的论文引用。用文档来记载权利和义务的说明并用程序来检验,这就是契约式设计的核心。契约式设计其之所以得到了人们的重视,因为它将责任的分工明确化。当一段代码发生异常时,我们过去的思想总会模糊的认为,是否是这段代码本身存在错误?而程序的规格化设计明确地告诉了我们这一错误的责任到底在于用户还是设计者。在面向对象技术中,接口是我们在面向对象中需要关心的东西,可是只有借口这却还不够充分,我们究竟如何才能正确的使用接口,而这恰恰是契约式设计所提供的部分。只有考虑到了规格,才可能实现面向对象的目标:可靠性,可扩展性,和可复用性。

 

作品展示:

  因为我们有三个人,算是精力比较充沛吧,所以就做了两个作品出来,共同完成。一个是基于QT开发出来的,一个是基于windows自带图形界面。虽然界面UI不同但是基本功能都是一样的,而且两个程序的内核也就是计算部门是完全一样的,所以后面测试也是针对那一部分做的,所以后面对两个作品不做区分。界面大致如下,功能反面基本满足了查询地铁线路图所需。

技术分享

技术分享

 

测试

  测试方面,我们是采用VS2015针对计算模块专门新建项目做的测试(也打包在随后的代码库里面)。测试用力基本涵盖了所有的可能情况,具体如下:

技术分享

  以及代码覆盖率是这样的:

 技术分享

 

UML图:

技术分享

 

独到算法:

  在绘制图形的时候,每次刷新都会通过repaint重新绘制全部的图形并且重新计算所有贴图的缩放位置等,所以最开始的程序在移动过程中有些卡顿。后来再综合讨论思考之后,我们将仅仅平移时的计算动作又全部计算变成了仅仅对于已有点的平移,这样就就在绘图时极大的减小了工作量,也提高了效率。

  在地图搜索路径方面,我们将站与站之间的关系用2个邻接矩阵表示,同一个站如果在不同的线上出现,算作不同的站。求最短路的邻接矩阵中,不同的线上的同一个站的距离设为0,求最少换乘的邻接矩阵中,不同的线上的同一个站的距离设为MAX(大于线上站点总数的值),计算时,都使用Dijkstra算法,即可得到最短路径或者最少换乘路径。

 项目总结:

  整个结对项目(其实是团队项目)做下来还是颇有收获的,最重要的一点就是深刻的认识到了自己在编程能力上的不足。想法总是很好,但是实现起来却和自己想的完全不一样,基本上写几行就会碰见有违自己“常识”的事情,在焦虑中倍受煎熬。还有团队合作方面更,初尝真正的团队项目,摩擦和相互埋怨总是不可避免,内心吐槽对方无数次身体还是老实的跟着大家一起做项目,谁让我们是团队呢(还有队友也比较给力)。还好,最后我们都坚持下来了,虽然还有一些小的地方没有达到自己的预期,但是已经足够让我们满意了。希望在后面的软件工程课上收获更多的成长。

 

附加题:

http://www.cnblogs.com/MurryK/p/Beijing_Subway_Added.html

代码Github:(包含两个地铁工程以及一个测试工程)

https://github.com/MurryK/Bejing_subway_continued

地铁出行项目(续)