zoukankan      html  css  js  c++  java
  • 结对项目博客

    结对编程_1

    崔强(187) 仇栋民(168)

    一、        我对结对编程的看法,我对同伴的看法以及我们的工作。

    结对编程优点:

      1.分工合作,每人负责自己的部分,效率高。

      2.不想坑队友,工作时会比较认真。

      3.两个人写的模块会相互调用,开发过程中会不断的对同伴的代码进行复审,提高了程序运行的正确性和稳定性。

      4.降低开发时间成本。

     

    结对编程缺点:

      1.分工容易出现失衡,能者多劳可能变成不能者不劳。

      2.代码风格迥异的两人可能互相看不懂代码,拖慢开发进程。

      3.程序中总会出现公用代码,一旦出现意见分歧,比较难解决。

      4.增加了资源利用的成本。

     

    我的同伴的优点:

      1.编程能力极强。。。

      2.性格很好,很容易沟通。

      3.代码风格跟我差不多,这点很欣慰~

     

    我的同伴的缺点:

      1.缺点跟我差不多,十一出去玩了,最后两天才回来一起继续工作。。。

     

    工作照片:

    二、   Information Hiding、interface design、loose coupling

    1. Information Hiding:

      信息隐藏原则,是面向对象程序设计的基础。信息隐藏的好处是可以保护数据随意被修改,只有拥有权限才可以访问并修改程序内的数据。这样程序可以相对稳定执行,避免出现数据出错导致的程序崩溃。

    将程序需要提供的功能模块化,每个模块完成各自的功能,每个模块封装起自己的数据,只有自己才能访问并修改,即所有变量采用private型。这便保证了信息隐藏。模块之间的交互通过接口完成,也就是只能通过访问模块内的public方法,才可以在不访问模块内任何数据的情况下,能且仅能获取该模块的功能(即返回值)。

     

    1. interface design:

      接口设计原则,可以令面向对象的程序设计封装起来更加精简。模块化的程序中,每个模块(即每个类)只完成一个功能,然而有些时候我们需要许多“小”功能共同作用,完成一个大“功能”。这时候我们需要将所需的所有模块实例化,再取其中的方法,连续调用,过于冗杂。这个时候我们定义一个接口,将所需的方法封在里面,当需要完成“大功能”的时候,我们只需调用这个接口就可以了。当然,应该尽量减少通用接口,具体问题具体分析,多提供特定的接口给用户才更加人性化。

      要想设计好的接口,不能再打代码的过程中才开始规划,而是要着手操作之前,就预先想好需要什么接口。接口的设计依赖于“大”功能的数量。所以我们要对用户要求的功能进行分析,哪些功能可以作为“大”功能,而这个大功能分别需要什么“小”功能(即类),这样在打代码的过程中,我们才能逻辑清晰,高效完成。

     

    1. loose coupling:

      松耦合高内聚。即模块之间尽可能独立,模块内部数据联系紧密。要想做到这点,必须在开始写程序之前,将功能细化(模块化),把用户要求实现的功能分析清楚,尽可能独立出各种功能。使可以完成这些功能的模块,只要求尽量少的输入,即可返回相应输出,并且不依赖于其它模块。

     

    三、        Design by Contract, Code Contract

      我认为有2个有点。

      第一,  明确了用户和开发者的义务和权利(即用户提供正确输入或输入状态即可获得程序运行结果,开发者收到正确输入并处于正确等待运行状态便提供正确运行结果)后,开发者在开发过程中只需要考虑正确的输入即可,一切不正确的输入(不满足前置条件),都将报错。精简了程序逻辑,缩短了开发周期。

      第二,  混在整段程序的冗杂判错代码段去除后, 清晰的程序逻辑框架有助于开发者Debug,一方面缩短开发周期,更重要的是有效减少了程序运行的安全隐患,因为开发者调试更加简单,调理更加清晰。

    缺点:

          对用户要求较高,虽然可以单独提供判错模块对用户的输入及输入状态进行判断,但是时间成本不一定比原本低。

     

      我感觉实际上把契约思想加到这次作业中还是比较简单的,这次作业中只有一个模块的前置条件比较苛刻,即计算用户在界面输入的题目的模块。该模块的前置条件是,用户输入的计算式符合格式规则。程序中只需要加入一个判错模块,对不符合要求的输入一律报错即可。其它模块因为存在互相调用关系,一个模块的输出即为另一个模块的输出,因为给定了每个模块的输出,所以其它模块的输入(前置条件)已默认满足。

     

    四、   unit test

    窗体部分无法进行测试(Form1),且占代码比例较大,若去掉窗体部分,覆盖率大概在85%~90%左右。

    五、   UML

    六、   算法实现

      界面窗体使用了三个标签页来对接不同的功能模块,界面示例如下:

      
      TabControl作为切换页
      Checkbox作为是否选中某选项
      NumericUpDown作为诸如值域以及其他的限制
      Button作为启动的按键和计算器的界面
      TextBox作为一些输出参数的显示和输入文件路径
      然后,Generator负责实现根据设置生成题目。内部的core()的设计思路与个人项目相仿,但是因为有了不同的设置参数,所以在生成过程中,我采取的是以同一种大思路的前提下来对不同的情况进行优化设计的方案。

      Judger和Calculator这两个模块的核心是Calculator模块,即对输入的字符串形式的题目进行计算。设计思路是分离判断格式模块和真正的计算单元,先判断是否合法,在进行分析计算,实现起来难度都不大。

      

  • 相关阅读:
    转:用两个栈实现一个队列——我作为面试官的小结
    Android屏幕重力感应旋转
    简单的单例模板,继承使用即可
    cocos2dx windows 音量设置无效解决办法
    lua lu
    OpenGL ES API with no current context
    git更新某个目录
    sh ndk-build clean Cannot run program "sh": Launching failed Error: Program "sh" not found in PATH PATH=......
    sublime Text快捷键
    转:解决windows下eclipse中android项目关联android library project失败问题
  • 原文地址:https://www.cnblogs.com/mavourneen/p/4857660.html
Copyright © 2011-2022 走看看