zoukankan      html  css  js  c++  java
  • 结对项目-地铁出行路线规划程序(续)

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

    软件使用手册

    • 命令行使用
      • AdvancedSubwayRoutePlanning 城市名
      • AdvancedSubwayRoutePlanning 城市名 -b|-c 地名A 地名B
    • 图形化使用
      • AdvancedSubwayRoutePlanning -g

    使用界面

    结对编程优缺点

    结对编程

    • 结对编程
        结对编程(Pair-Programming)可能是近年来最为流行的编程方式。所谓结对编程,也就是两个人写一个程序,其中,一个人叫Driver,另一个人叫Observer,Driver在编程代码,而Observer在旁边实时查看Driver的代码,并帮助Driver编程。并且,Driver和Observer在一起时可以相互讨论,有效地避免了闭门造车,并可以减少后期的code review时间,以及代码的学习成本。

      • 优点

        1. 程序员互相帮助,互相教对方,可能得到能力上的互补。
        2. 增强代码和产品质量,并有效的减少BUG。
        3. 可以让编程环境有效地贯彻Design。
        4. 降低学习成本。一边编程,一边共享知识和经验,有效地在实践中进行学习。
        5. 在编程中,相互讨论,可能更快更有效地解决问题。
      • 缺点

        1. 对于有不同习惯的编程人员,可以在起工作会产生麻烦,甚至矛盾。
        2. 有时候,程序员们会对一个问题各执己见(代码风格可能会是引发技术人员口水战的地方),争吵不休,反而产生重大内耗。
        3. 两个人在一起工作可能会出现工作精力不能集中的情况。程序员可能会交谈一些与工作无关的事情,反而分散注意力,导致效率比单人更为低下。
        4. 结对编程可能让程序员们相互学习得更快。有些时候,学习对方的长处,可能会和程序员们在起滋生不良气氛一样快。比如,合伙应付工作,敷衍项目。
        5. 面对新手,有经验的老手可能会觉得非常的烦躁。不合适的沟通会导到团队的不和谐。
        6. 新手在面对有经验的老手时会显得非常的紧张和不安,甚至出现害怕焦虑的的精神状态,从而总是出现低级错误,而老手站在他们后面不停地指责他们导致他们更加紧张,出现恶性循环。最终导致项目进展效率低下,并且团队貌合神离。
        7. 有经验的人更喜欢单兵作战,找个人来站在他背后看着他可能会让他感到非常的不爽,最终导致编程时受到情绪影响,反而出现反作用。
      • 总结
          是否使用结对编程,需要具体问题具体分析,不可盲目。任何事物都有他的好与坏,结对编程也不例外,只有知道了好与坏,你才能更好的利用它。

    • 队友的优缺点

      • 优点
        1. 喜欢思考,往往经过深思熟虑之后才会进行编码。
        2. 编码效率高,很少对代码进行二次加工。
        3. 代码风格好,看着赏心悦目。
      • 缺点
        1. 对git的使用不是很熟练。

    如何利用好Information Hiding,Interface Design,Loose Coupling设计方法

    • Information Hiding
        要利用好信息隐藏,我们就首先要明白为什么要隐藏信息?隐藏信息是为了让使用的人不清楚内部的具体实现方式,这是有好处的,不仅仅在于松耦合也在于安全。那么如何实现信息隐藏呢,一个类的内部信息除非特殊情况都是不对外部类可见的,但是某些信息需要来外部类来根据情况设定,这时候我们就要提供一个特殊的有限定的方法给外部类使用,而不是让外部类直接的修改内部信息。在面向对象的语法中我们可以使用权限限定符规定,在其他的语法中,可以使用以下划线_开头的变量命名方式以标识私有信息。
    • Interface Design
        我们现在有一种新的轮子,叫做面向接口编程,每个接口我们可以理解为是一种能力,拥有这种能力的东西我们就给他实现这个接口,这样将各种能力独立化出来后,理论上我们可以通过这些我们设定的能力来组合成任何一个类。但由于这样的能力太多,所以有的能力我们就干脆放在类里面作为方法了,没有单例出来作为一个接口,我们只将那些更普遍的,更常用的能力抽象出来作为接口。好的接口更关心这个能力的输入和输出,而对于如何实现这个能力没有限制。
    • Loose Coupling
        在我们设计模块的时候,我们有意识的降低模块与模块之间的联系,这样当我们在设计另一个类的时候不用担心破坏这个类,同时当我们代码有改动的时候,我们可以直接定位到某一个模块。并且直接对这个模块进行修改而不担心破坏其他模块。

    描述Design by Contract,Code Contract的内容

    • Design by Contract
        编程人员经常遇到需要A设计一个模块,B来使用的问题。那么对于这种模块我们设定一种契约式编程的概念

      1. 契约关系的双方是平等的,对整个bussiness的顺利进行负有共同责任,没有哪一方可以只享有权利而不承担义务。
      2. 契约关系经常是相互的,权利和义务之间往往是互相捆绑在一起的。
      3. 执行契约的义务在我,而核查契约的权力在对方。
      4. 我的义务保障的是你的利益,而你的义务保障的是我的利益。

        在这种契约模式下,只有当输入满足契约中规定的输入的格式后,程序才会对数据进行约定好的处理和返回契约中规定的值。而当输入条件不满足的时候程序有理由撕毁契约不对输入进行处理。

    • Code Contract
        代码契约提供了一个语言无关的方式来表达程序的方法。契约通过设定前置条件,后置条件和对象不变量的形式,将方法的实现与使用分割开。方便设计人员之间的分工合作。

        我在工程中负责后端模块的设计与编写。所以在我设计的时候,我会询问我的前端伙伴,他需要一些什么数据,希望我以什么形式提供给他,然后我会考虑如何设计这个模块,然后需要他提供什么input,然后我俩不断协商,经过协商之后我们确定一个input-modify-output的模型,然后我就根据这个模型进行编写具体实现过程。

    VS的Unit Test使用过程

    测试结果

    UML类图

    UML类图

    实现的算法

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

    Github

    https://github.com/mycraftmw/ASRP

  • 相关阅读:
    如何使Linux系统上的程序开机后自动运行 (转)
    Makefile详解 (转--不错就是有点长)
    ./configure && make && make install详解 (转)
    从程序员角度看ELF | Linux-Programming (转)
    动态符号链接的细节 (转)
    GCC编译动态和静态链接库例子
    gcc编译静态库和动态库
    udhcp源码详解(五) 之DHCP包--options字段
    一个炒鸡好用的pdf阅读器
    Linux 创建用户 用户组 用户权限
  • 原文地址:https://www.cnblogs.com/mycraftmw/p/5926371.html
Copyright © 2011-2022 走看看