结对项目
结对作业
成员及项目
周戈 3123004164 李永胜 3123004148
| 这个作业属于哪个课程 | 地址 |
|---|---|
| 这个作业要求在哪里 | 要求 |
| 这个作业的目标 | 完成结对项目 |
PSP表格
| PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
|---|---|---|---|
| Planning | 计划 | 30 | 30 |
| · Estimate | · 估计这个任务需要多少时间 | 30 | 30 |
| Development | 开发 | 670 | 765 |
| · Analysis | · 需求分析 (包括学习新技术) | 60 | 120 |
| · Design Spec | · 生成设计文档 | 30 | 20 |
| · Design Review | · 设计复审 (和同事审核设计文档) | 30 | 20 |
| · Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 10 | 5 |
| · Design | · 具体设计 | 120 | 60 |
| · Coding | · 具体编码 | 300 | 420 |
| · Code Review | · 代码复审 | 60 | 60 |
| · Test | · 测试(自我测试,修改代码,提交修改) | 60 | 60 |
| Reporting | 报告 | 120 | 80 |
| · Test Report | · 测试报告 | 60 | 30 |
| · Size Measurement | · 计算工作量 | 30 | 30 |
| · Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 30 | 20 |
| 合计 | 820 | 875 |
效能分析



由图可知,evaluate方法消耗较多
性能改进
经检查,evaluate方法复杂,且多次被调用,所以使用map存储答案,减少被调用的次数
设计实现过程
所有类
1.GlobalConstant.java 全局常量,用于存储常量
2.ExpressionGenerator.java 表达式生成器,用于生成随机表达式
3.FileHandler.java 文件处理器,对文件进行预处理
4.Fraction.java 分数类,用于表示和处理分数运算
5.ExpressionEvaluator.java 表达式计算器,计算表达式的结果
6.ExpressionNormalizer.java 表达式标准化器,标准化表达式,用于去重
7.Main.java 主函数入口
核心方法
generateExpression():循环生成数字和表达式符号,尽量保证结果不为负数,直到生成完整的表达式,计算表达式得数,判断是否为负数,是重新计算,否则返回表达式;
normalizaExpression():先分词,转化为逆波兰表达式,转化为表达式树,对表达式树进行标准化,转化为字符串返回。
核心代码
public List<String> shuntingYard(List<String> tokens) {
// 输出队列
List<String> outputQueue = new ArrayList<>();
// 运算符栈
List<String> operatorStack = new ArrayList<>();
for (String token : tokens) {
// 判断是否为数字
if (isNumber(token)) {
outputQueue.add(token);
// 判断是否为操作符
} else if (isOperator(token)) {
// 操作符栈不为空且栈顶元素优先级大于等于当前元素,则将栈顶元素弹出并加入输出队列
while (!operatorStack.isEmpty() && hasHigherPrecedence(operatorStack.get(operatorStack.size() - 1), token)) {
outputQueue.add(operatorStack.remove(operatorStack.size() - 1));
}
operatorStack.add(token);
} else if (LEFT_BRACKET.equals(token)) {
operatorStack.add(token);
} else if (RIGHT_BRACKET.equals(token)) {
// 将栈顶元素弹出并加入输出队列,直到遇到左括号
while (!operatorStack.isEmpty() && !LEFT_BRACKET.equals(operatorStack.get(operatorStack.size() - 1))) {
outputQueue.add(operatorStack.remove(operatorStack.size() - 1));
}
// 将 "(" 从操作符栈中弹出
operatorStack.remove(operatorStack.size() - 1);
}
}
while (!operatorStack.isEmpty()) {
outputQueue.add(operatorStack.remove(operatorStack.size() - 1));
}
return outputQueue;
}
项目小结
明确分工与责任意识
项目初期,我们通过讨论明确了彼此的强项:我负责表达式标准化和性能调优,搭档专注表达式生成。分工后定期同步进度,确保任务不重叠、不遗漏。
沟通机制与冲突解决
采用“每日15分钟站会”快速同步进展,并约定使用Git版本控制工具管理代码,避免协作冲突。
当对技术方案产生分歧时,我们通过“提案对比法”列出各自的方案优缺点,最终以项目目标为导向达成共识。
互补学习与效率提升
搭档在编码领域的经验弥补了我的知识盲区,而我在性能调优方面的实践也帮助团队提升了整体效率。
通过互相审核代码和文档,我们减少了30%以上的低级错误,并建立了统一的代码规范。
本次合作让我认识到,团队协作不仅是任务的叠加,更是资源整合、信任构建和能力放大的过程。这些经验将为我未来的团队工作奠定坚实基础。

浙公网安备 33010602011771号