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.结对编程照片:
2.改进现有代码
需求分析:针对现有代码的改进分析,新开发功能的分析。
(1)clone项目,检查大部分主要类之间的关系,画出类图
ANSWER:
(2)浏览所有代码考虑代码质量和测试覆盖率
ANSWER:
单元测试如下:
测试覆盖率:
(3)确定当前设计的一个弱点,通过重构,确保在这个地方已有测试覆盖并保证重构没有改变已有的功能
ANSWER:
1.不能实现负数的加减乘除;
2.不能实现3个数字以上的加减乘除;
3.不能实现乘方的功能;
4.不能实现括号的功能;
5.不能实现小数的加减乘除;
6.无法自动生成计算式并完成计算
7.代码重复量,出现代码逻辑泥球
(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("+-","-")
# print(generExpress())
解析表达式
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代码实现:
(2)回归测试
ANSWER:
在开发新功能时避免损坏旧的功能,以确保新的功能不与原有功能冲突
在确认修改的功能正确之后再签入代码。
(3)效能分析工具使用
<1>效能分析工具:http://www.oschina.net/p/jprofiler ,使用方法: http://www.cnblogs.com/bjlhx/p/6668888.html
ANSWER:
1,Telemetries 监控信息
查看JVM的运行信息
2,Live memory 内存剖析
JProfiler 的内存视图部分可以提供动态的内存使用状况更新视图和显示关于内存分配状况信息的视图。所有的视图都有几个聚集层并且能够显示现有存在的对象和作为垃圾回收的对象。
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>请根据构建之法书上编码规范里提到的那些要点整理一份你们在结对编程时使用的代码规范,把你们约定的编码规范文档也提交到码云
(2)代码复审:
参考:http://drysaltery.com/2015/06/15/Rainy-Days/
(3)给人提意见的方式——送一个汉堡包
参考:http://www.cnblogs.com/xinz/archive/2011/08/22/2148776.html
(4)理解领航员和驾驶员两种角色关系,并在结对编程中两个人轮流做对方的角色。两人都必须参与本次作业的编码工作,并在git提交日志上体现这点。
码云提交记录:
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:
我们两个在待在一起做了好几天才写完这个代码。期间遇到好多问题。比如选啥语言,最后要做成啥样。双方有争执,但是最后都能通过讨论解决。最关键的是,在写代码里面,结对编程的时候,,一个人往往能帮组另外一个人想出另外一个人没想到的。比如生成表达式的除数不能为0,之类的。总体来说。结对编程能实现1+1>2