首页 > 代码库 > 结对项目-地铁出行路线规划程序(续)

结对项目-地铁出行路线规划程序(续)

欢迎关注我的个人博客,获得更佳的阅读体验:www.beyondbin.com

鸣谢:感谢Lave Zhang启发了我们前端的设计思路,以及百度地图为我们提供的全国所有城市地铁的xml文件。

结对编程:邓楚云 岳桐宇

结对编程

编程现场

 

技术分享

 

 

结对编程评价

优点

  1. 相互监督,从而提升了工作效率,稳定了工作时长,有助于按时完成项目。
  2. 频繁交流,使得分析、设计、测试等更加全面和完善。
  3. 由于处在不断的相互代码审查中,有效的提高了代码质量。

缺点

  1. 无法保证结对双方工作时间一致,阻碍项目进展。
  2. 实际需要较强的表达和交流能力,存在一定的沟通问题。
  3. 在简单项目中,领航员的作用不大。

结对人员评价

邓楚云

优点

  1. 学习能力较强,可以快速掌握新技术。
  2. 性格风趣幽默,不拘小节。
  3. 对用户体验有较好的理解,懂得设计交互界面。

缺点

  1. 懒于在细小事情上进行沟通,会细微修改对方代码,造成一定的混乱。

岳桐宇

优点

  1. 自我要求高,追求完美。
  2. 坚持编码原则,保证了代码质量。
  3. 算法的理解和实现能力较强,适合后端编码。

缺点

  1. 生活作息不规范,不太好安排时间。

设计方法

Information Hiding(信息隐藏)

信息隐藏实际上就是封装机制。具备封装性的程序设计隐藏了某一方法的具体执行步骤,取而代之的是通过讯息传递机制传送讯息给它。封装是通过限制只有特定类别的物件可以存取这一特定类别的成员,而它们通常利用介面实作讯息的传入传出。所有的类与组件均通过接口进行访问,并且内部数据必须通过安全的访问函数以实现,可以充分切分软件结构,从而实现模块化。因此,举例来说,“狗”这个类有“吠叫()”的方法,这一方法定义了狗具体该通过什么方法吠叫。但是,其他人并不知道它到底是如何吠叫的。而当狗的吠叫被封装到类中,任何人都可以简单地使用。

Interface Design(接口设计)

程序设计的实践中,编程接口的设计首先要使软件系统的职责得到合理划分。良好的接口设计可以降低系统各部分的相互依赖,提高组成单元的内聚性,降低组成单元间的耦合程度,从而提高系统的维护性和扩展性。应用程序接口是一组数量上千、极其复杂的函数和副程序,可让程序设计师做很多工作,譬如“读取文件”、“显示选单”、“在窗口中显示网页”等等。操作系统的API可用来分配内存或读取数据。许多系统应用程序借由API接口来实现,像是图形系统、资料库、Web服务,甚至是线上游戏。应用程序接口有诸多不同设计。用于快速执行的接口通常包括函数、常量、变量与数据结构。也有其它方式,如通过解释器,或是提供抽象层以遮蔽同API实现相关的信息,确保使用API的代码无需更改而适应实现变化。

Loose Coupling(松耦合)

耦合性是一种软件度量角度,是指一程序中,模块及模块之间通信或参数依赖的程度。松耦合性是结构良好程序的特性,松耦合性程序的可读性及可维护性会比较好。松耦合的目标是最小化依赖。松耦合这个概念主要用来处理可伸缩性、灵活性和容错这些需求。但是松耦合要付出使系统更加复杂的代价,松耦合意味着更多的开发以及维护工作量。一个例子:A系统作为服务提供方,与B1,B2,B3....Bx等服务消费方系统对接,使用紧耦合点对点的方式来系统集成,那么假如A系统如果更改了地址,那么B1,B2,B3...Bx系统都需要求相应的请求地址。说明系统和系统间严重依赖。要实现松耦合,通常的做法就是引入Mediator(中间层,也有翻译成中介者),在SOA中,这个中间层通常指的就是ESB(企业服务总线)。

契约式编程

优点

  1. 更优秀的设计。谨慎地运用契约式设计方法可以获得更优秀的设计,这是因为组件服务的提供方和使用方各自的义务被表述得更清晰,从而使设计更加系统化、更清楚、更简单。子类特性的重定义得到周密的控制。异常的运用系统化、一致化。
  2. 契约可以提高可靠性,因为编写契约可以帮助开发者更好地理解代码。契约有助于测试。理解更加清晰,因此代码更加可靠 如果你按照两种不同的方式表达同一件事情,就能更好地理解这件事。
  3. 更出色的文档。契约乃是类特性的公用视图中的固有成分,是值得信赖的文档。契约是精确的规范,同时也可以作为测试的可靠指导。

缺点

如果我们将每一个类都很详细地进行DbC,那也是一件很耗时、痛苦的没有必要的事情,正如你预防着小偷固然好,但是将除了自己之外的其他人都像防贼一样来防着也不合适一样。我们应该是适当地DbC。

作业体现

由于只是实验性地使用DbC进行设计。在对Core模块的路径规划功能的设计中应用了DbC,在保证调用操作前后应当属于何种状态,即前置条件,后置条件和不变式。前置条件发生在每个操作(方法,或者函数)的最开始,后置条件发生在每个操作的最后,不变式实际上是前置条件和后置条件的交集。违反这些操作会导致程序抛出异常。

单元测试

 

技术分享

 

 

UML

 

技术分享

 

 

软件设计

前端

 

技术分享

 

 

最开始我的考虑和大多数同学一样,想将一个图片作为整个交互式地图的控件基底,对其进行控件制作。但是考虑到了图片这种数据形式拓展性极差,不符合软件的迭代发展方式,遂决定放弃这种粗犷的地图制作模式。由于缺少前端设计的基础,思路一度陷入了停滞阶段。很幸运的是在网上查找资料时发现了两个既有价值的博文,一是Lave Zhang教会了我如何自定义绘制控件,二是从地铁网站截取地铁图XML文件,就此奠定了前端设计的基础。但是由于Lave Zhang的博文采用的WinForms框架,已经跟不上时代的潮流,我便操刀开始使用WPF改写他的全部设计方案,在这之中付出了大量的努力与尝试。然后结合作业要求添加了不少功能,和特性,整个软件有极强的拓展性。

后端

因为本次程序要求能同时计算换乘最少和站点最少,因此我在原本的计算最短路径的spfa算法的基础上增添了路由表功能,每个能到达的节点都拥有一张路由表,表示到达当前节点的目前全部来自于不同线路的最优路径,因为对于换乘站点,只保存一条最优的路径是不够的。而在每次更新新节点的路由表的时候,需要遍历这个节点的前序节点所有的路由表,根据这张路由表更新新节点的路由表。最后从终点的路由表中选取一个站点数最少的路由。

结对项目-地铁出行路线规划程序(续)