zoukankan      html  css  js  c++  java
  • 转载结对项目

    2015结对项目

     

    2015结对项目

    成员: 176 陈谋 178 符美潇

    我和符美潇都有着较强的编程能力,对待人物也都能够一丝不苟地完成,我么最大的相似之处就是性格都比较温和。当然我们也有很多共同的兴趣爱好,都喜欢打羽毛球、乒乓球,热衷于近现代文化等。

    结对编程场景

    对于我们来说,结对编程并不是一件特别舒适的事情。两个人盯着14.6寸的小屏幕看上半个小时都会觉得特别累。我门在结对编程的时候,最想做的就是每个人拥有一个显示器,这样我们也不会觉得太辛苦。但是这只是妄想,没有实现。

    结对编程的优点

    每人在各自独立设计、实现软件的过程中不免要犯这样那样的错误。在结对编程中,因为有随时的复审和交流,程序各方面的质量取决于一对程序员中各方面水平较高的那一位。这样,程序中的错误就会少得多,程序的初始质量会高很多,这样会省下很多以后修改、测试的时间。具体地说,结对编程有如下的好处:

    (1)在开发层次,结对编程能提供更好的设计质量和代码质量,两人合作能有更强的解决问题的能力。

    (2)对开发人员自身来说,结对工作能带来更多的信心,高质量的产出能带来更高的满足感。

    (3)在心理上, 当有另一个人在你身边和你紧密配合, 做同样一件事情的时候, 你不好意思开小差, 也不好意思糊弄。

    (4)在企业管理层次上,结对能更有效地交流,相互学习和传递经验,能更好地处理人员流动。因为一个人的知识已经被其他人共享。

    总之,如果运用得当,结对编程能得到更高的投入产出比。

    结对编程的缺点

    由于每个人的个性不同,习惯不同,能力不同等等,他们在编程的途中可能会闹出各种不愉快。如果没有很强的自控力和优雅的态度,很可能双方就会兵戎相见。具体地,我做了以下总结:

    (1)对于有不同习惯的编程人员,可以在起工作会产生麻烦,甚至矛盾。

    (2)有时候,程序员们会对一个问题各执己见(代码风格可能会是引发技术人员口水战的地方),争吵不休,反而产生重大内耗。

    (3)两个人在一起工作可能会出现工作精力不能集中的情况。程序员可能会交谈一些与工作无关的事情,反而分散注意力,导致效率比单人更为低下。

    (4)结对编程可能让程序员们相互学习得更快。有些时候,学习对方的长外,可能会和程序员们在起滋生不良气氛一样快。比如,合伙应付工作,敷衍项目。

    (5)面对新手,有经验的老手可能会觉得非常的烦躁。不合适的沟通会导到团队的不和谐。

    (6)新手在面对有经验的老手时会显得非常的紧张和不安,甚至出现害怕焦虑的的精神状态,从而总是出现低级错误,而老手站在他们后面不停地指责他们导致他们更加紧张,出现恶性循环。最终导致项目进展效率低下,并且团队貌合神离。

    (7)有经验的人更喜欢单兵作战,找个人来站在他背后看着他可能会让他感到非常的不爽,最终导致编程时受到情绪影响,反而出现反作用。

    结对人员的优缺点

    我的优点和缺点都有很多,具体来说有工作能力强,但是喜欢拖拖拉拉;拥有较好的变成习惯,但是过于追求细节,导致编程速度较慢;喜欢代码的简洁明了,但是过分使用冗余代码或者效用低下的算法。

    符美潇的优点有很多,工作认真负责,工作效率高,思想很活跃;但是也有不足,如编程能力处在中等水平,喜欢睡懒觉,喜欢看电影。


    好的设计方法

    Information Hiding, interface design, loose coupling的利用

    信息隐藏:首先,在类中,定义的变量和方法可以再前面加上一个下划线"_"来标识,这是一个好的命名规范,可以避免无意中对私有成员进行赋值。类与类之间交换信息时,要交流私有变量时,要用事先设计好的方法来访问,这样如果我们在其它类里面调用另外一个类的私有变量,那么我们必须定义一个获得该类私有变量的方法;要在另一个类里面改变另外一个类里面的变量时,我们也要定义一个改变该类私有变量的方法。在C#里特别方便的一点就是有set和get,我们可以很方便的定义访问一个类私有变量的方法。

    接口设计:一个好的接口能够提供给后面的程序设计一个良好的框架,在这次电梯调度项目里,接口IElevator、IPassenger、IScheduler、IRequest,我们通过接口能很快的知道电梯、乘客、调度方案、请求都有哪些属性,要实现哪些方法,而不用关心具体的实现细节;这样我们的软件测试也变得更简单了。

    松耦合:在我们的代码设计时,不用担心会破坏其它地方的代码。这种类与类之间依赖性低的设计方法,使一个类与另外一个类仿佛隔开了,它们之间只是通过消息来联系的,所以设计一类时,可以不用担心破坏另外一个类。当代码有改动时,可以不用大规模的改动我们的代码,我们只用定位于一个出问题的模块,然后对其进行更改就好了,而且能做到不改变其它模块的服务。

    信息隐藏、接口设计、松耦合都是面向对象设计的重要方法,都是使程序设计时更接近日常认识,在大模块之间关系中不用过于担心细节,只需在模块设计时下功夫。


    Design by Contract, Code Contract

    契约式编程对于软件工程是一个极大的理论改革,对于C/S模式造成了极大的影响和冲击。对于C/S模式,我们看待两个模块的地位是不平等的,我们往往要求server非常强大,可以处理一切可能的异常,而对client不闻不问,造成了client代码的低劣。

    而在DbC中,使用者和被调用者地位平等,双方必须彼此履行义务,才可以行驶权利。调用者必须提供正确的参数,被调用者必须保证正确的结果和调用者要求的不变性。双方都有必须履行的义务,也有使用的权利,这样就保证了双方代码的质量,提高了软件工程的效率和质量。

    缺点是对于程序语言有一定的要求,契约式编程需要一种机制来验证契约的成立与否。而断言显然是最好的选择,但是并不是所有的程序语言都有断言机制。那么强行使用语言进行模仿就势必造成代码的冗余和不可读性的提高。比如.NET4.0以前就没有assert的概念,在4.0后全面引入了契约式编程的概念,使得契约式编程的可用性大大提高了。此外,契约式编程并未被标准化,因此项目之间的定义和修改各不一样,给代码造成很大混乱,这正是很少在实际中看到契约式编程应用的原因。

    在我们的代码中,对于模块间使用了契约的思想,保证双方地位的平等。调用者的传入参数必须是正确的,否则责任不在被调用者,而在传入者。


    单元测试

    这是我们单元测试最后的截图,虽然还有很多测试点没有完全被测到,但是从测试效果来看,这次的作业完成效率还是很高的。当然,我们还需要努力,在很多过程中没有完全发挥自身力量。

    为了更好的完成测试覆盖率,我们应该分析每个测试点,分析这些测试点的类别,从而有针对、有选择地进行测试,从而让测试效果不断完善,测试结果不断增强。


    类图

    由于Vs类图之间的联系不够紧密,很多联系被忽略掉,所以会看到个别孤立的类。当然,这些之间的连线虽然没有出来,但是通过方法名可以很容易找出一些关系来。


    算法的关键和独到之处

    我的算法中比较独特的地方应该是四则运算这部分。大部分同学在写四则运算的过程中,或多或少会将其改成后缀表达式,然后再用堆栈的方式来进行运算。但是这样做的话,步骤比较繁杂,不容易做出来。所以我改用了一个原ACM竞赛中的编程算法。

    然后比较关键的一点就是生成表达式的方法:我用了编译原理书中的一个方法,而且这个方法十分利于对后续编程的修改。

    <表达式> = <项> | <表达式> + <项> | <表达式> - <项>

    <项> = <因子> | <项> * <因子> | <项> / <因子>

    <因子> = (<表达式>) | i

    通过这种文法表达式,我能够采用很简便的方式实现,而且运算速度也比较快。


    感想与体会

    这次作业要求很多,我花在其中的时间也很多,但是我很开心,因为我学会了很多以前没有接触到的东西。

    人生就是这样,或许此刻劳累受苦,但是将来某个时刻将会因为这个时候的奋斗而少做很多事。当然,为了以后能够更为快速的掌握市场经济的需要,找准自己的位置。如此才能最大限度地让自己活得更加精彩。

  • 相关阅读:
    Android 剪贴板详解
    Android 7.1
    Windows 上安装 Redis 及可能出现的错误和解决方法!
    微信支付(服务商模式问题集)
    LOG4J日志问题 Failed to load class "org.slf4j.impl.StaticLoggerBinder".
    Mysql强制修改密码
    Mysql密码忘记,修改密码方法
    笔记本最大支持内存查看方法
    Liunx操作指令搜素引擎
    tomcat启动时,内存溢出,Exception: java.lang.OutOfMemoryError thrown from the UncaughtExceptionHandler in thread "main"
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/4860184.html
Copyright © 2011-2022 走看看