结对项目
1.代码地址:https://git.coding.net/mx123422/sizeyunsuanGUI-master.git
2.PSP计划
PSP2.1 |
任务内容 |
计划共完成需要的时间(h) |
Planning |
计划 |
0.5 |
· Estimate |
· 估计这个任务需要多少时间,并规划大致工作步骤 |
0.5 |
Development |
开发 |
35 |
· Analysis |
· 需求分析 (包括学习新技术) |
1 |
· Design Spec |
· 生成设计文档 |
1 |
· Design Review |
· 设计复审 (和同事审核设计文档) |
3 |
· Coding Standard |
· 代码规范 (为目前的开发制定合适的规范) |
2 |
· Design |
· 具体设计 |
5 |
· Coding |
· 具体编码 |
15 |
· Code Review |
· 代码复审 |
3 |
· Test |
· 测试(自我测试,修改代码,提交修改) |
5 |
Reporting |
报告 |
3 |
· Test Report |
· 测试报告 |
1 |
· Size Measurement |
· 计算工作量 |
1 |
· Postmortem & Process Improvement Plan |
· 事后总结, 并提出过程改进计划 |
1 |
3.接口
(1)Information Hiding信息隐藏
信息隐藏指在设计和确定模块时,使得一个模块内包含的信息(过程或数据),对于不需要这些信息的其他模块来说,是不能访问的。通过信息隐藏,可以定义和实施对模块的过程细节和局部数据结构的存取限制。
信息隐藏有着独特的启发力,它能够激发出有效的设计方案。信息隐藏同样有助于设计类的公开接口。在设计的所有层面上,都可以通过询问该隐藏些什么来促成好的设计决策。
(2)Interface Design接口设计
模块间的接口分类:参数传递,全局变量,文件
设计原则:
低耦合,高内聚;两个耦合的模块间以数据耦合为最佳,即除了调用时传参数以外不存在其他关系。
设计要点:
模块功能力求单一,即一个模块只做一件事;模块的输入输出数据全部组织成为调用参数且当被调用时实参和形参要保持一致
本次项目在生成运算式与计算数值中使用到了接口。
(3)Loose Coupling松耦合
模块与模块之间总会存在一些“联系”,这就会提升我们维护过程中的复杂度和任务量。松耦合通过接口的方式实现各个模块之间的调用,可以使模块在发生改变时,其他的部分可以保持不变,减少模块间的相互“联系”,降低耦合。
4.计算模块接口的设计与实现过程
(1)YunSuanShiShengCheng
此接口对于题目中仅加减、是否含乘除法、是否含括号含三个方法,接受来自GUI界面输入的题目数、绝对值上下限及运算符个数,从而完成Main.java中对于生成计算式的实现;同理也可从命令行接受来自Command.java中的参数进行运算式生成。
(2)Calculate
此接口中的方法对来自YunSuanShiShengCheng.Java中生成字符串型运算式的求值。
5.计算模块接口部分的性能改进
项目总体分析图,从内存,多线程,CPU等方面分析了计算模块的性能,截图如下:
代码覆盖率:
6.计算模块部分单元测试展示
7.计算模块部分异常处理说明
输入参数不合法:
1 import java.io.PrintStream;
2 import java.util.Scanner;
3
4 public class Command {
5 static YunSuanShiShengCheng expression=new YunSuanShiShengCheng();
6 public static int n;//题目数
7 public static int m1;//范围下限
8 public static int m2;//范围上限
9 public static int b = 0;//题目中是否有括号,默认没有
10 public static int c = 0;//题目中是否有乘除法,默认没有
11 public static int o = 1;//运算符个数,默认为1
12
13
14
15 public static void main(String[] args) {
16 // TODO Auto-generated method stub
17 int isN = 0;
18 int isM = 0;
19 /*n = 10;
20 m1 = 1;
21 m2 = 50;
22 c=0;
23 o=4;
24 b=1;*/
25 for (int i = 0; i < args.length; i++) {
26 if (args[i].equals("-n")) {
27 isN = 1;
28 try {
29 n = Integer.parseInt(args[i + 1]);
30 if (n <= 0 || n > 10000) {
31 System.out.println("n的范围不在[1,10000]内,请重新输入");
32 return;
33 }
34 } catch (Exception e) {
35 System.out.println("n的格式不合法,请重新输入!");
36 }
37 }
38 if (args[i].equals("-m")) {
39 isM = 1;
40 try {
41 m1 = Integer.parseInt(args[i + 1]);
42 m2 = Integer.parseInt(args[i + 2]);
43 if (m1 <= 0 || m1 > 100) {
44 System.out.println("m1的范围不在[1,100]内,请重新输入");
45 return;
46 }
47 if (m2 < 50 || m2 > 1000) {
48 System.out.println("m1的范围不在[50,1000]内,请重新输入");
49 return;
50 }
51 } catch (Exception e) {
52 System.out.println("m的格式不合法,请重新输入!");
53 }
54 }
55
56 if (args[i].equals("-o")) {
57 try {
58 o = Integer.parseInt(args[i + 1]);
59 if (o <= 0 || o > 10) {
60 System.out.println("o的范围不在[1,10]内,请重新输入");
61 return;
62 }
63 } catch (Exception e) {
64 System.out.println("o的格式不合法,请重新输入!");
65 }
66 }
67 if (args[i].equals("-b")) {
68 b = 1;// 括号
69 }
70 if (args[i].equals("-c")) {
71 c = 1;// 乘除
72 }
73 }
74 if (isN == 0) {
75 System.out.println("无参数n,请重新输入!");
76 return;
77 }
78 if (isM == 0) {
79 System.out.println("无参数m,请重新输入!");
80 return;
81 }
82
83 System.out.println("生成"+n+"道算术题,每道题目与中间结果的绝对值应该在"+m1+"到"+m2+"之间,算术题中的符号有"+o+"个。");
84
85 if (b == 0&&c==0) {
86 expression.generateExpressionA(o,m1,m2,n);
87 }
88 else if(b == 0&&c==1){
89 expression.generateExpressionD(o,m1,m2,n);
90 }
91 else if((c == 0)&&b==1){
92 expression.generateExpressionB(o,m1,m2,n);
93 }
94 else
95 System.out.println("请重新输入!");
96 //System.out.println("成功");
97 }
98
99 }
8.界面模块的详细设计过程
主页面使用CalFrame frame=new CalFrame();
1 import javax.swing.*;
2 import java.awt.*;
3 /**
4 * 主页面框架
5 *
6 */
7 class CalFrame extends JFrame{
8 private static final long serialVersionUID = 1L;
9
10 Toolkit kit=Toolkit.getDefaultToolkit();
11 Dimension screenSize=kit.getScreenSize();
12 int DEFAULT_WIDTH=screenSize.width;
13 int DEFAULT_HEIGHT=screenSize.height;
14
15 public CalFrame(){
16 setSize(DEFAULT_WIDTH/2,DEFAULT_HEIGHT/2);
17 setLocationByPlatform(true);
18 add(new MainComponent());
19 }
20 }
21 @SuppressWarnings("serial")
22 class MainComponent extends JComponent{
23
24 }
文件及题型选择:
1 JMenuBar menuBar = new JMenuBar();
2
3 JMenu fileMenu = new JMenu("文件");
4 JMenu tixingMenu = new JMenu("题型选择");
5
6 menuBar.add(fileMenu);
7 menuBar.add(tixingMenu);
功能选择区:
1 // 创建文本区域, 用于显示相关信息
2 final JTextArea msgTextArea = new JTextArea(10, 30);
3 msgTextArea.setLineWrap(true);
4 panel.add(msgTextArea);
5
6 //MenuBar组件部分
7 //文件下目录
8 JMenuItem generateMenuItem = new JMenuItem("生成题库");
9 JMenuItem exitMenuItem = new JMenuItem("退出");
10 fileMenu.add(generateMenuItem);
11 fileMenu.addSeparator();// 添加一条分割线
12 fileMenu.add(exitMenuItem);
13
14 /*题型选择下目录*/
15 final JRadioButtonMenuItem radioButtonMenuItem01 = new JRadioButtonMenuItem("加减法");
16 final JRadioButtonMenuItem radioButtonMenuItem04 = new JRadioButtonMenuItem("乘法混合运算");
17 final JRadioButtonMenuItem radioButtonMenuItem02 = new JRadioButtonMenuItem("带括号整数算式");
18 final JRadioButtonMenuItem radioButtonMenuItem03 = new JRadioButtonMenuItem("真分数整数算式");
19 // 子菜单添加到一级菜单
20 //viewMenu.add(openQuestion);
21 tixingMenu.addSeparator();
22 tixingMenu.add(radioButtonMenuItem01);
23 tixingMenu.add(radioButtonMenuItem04);
24 tixingMenu.add(radioButtonMenuItem02);
25 tixingMenu.add(radioButtonMenuItem03);
26 // 其中两个 单选按钮子菜单,要实现单选按钮的效果,需要将它们放到一个按钮组中
27 ButtonGroup btnGroup = new ButtonGroup();
28 btnGroup.add(radioButtonMenuItem01);
29 btnGroup.add(radioButtonMenuItem04);
30 btnGroup.add(radioButtonMenuItem02);
31 btnGroup.add(radioButtonMenuItem03);
32 // 默认第一个单选按钮子菜单选中
33 radioButtonMenuItem01.setSelected(true);
9.
generateExpressionA、generateExpressionB、generateExpressionC、generateExpressionD
1 generateMenuItem.addActionListener(new ActionListener() {
2 @Override
3 public void actionPerformed(ActionEvent e) {
4
5 int flag=1;//默认普通算式
6 if(radioButtonMenuItem01.isSelected()){flag=1;}
7 if(radioButtonMenuItem04.isSelected()){flag=4;}
8 if(radioButtonMenuItem02.isSelected()){flag=2;}
9 if(radioButtonMenuItem03.isSelected()){flag=3;}
10 String inputContent1 = JOptionPane.showInputDialog(
11 frame,
12 "输入运算符的个数:"
13 );
14 String inputContent2 = JOptionPane.showInputDialog(
15 frame,
16 "输入结果绝对值的范围下限:"
17 );
18 String inputContent3 = JOptionPane.showInputDialog(
19 frame,
20 "输入结果绝对值的范围上限:"
21 );
22 String inputContent4 = JOptionPane.showInputDialog(
23 frame,
24 "输入题目的数量(<10000):"
25 );
26
27 if((inputContent4==null||inputContent4.equals(""))&&(inputContent1==null||inputContent1.equals(""))&&(inputContent3==null||inputContent3.equals(""))&&(inputContent4==null||inputContent4.equals(""))){
28 textArea.append("取消生成\n");
29 }
30 else{
31 if(judge(Float.parseFloat(inputContent4))){
32 switch(flag){
33 case 1:
34 expression.generateExpressionA(Integer.parseInt(inputContent1),Integer.parseInt(inputContent2),Integer.parseInt(inputContent3),Integer.parseInt(inputContent4));
35 break;
36 case 4:
37 expression.generateExpressionD(Integer.parseInt(inputContent1),Integer.parseInt(inputContent2),Integer.parseInt(inputContent3),Integer.parseInt(inputContent4));
38 break;
39 case 2:
40 expression.generateExpressionB(Integer.parseInt(inputContent1),Integer.parseInt(inputContent2),Integer.parseInt(inputContent3),Integer.parseInt(inputContent4));
41 break;
42 case 3:
43 expression.generateExpressionC(Integer.parseInt(inputContent1),Integer.parseInt(inputContent2),Integer.parseInt(inputContent3),Integer.parseInt(inputContent4));
44 break;
45 }
46
47 arithExpress=doFile.ReadFromFile("./correctAnswer.txt");
48
49 JOptionPane.showMessageDialog(frame,"新的题库已生成,可以开始答题","消息标题",JOptionPane.INFORMATION_MESSAGE);
50 }else{
51 JOptionPane.showMessageDialog(frame,"输入非法参数","消息标题",JOptionPane.WARNING_MESSAGE);
52 }
53
54 }
55
56 }
57 });
10.描述结对的过程
从项目开始就在一起准备,查找各方面的资料。JAVA的知识都忘却的差不多了,但是两人还是一起努力捡起原来的JAVA书开始针对性地学习。最开始并没有任何计划,在查找了相关资料以及咨询大佬门之后,两人共同完成了大致的项目进行走向。中间也产生过分歧,在计算结果模块的部分,两人各有各的思考,但是个人的成果都有bug存在,在协商一致后两人互补的完成了计算模块的代码设计,虽然过程较为复杂,但是最终能够完成了项目的基本功能!在合作过程中苦中有乐,收获很多!
11.结对情况分析
成员:
马雪 2016012093
王亚楠 2015012012
(1)结对优点
程序员互相帮助,互相教对方,可以得到能力上的互补。
可以让编程环境有效地贯彻Design。
增强代码和产品质量,并有效的减少BUG。
降低学习成本。一边编程,一边共享知识和经验,有效地在实践中进行学习。
在编程中,相互讨论,可能更快更有效地解决问题。
(2)结对缺点
于有不同习惯的编程人员,可以在起工作会产生麻烦,甚至矛盾。
有时候,程序员们会对一个问题各执己见(代码风格可能会是引发技术人员口水战的地方),争吵不休,反而产生重大内耗。
两个人在一起工作可能会出现工作精力不能集中的情况。程序员可能会交谈一些与工作无关的事情,反而分散注意力,导致效率比单人更为低下。
个人优点:不松懈、努力、不懂就问
个人缺点:缺少耐心
队员优点:冷静、积极、技术性指导
队友缺点:办事心切,处事不够干练
12.PSP实际
PSP2.1 |
任务内容 |
实际完成需要的时间(h) |
Planning |
计划 |
0.5 |
· Estimate |
· 估计这个任务需要多少时间,并规划大致工作步骤 |
0.5 |
Development |
开发 |
47 |
· Analysis |
· 需求分析 (包括学习新技术) |
2 |
· Design Spec |
· 生成设计文档 |
2 |
· Design Review |
· 设计复审 (和同事审核设计文档) |
5 |
· Coding Standard |
· 代码规范 (为目前的开发制定合适的规范) |
3 |
· Design |
· 具体设计 |
6 |
· Coding |
· 具体编码 |
20 |
· Code Review |
· 代码复审 |
3 |
· Test |
· 测试(自我测试,修改代码,提交修改) |
6 |
Reporting |
报告 |
6 |
· Test Report |
· 测试报告 |
2 |
· Size Measurement |
· 计算工作量 |
2 |
· Postmortem & Process Improvement Plan |
· 事后总结, 并提出过程改进计划 |
2 |