一、估计耗时与实际耗时
PSP2.1 |
Personal Software Process Stages |
预计时间/h |
实际时间/h |
Planning |
计划 |
1 |
1 |
Estimate |
估计这个任务需要多少时间 |
1 |
1 |
Development |
开发 |
14 |
28.5 |
Analysis |
需求分析(包括学习新技术) |
2 |
3 |
Design Spec |
生成设计文档 |
0.5 |
0.5 |
Design Review |
设计复审(和同事审核设计文档) |
0.5 |
0.5 |
Coding Standard |
代码规范(为目前的开发制定合适的规范) |
1 |
0.5 |
Design |
具体设计 |
1 |
3 |
Coding |
具体编码 |
5 |
10 |
Code Review |
代码复审 |
1 |
3 |
Test |
测试(自我测试,修改代码,提交修改) |
3 |
8 |
Reporting |
报告 |
4 |
5 |
Test Report |
测试报告 |
2 |
3 |
Size Measurement |
计算工作量 |
1 |
1 |
Postmortem Process Improvement Plan |
事后总结,并提出过程改进计划 |
1 |
1 |
合计 |
19 |
34.5 |
二、改进程序性能
由于本次编程一开始设计时没有很好的规划程序的具体结构,许多模块都是在代码编写时确定的,其中功能有不少的交叉部分,这使得后期在改进性能时工作量比较大且有一定困难。
举一例子,最初完成程序时,我将计算功能放在main函数中,这使得代码的模块化特性较差,且一定程度上降低了运算的效率。在经过思考后,我决定将计算具体步骤集成到随机数类(RandomNumber类)中,具体代码如下:
public void add(RandomNumber e2){
int lcm=Lcm(deno,e2.deno);
ele=ele*lcm/deno+e2.ele*lcm/e2.deno;
deno=lcm;
int gcd = Gcd(deno, ele);
ele /= gcd;
deno /= gcd;
if(deno == 1)
isInt=true;
setValue();
}
public void sub(RandomNumber e2)
{
int lcm = Lcm(deno, e2.deno);
ele = ele * lcm / deno - e2.ele * lcm / e2.deno;
deno = lcm;
if (deno == 1)
isInt = true;
setValue();
}
public void multi(RandomNumber e2)
{
deno *= e2.deno;
ele *= e2.ele;
int gcd = Gcd(ele, deno);
ele /= gcd;
deno /= gcd;
setValue();
}
public void dev(RandomNumber e2)
{
deno *= e2.ele;
ele *= e2.deno;
int gcd = Gcd(ele, deno);
ele /= gcd;
deno /= gcd;
setValue();
}
经过这样的改进后,程序在进行算式运算时的效率有了明显的改善。
三、代码测试
由于本次作业我使用了控制台输入,所以测试时输入和原始要求有较大差异。在测试中,程序满足最多生成10000道题的要求,同时也满足分母和整数部分不超过range的要求。整体符合本次作业要求。
四、感想与收获
可以看到,本次作业我在时间的预估和实际用时之间还是有较大的出入的。在经过这次作业后我认为问题的根源主要在于程序设计这一块,由于自己在设计时的懈怠,许多具体的细节问题还没有完全想明白就急着进行代码编写,许多函数和类都是在编写过程中随意设计的,这直接导致了编程后期代码的逻辑混乱以及不同类之间的功能交叉。在今后的软件开发过程中,我一定要重视软件初期的设计,从根本上杜绝这次作业所犯的错误。