zoukankan      html  css  js  c++  java
  • 软件工程网络15结对编程作业(201521123082)

    标签(空格分隔): 软件工程


    0.结对编程成员:

    戴志斌(201521123083)博客:http://www.cnblogs.com/daizhibin/
    黄华林(201521123082)博客:http://www.cnblogs.com/moyi-h/
    结对编程码云地址:https://gitee.com/smoyi/softwarePairingProject
    原源代码地址:https://coding.net/u/Belong033/p/java-third/git
    原题目要求(如下):
    http://www.cnblogs.com/happyzm/p/6472120.html
    http://www.cnblogs.com/happyzm/p/6509116.html
    http://www.cnblogs.com/happyzm/p/6558307.html
    经过我们两个人协商,决定将题目的客观题答案进行比较留下比较好的回答,然后主观题按照自己的理解作答。

    1.结对编程照片:

    P)GE9K4$WSH}0ZX8Q4R5POH.jpg

    2.改进现有代码

    需求分析:针对现有代码的改进分析,新开发功能的分析。

    (1)clone项目,检查大部分主要类之间的关系,画出类图

    ANSWER:
    图片.png

    图片.png

    (2)浏览所有代码考虑代码质量和测试覆盖率

    ANSWER:
    单元测试如下:
    图片.png
    测试覆盖率:
    图片.png

    图片.png

    (3)确定当前设计的一个弱点,通过重构,确保在这个地方已有测试覆盖并保证重构没有改变已有的功能

    ANSWER:
    图片.png
    1.不能实现负数的加减乘除;
    2.不能实现3个数字以上的加减乘除;
    3.不能实现乘方的功能;
    4.不能实现括号的功能;
    5.不能实现小数的加减乘除;
    6.无法自动生成计算式并完成计算
    7.代码重复量,出现代码逻辑泥球

    算法可以参考:https://www.cnblogs.com/dragondove/p/6445850.html

    (4)修改代码后,检查代码覆盖,看单元测试是否需要修改?测试用例是否需要增加?

    ANSWER:
    单元测试需要自己修改,因为我们用python进行重构了,单元测试肯定要修改,测试用例由于功能增加也要增加。

    3.功能改进与扩展

    增加一个运算符,程序应该有怎样的改变?不得不扔掉全部重写么,还是可以只改部分模块?基于模块化设计的思想,考虑在现有程序中做什么样的修改,才能让程序更好地实现新的需求
    ANSWER:
    我们决定用python进行重构来更方便实现新的需求。

    代码展示:展示每个功能的核心代码。

    def generExpress():
        express = list()
        express.append(str(random.randint(-10,10)))
        for i in range(random.randint(1,5)):
            if "^" not in express:
                oper = random.choice(['+','-','*',"/","^"])
            else:
                oper = random.choice(['+','-','*',"/"])
            express.append(oper)
            if oper == "^":
                express.append(str(random.randint(1,5)))
            else:
                express.append(str(random.randint(1,3)))
        if "+" not in express and "-" not in express:
                return "".join(express)
        index = -1
        while index == -1:
            try:
                index = express.index(random.choice(["+","-"]))
            except:
                index= -1
        express.insert(index-1,"(")
        express.insert(index+3,")")
        return "".join(express).replace("--","+").replace("+-","-")
    
    def parseExpress(Express):
        Express=Express.replace("^","**")
        # print(Express)
        try:
            return eval(Express)
        except Exception as e:
            return "Error"
    
    

    (1)增加括号操作符、减少重复题目、增加一个运算符(乘方)

    程序一次运行生成的题目不能重复,即任何两道题目不能通过有限次交换+和×左右的算术表达式变换为同一道题目。例如,23 + 45 = 和45 + 23 = 是重复的题目,6 × 8 = 和8 × 6=也是重复的题目。3+(2+1)和1+2+3这两个题目是重复的,由于+是左结合的,1+2+3等价于(1+2)+3,也就是3+(1+2),也就是3+(2+1)。但是1+2+3和3+2+1是不重复的两道题,因为1+2+3等价于(1+2)+3,而3+2+1等价于(3+2)+1,它们之间不能通过有限次交换变成同一个题目。用符号表示乘方,例如:42=16

    ANSWER:
    如下python代码实现:
    TIM图片20180325151945.png

    TIM图片20180325151953.png

    (2)测试和分析

    ANSWER:
    1.单元测试图片如下:
    图片.png
    2.覆盖率测试如下:
    图片.png
    图片.png
    图片.png
    图片.png
    3.在开发新功能时避免损坏旧的功能,以确保新的功能不与原有功能冲突,在确认修改的功能正确之后再签入代码。

    (3)效能分析工具使用(这是对原程序的分析)

    <1>效能分析工具:http://www.oschina.net/p/jprofiler ,使用方法: http://www.cnblogs.com/bjlhx/p/6668888.html
    ANSWER:
    1,Telemetries 监控信息
    查看JVM的运行信息
    图片.png
    2,Live memory 内存剖析
    JProfiler 的内存视图部分可以提供动态的内存使用状况更新视图和显示关于内存分配状况信息的视图。所有的视图都有几个聚集层并且能够显示现有存在的对象和作为垃圾回收的对象。
    图片.png

    4.在两人合作的过程

    (1)满足代码风格规范和代码设计规范(参考书第4章4.1-4.3内容)http://www.cnblogs.com/xinz/archive/2011/11/20/2255971.html
    ANSWER:
    <1>我们两个人要有口头上的沟通:“好的,我们一起在开发中遵守一起认可的编码规范”,按照编码标准和规范进行分模块编码。
    <2>使用工具:

    checkstyle http://blog.csdn.net/maritimesun/article/details/7668718
    Findbugs
    PMD

    <3>请根据构建之法书上编码规范里提到的那些要点整理一份你们在结对编程时使用的代码规范,把你们约定的编码规范文档也提交到码云
    图片.png

    (2)代码复审:
    参考:http://drysaltery.com/2015/06/15/Rainy-Days/
    图片.png

    (3)给人提意见的方式——送一个汉堡包
    参考:http://www.cnblogs.com/xinz/archive/2011/08/22/2148776.html
    图片.png

    (4)理解领航员和驾驶员两种角色关系,并在结对编程中两个人轮流做对方的角色。两人都必须参与本次作业的编码工作,并在git提交日志上体现这点。
    码云提交记录:
    图片.png
    图片.png

    5.PSP:

    PSP2.1 个人开发流程 预估耗费时间(分钟) 实际耗费时间(分钟)
    lanning 计划 15 10
    · Estimate 明确需求和其他相关因素,估计每个阶段的时间成本 15 10
    Development 开发 90 100
    · Analysis 需求分析 (包括学习新技术) 10 15
    · Design Spec 生成设计文档 15 15
    · Design Review 设计复审 5 10
    · Coding Standard 代码规范 5 5
    · Design 具体设计 10 10
    · Coding 具体编码 30 30
    · Code Review 代码复审 5 5
    · Test 测试(自我测试,修改代码,提交修改) 10 10
    Reporting 报告 10 8
    · 测试报告 5 4
    · 计算工作量 2 1
    · 并提出过程改进计划 3 3

    6.小结感受:结对编程真的能够带来1+1>2的效果吗?通过这次结对编程,请谈谈你的感受和体会:

    ANSWER:
    结对编程,有利于两个人对于同一个项目的交流。由一开始拿到项目时的需求分析,两个人都会不同的想法,通过协商和交流,达成共同的想法。由于两个人的代码规范有些许不同,通过统一规范,可以达到代码风格一致。在重构的过程中两个人可以交替更换领航员和驾驶员的身份,更有利于完善项目需求。在这期间我们两个人都有自己的PSP,能够按照实际情况完成填写,我觉得这个表格有利于更好地完成项目。结对编程,对于我们学生来说可能更重要的是一点是互帮互助,所以效果可能是1+1=2左右,而对于将来从事开发并具有一定水平的程序员来说,1+1>2。

  • 相关阅读:
    ###JS获取URL参数的函数###
    Ant通配符
    java.lang.OutOfMemoryError处理错误
    超越最常用的快捷键
    一个完整的工作流管理系统成部分
    Caused by: org.hibernate.hql.ast.QuerySyntaxException: TkltEmpQuitProcess is not mapped. (SSH项目中出现的映射问题)
    小的心得
    diary record 20120423
    小的思想
    用3种方法检测远程URL是否存在。
  • 原文地址:https://www.cnblogs.com/moyi-h/p/8644894.html
Copyright © 2011-2022 走看看