首页 > 代码库 > 结对项目-地铁出行路线规划程序(续)
结对项目-地铁出行路线规划程序(续)
欢迎关注我的个人博客,获得更佳的阅读体验:www.beyondbin.com
鸣谢:感谢Lave Zhang启发了我们前端的设计思路,以及百度地图为我们提供的全国所有城市地铁的xml文件。
结对编程:邓楚云 岳桐宇
结对编程
编程现场
结对编程评价
优点
- 相互监督,从而提升了工作效率,稳定了工作时长,有助于按时完成项目。
- 频繁交流,使得分析、设计、测试等更加全面和完善。
- 由于处在不断的相互代码审查中,有效的提高了代码质量。
缺点
- 无法保证结对双方工作时间一致,阻碍项目进展。
- 实际需要较强的表达和交流能力,存在一定的沟通问题。
- 在简单项目中,领航员的作用不大。
结对人员评价
邓楚云
优点
- 学习能力较强,可以快速掌握新技术。
- 性格风趣幽默,不拘小节。
- 对用户体验有较好的理解,懂得设计交互界面。
缺点
- 懒于在细小事情上进行沟通,会细微修改对方代码,造成一定的混乱。
岳桐宇
优点
- 自我要求高,追求完美。
- 坚持编码原则,保证了代码质量。
- 算法的理解和实现能力较强,适合后端编码。
缺点
- 生活作息不规范,不太好安排时间。
设计方法
Information Hiding(信息隐藏)
信息隐藏实际上就是封装机制。具备封装性的程序设计隐藏了某一方法的具体执行步骤,取而代之的是通过讯息传递机制传送讯息给它。封装是通过限制只有特定类别的物件可以存取这一特定类别的成员,而它们通常利用介面实作讯息的传入传出。所有的类与组件均通过接口进行访问,并且内部数据必须通过安全的访问函数以实现,可以充分切分软件结构,从而实现模块化。因此,举例来说,“狗”这个类有“吠叫()”的方法,这一方法定义了狗具体该通过什么方法吠叫。但是,其他人并不知道它到底是如何吠叫的。而当狗的吠叫被封装到类中,任何人都可以简单地使用。
Interface Design(接口设计)
程序设计的实践中,编程接口的设计首先要使软件系统的职责得到合理划分。良好的接口设计可以降低系统各部分的相互依赖,提高组成单元的内聚性,降低组成单元间的耦合程度,从而提高系统的维护性和扩展性。应用程序接口是一组数量上千、极其复杂的函数和副程序,可让程序设计师做很多工作,譬如“读取文件”、“显示选单”、“在窗口中显示网页”等等。操作系统的API可用来分配内存或读取数据。许多系统应用程序借由API接口来实现,像是图形系统、资料库、Web服务,甚至是线上游戏。应用程序接口有诸多不同设计。用于快速执行的接口通常包括函数、常量、变量与数据结构。也有其它方式,如通过解释器,或是提供抽象层以遮蔽同API实现相关的信息,确保使用API的代码无需更改而适应实现变化。
Loose Coupling(松耦合)
耦合性是一种软件度量角度,是指一程序中,模块及模块之间通信或参数依赖的程度。松耦合性是结构良好程序的特性,松耦合性程序的可读性及可维护性会比较好。松耦合的目标是最小化依赖。松耦合这个概念主要用来处理可伸缩性、灵活性和容错这些需求。但是松耦合要付出使系统更加复杂的代价,松耦合意味着更多的开发以及维护工作量。一个例子:A系统作为服务提供方,与B1,B2,B3....Bx等服务消费方系统对接,使用紧耦合点对点的方式来系统集成,那么假如A系统如果更改了地址,那么B1,B2,B3...Bx系统都需要求相应的请求地址。说明系统和系统间严重依赖。要实现松耦合,通常的做法就是引入Mediator(中间层,也有翻译成中介者),在SOA中,这个中间层通常指的就是ESB(企业服务总线)。
契约式编程
优点
- 更优秀的设计。谨慎地运用契约式设计方法可以获得更优秀的设计,这是因为组件服务的提供方和使用方各自的义务被表述得更清晰,从而使设计更加系统化、更清楚、更简单。子类特性的重定义得到周密的控制。异常的运用系统化、一致化。
- 契约可以提高可靠性,因为编写契约可以帮助开发者更好地理解代码。契约有助于测试。理解更加清晰,因此代码更加可靠 如果你按照两种不同的方式表达同一件事情,就能更好地理解这件事。
- 更出色的文档。契约乃是类特性的公用视图中的固有成分,是值得信赖的文档。契约是精确的规范,同时也可以作为测试的可靠指导。
缺点
如果我们将每一个类都很详细地进行DbC,那也是一件很耗时、痛苦的没有必要的事情,正如你预防着小偷固然好,但是将除了自己之外的其他人都像防贼一样来防着也不合适一样。我们应该是适当地DbC。
作业体现
由于只是实验性地使用DbC进行设计。在对Core模块的路径规划功能的设计中应用了DbC,在保证调用操作前后应当属于何种状态,即前置条件,后置条件和不变式。前置条件发生在每个操作(方法,或者函数)的最开始,后置条件发生在每个操作的最后,不变式实际上是前置条件和后置条件的交集。违反这些操作会导致程序抛出异常。
单元测试
UML
软件设计
前端
最开始我的考虑和大多数同学一样,想将一个图片作为整个交互式地图的控件基底,对其进行控件制作。但是考虑到了图片这种数据形式拓展性极差,不符合软件的迭代发展方式,遂决定放弃这种粗犷的地图制作模式。由于缺少前端设计的基础,思路一度陷入了停滞阶段。很幸运的是在网上查找资料时发现了两个既有价值的博文,一是Lave Zhang教会了我如何自定义绘制控件,二是从地铁网站截取地铁图XML文件,就此奠定了前端设计的基础。但是由于Lave Zhang的博文采用的WinForms框架,已经跟不上时代的潮流,我便操刀开始使用WPF改写他的全部设计方案,在这之中付出了大量的努力与尝试。然后结合作业要求添加了不少功能,和特性,整个软件有极强的拓展性。
后端
因为本次程序要求能同时计算换乘最少和站点最少,因此我在原本的计算最短路径的spfa算法的基础上增添了路由表功能,每个能到达的节点都拥有一张路由表,表示到达当前节点的目前全部来自于不同线路的最优路径,因为对于换乘站点,只保存一条最优的路径是不够的。而在每次更新新节点的路由表的时候,需要遍历这个节点的前序节点所有的路由表,根据这张路由表更新新节点的路由表。最后从终点的路由表中选取一个站点数最少的路由。
结对项目-地铁出行路线规划程序(续)