结对项目-地铁出行路线规划程序(续)
软件使用手册
- 命令行使用
- AdvancedSubwayRoutePlanning 城市名
- AdvancedSubwayRoutePlanning 城市名 -b|-c 地名A 地名B
- 图形化使用
- AdvancedSubwayRoutePlanning -g
结对编程优缺点
-
结对编程
结对编程(Pair-Programming)可能是近年来最为流行的编程方式。所谓结对编程,也就是两个人写一个程序,其中,一个人叫Driver,另一个人叫Observer,Driver在编程代码,而Observer在旁边实时查看Driver的代码,并帮助Driver编程。并且,Driver和Observer在一起时可以相互讨论,有效地避免了闭门造车,并可以减少后期的code review时间,以及代码的学习成本。-
优点
- 程序员互相帮助,互相教对方,可能得到能力上的互补。
- 增强代码和产品质量,并有效的减少BUG。
- 可以让编程环境有效地贯彻Design。
- 降低学习成本。一边编程,一边共享知识和经验,有效地在实践中进行学习。
- 在编程中,相互讨论,可能更快更有效地解决问题。
-
缺点
- 对于有不同习惯的编程人员,可以在起工作会产生麻烦,甚至矛盾。
- 有时候,程序员们会对一个问题各执己见(代码风格可能会是引发技术人员口水战的地方),争吵不休,反而产生重大内耗。
- 两个人在一起工作可能会出现工作精力不能集中的情况。程序员可能会交谈一些与工作无关的事情,反而分散注意力,导致效率比单人更为低下。
- 结对编程可能让程序员们相互学习得更快。有些时候,学习对方的长处,可能会和程序员们在起滋生不良气氛一样快。比如,合伙应付工作,敷衍项目。
- 面对新手,有经验的老手可能会觉得非常的烦躁。不合适的沟通会导到团队的不和谐。
- 新手在面对有经验的老手时会显得非常的紧张和不安,甚至出现害怕焦虑的的精神状态,从而总是出现低级错误,而老手站在他们后面不停地指责他们导致他们更加紧张,出现恶性循环。最终导致项目进展效率低下,并且团队貌合神离。
- 有经验的人更喜欢单兵作战,找个人来站在他背后看着他可能会让他感到非常的不爽,最终导致编程时受到情绪影响,反而出现反作用。
-
总结
是否使用结对编程,需要具体问题具体分析,不可盲目。任何事物都有他的好与坏,结对编程也不例外,只有知道了好与坏,你才能更好的利用它。
-
-
队友的优缺点
- 优点
- 喜欢思考,往往经过深思熟虑之后才会进行编码。
- 编码效率高,很少对代码进行二次加工。
- 代码风格好,看着赏心悦目。
- 缺点
- 对git的使用不是很熟练。
- 优点
如何利用好Information Hiding,Interface Design,Loose Coupling设计方法
- Information Hiding
要利用好信息隐藏,我们就首先要明白为什么要隐藏信息?隐藏信息是为了让使用的人不清楚内部的具体实现方式,这是有好处的,不仅仅在于松耦合也在于安全。那么如何实现信息隐藏呢,一个类的内部信息除非特殊情况都是不对外部类可见的,但是某些信息需要来外部类来根据情况设定,这时候我们就要提供一个特殊的有限定的方法给外部类使用,而不是让外部类直接的修改内部信息。在面向对象的语法中我们可以使用权限限定符规定,在其他的语法中,可以使用以下划线_开头的变量命名方式以标识私有信息。 - Interface Design
我们现在有一种新的轮子,叫做面向接口编程,每个接口我们可以理解为是一种能力,拥有这种能力的东西我们就给他实现这个接口,这样将各种能力独立化出来后,理论上我们可以通过这些我们设定的能力来组合成任何一个类。但由于这样的能力太多,所以有的能力我们就干脆放在类里面作为方法了,没有单例出来作为一个接口,我们只将那些更普遍的,更常用的能力抽象出来作为接口。好的接口更关心这个能力的输入和输出,而对于如何实现这个能力没有限制。 - Loose Coupling
在我们设计模块的时候,我们有意识的降低模块与模块之间的联系,这样当我们在设计另一个类的时候不用担心破坏这个类,同时当我们代码有改动的时候,我们可以直接定位到某一个模块。并且直接对这个模块进行修改而不担心破坏其他模块。
描述Design by Contract,Code Contract的内容
-
Design by Contract
编程人员经常遇到需要A设计一个模块,B来使用的问题。那么对于这种模块我们设定一种契约式编程的概念- 契约关系的双方是平等的,对整个bussiness的顺利进行负有共同责任,没有哪一方可以只享有权利而不承担义务。
- 契约关系经常是相互的,权利和义务之间往往是互相捆绑在一起的。
- 执行契约的义务在我,而核查契约的权力在对方。
- 我的义务保障的是你的利益,而你的义务保障的是我的利益。
在这种契约模式下,只有当输入满足契约中规定的输入的格式后,程序才会对数据进行约定好的处理和返回契约中规定的值。而当输入条件不满足的时候程序有理由撕毁契约不对输入进行处理。
-
Code Contract
代码契约提供了一个语言无关的方式来表达程序的方法。契约通过设定前置条件,后置条件和对象不变量的形式,将方法的实现与使用分割开。方便设计人员之间的分工合作。我在工程中负责后端模块的设计与编写。所以在我设计的时候,我会询问我的前端伙伴,他需要一些什么数据,希望我以什么形式提供给他,然后我会考虑如何设计这个模块,然后需要他提供什么input,然后我俩不断协商,经过协商之后我们确定一个input-modify-output的模型,然后我就根据这个模型进行编写具体实现过程。
VS的Unit Test使用过程
UML类图
实现的算法
因为本次程序要求能同时计算换乘最少和站点最少,因此我在原本的计算最短路径的spfa算法的基础上增添了路由表功能,每个能到达的节点都拥有一张路由表,表示到达当前节点的目前全部来自于不同线路的最优路径,因为对于换乘站点,只保存一条最优的路径是不够的。而在每次更新新节点的路由表的时候,需要遍历这个节点的前序节点所有的路由表,根据这张路由表更新新节点的路由表。最后从终点的路由表中选取一个站点数最少的路由。