结对项目
结 对 项 目
一.仓库地址等
二.PSP展示(两者对比)
三.结对编程对接口的设计
四.计算模块接口的设计与实现过程
五.计算模块接口部分的性能改进
六.计算模块部分单元测试展示
七.计算模块部分异常处理说明
八.界面模块的详细设计过程
九.界面模块与计算模块的对接
十.结对过程的描述
十一.结对编程的优缺点
十二.项目总结与改进
一.仓库地址: https://git.coding.net/Enther/newTeamwork.git
二.PSP展示。
将计划和实际的放在一张表中,更能形象直观的描述我们实际作业情况。
SP2.1 |
Personal Software Process Stages |
Time : SeniorStudent(h) |
Time : SDE(h) |
Planning |
计划 |
5 |
6 |
Estimate |
估计这个任务需要多少时间,规划大致步骤 |
1 |
1 |
Development |
开发 |
200 |
240 |
Analysis |
需求分析 (包括学习新技术) |
98 |
130 |
Design Spec |
生成设计文档 |
0.5 |
1.5 |
Design Review |
设计复审 |
0 |
0 |
Coding Standard |
代码规范 |
1 |
1.5 |
Design |
具体设计 |
2 |
2.5 |
Coding |
具体编码 |
93 |
98 |
Code Review |
代码复审 |
2 |
5 |
Test |
测试 |
1.5 |
2 |
Reporting |
报告 |
4 |
6 |
|
测试报告 |
3 |
3.5 |
|
计算工作量 |
1 |
1.5 |
|
事后总结 并提出过程改进计划 |
1 |
1 |
三.结对编程对接口的设计。
信息隐藏:对于面向对象的程序设计而言,信息隐藏是一种重要的软件开发手段,它与对象的封装(encapsulation)与模块化(modularity)密切相关。在我看来,信息隐藏使得一个类把复杂的、敏感的、一旦被外界捕获可能会引起不良后果的内容封装在自身内部,这个类以外的代码得不到此类信息(通过反射等手段可能对得到),以提高程序的安全性与健壮性。
接口设计:一个好的接口能够提供给后面的程序设计一个良好的框架,在这次项目里,接口的运用使我们不必纠结于每个方法和属性,简化了测试;
松耦合:在我们的代码设计时,不用担心会破坏其它地方的代码。这种类与类之间依赖性低的设计方法,使一个类与另外一个类仿佛隔开了。当代码有改动时,可以不用大规模的改动我们的代码,我们只用定位于一个出问题的模块,然后对其进行更改就好了,而且能做到不改变其它模块的目的。
四.计算模块接口的设计与实现过程。
我们运用了类与函数。
整个代码中,包括输入出题个数,语言选择,正确率判定与时间记录等功能,在以下功能的实现中,各类被主类所调用,看上去更加简洁明了。缺点在于,界面全部呈现在一起,耦合度太高,可能会影响后期维护与更新。
五.计算模块接口部分的性能改进。
以上性能分析的提高比较。可见在改进后,性能方面有一定提高
六.计算模块部分单元测试展示。
代码覆盖情况
七.计算模块部分异常处理说明。
异常处理
输出值异常
运算符异常
八.界面模块的详细设计过程。
以下是我们的设计思路:
相关jsp展示:
此部分为运用java.swing布局
1 private void initComponents() { 2 title1 = new javax.swing.JLabel(); 3 title2 = new javax.swing.JLabel(); 4 title7 = new javax.swing.JLabel(); 5 enter1 = new javax.swing.JTextField(); 6 language1 = new javax.swing.JButton(); 7 language1.setBackground(Color.LIGHT_GRAY); 8 language2 = new javax.swing.JButton(); 9 language2.setBackground(Color.LIGHT_GRAY); 10 language3 = new javax.swing.JButton(); 11 language3.setBackground(Color.LIGHT_GRAY); 12 title3 = new javax.swing.JLabel(); 13 start = new javax.swing.JButton(); 14 start.setBackground(Color.gray); 15 userAnswer = new javax.swing.JScrollPane(); 16 enter2 = new javax.swing.JTextArea(); 17 enter2.setBackground(Color.white); 18 title5 = new javax.swing.JLabel(); 19 resultprintf = new javax.swing.JLabel(); 20 finish = new javax.swing.JButton(); 21 finish.setBackground(Color.gray); 22 jScrollPane1 = new javax.swing.JScrollPane(); 23 question = new javax.swing.JTextArea(); 24 question.setBackground(Color.white); 25 title4 = new javax.swing.JLabel(); 26 jScrollPane2 = new javax.swing.JScrollPane(); 27 rightanswer = new javax.swing.JTextArea(); 28 rightanswer.setBackground(Color.white); 29 title6 = new javax.swing.JLabel(); 30 setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); 31 title2.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); 32 title2.setText("请输入出题数目:"); 33 title2.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER); 34 title7.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); 35 title7.setText("输入范围:"); 36 title7.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER); 37 title1.setFont(new java.awt.Font("微软雅黑", 0, 35)); // NOI18N 38 title1.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); 39 title1.setText("四则运算 "); 40 enter1.addActionListener(new java.awt.event.ActionListener() { 41 public void actionPerformed(java.awt.event.ActionEvent evt) { 42 enter1ActionPerformed(evt); 43 } 44 }); 45 language1.setText("简体中文"); 46 language1.addActionListener(new java.awt.event.ActionListener() { 47 public void actionPerformed(java.awt.event.ActionEvent evt) { 48 language1ActionPerformed(evt); 49 } 50 }); 51 language2.setText("繁體中文"); 52 language2.addActionListener(new java.awt.event.ActionListener() { 53 public void actionPerformed(java.awt.event.ActionEvent evt) { 54 language2ActionPerformed(evt); 55 } 56 }); 57 language3.setText("English"); 58 language3.addActionListener(new java.awt.event.ActionListener() { 59 public void actionPerformed(java.awt.event.ActionEvent evt) { 60 language3ActionPerformed(evt); 61 } 62 }); 63 title3.setText("语言"); 64 start.setText("出题"); 65 start.addActionListener(new java.awt.event.ActionListener() { 66 public void actionPerformed(java.awt.event.ActionEvent evt) { 67 startActionPerformed(evt); 68 } 69 }); 70 userAnswer.setHorizontalScrollBarPolicy(javax.swing.ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); 71 enter2.setColumns(60); 72 enter2.setRows(5); 73 enter2.setCursor(new java.awt.Cursor(java.awt.Cursor.TEXT_CURSOR)); 74 userAnswer.setViewportView(enter2); 75 title5.setText("请输入答案:"); 76 resultprintf.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); 77 resultprintf.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER); 78 finish.setText("结束"); 79 finish.addActionListener(new java.awt.event.ActionListener() { 80 public void actionPerformed(java.awt.event.ActionEvent evt) { 81 finishActionPerformed(evt); 82 } 83 }); 84 jScrollPane1.setHorizontalScrollBarPolicy(javax.swing.ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); 85 question.setColumns(20); 86 question.setRows(5); 87 jScrollPane1.setViewportView(question); 88 title4.setText("问题显示:"); 89 jScrollPane2.setHorizontalScrollBarPolicy(javax.swing.ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); 90 jScrollPane2.setToolTipText(""); 91 jScrollPane2.setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR)); 92 rightanswer.setColumns(40); 93 rightanswer.setRows(5); 94 rightanswer.setCursor(new java.awt.Cursor(java.awt.Cursor.TEXT_CURSOR)); 95 jScrollPane2.setViewportView(rightanswer); 96 title6.setText("正确答案:"); 97 javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); 98 getContentPane().setLayout(layout); 99 layout.setHorizontalGroup( 100 layout.createParallelGroup(javax.swing.GroupLayout.Alignment.CENTER) 101 .addGroup(layout.createSequentialGroup() 102 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.CENTER) 103 .addGroup(layout.createSequentialGroup() 104 .addContainerGap() 105 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 106 .addComponent(language2) 107 .addComponent(language1) 108 .addComponent(language3, javax.swing.GroupLayout.Alignment.TRAILING))) 109 .addGroup(layout.createSequentialGroup() 110 .addGap(31, 31, 31) 111 .addComponent(title3))) 112 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) 113 .addGroup(layout.createSequentialGroup() 114 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) 115 .addComponent(finish) 116 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) 117 .addGroup(layout.createSequentialGroup() 118 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.CENTER) 119 .addGroup(layout.createSequentialGroup() 120 .addGap(48, 48, Short.MAX_VALUE) 121 .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 120, javax.swing.GroupLayout.PREFERRED_SIZE) 122 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) 123 .addGroup(javax.swing.GroupLayout.Alignment.CENTER, layout.createSequentialGroup() 124 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) 125 .addComponent(title4) 126 127 .addGap(36, 36, 36))) 128 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.CENTER) 129 .addComponent(title5) 130 .addComponent(userAnswer, javax.swing.GroupLayout.PREFERRED_SIZE, 47, javax.swing.GroupLayout.PREFERRED_SIZE)) 131 .addGap(25, 25, 25))) 132 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.CENTER) 133 .addComponent(title6) 134 .addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, 197, javax.swing.GroupLayout.PREFERRED_SIZE)) 135 .addGap(25, 25, 25)) 136 .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() 137 .addContainerGap() 138 .addComponent(resultprintf, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) 139 .addContainerGap()) 140 .addGroup(layout.createSequentialGroup() 141 .addGap(61, 61, 61) 142 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.CENTER) 143 .addComponent(title1, javax.swing.GroupLayout.PREFERRED_SIZE, 269, javax.swing.GroupLayout.PREFERRED_SIZE) 144 .addGroup(layout.createSequentialGroup() 145 .addComponent(title2, javax.swing.GroupLayout.PREFERRED_SIZE, 160, javax.swing.GroupLayout.PREFERRED_SIZE) 146 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) 147 // .addComponent(title7, javax.swing.GroupLayout.PREFERRED_SIZE, 180, javax.swing.GroupLayout.PREFERRED_SIZE) 148 // .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) 149 .addComponent(enter1, javax.swing.GroupLayout.PREFERRED_SIZE, 54, javax.swing.GroupLayout.PREFERRED_SIZE) 150 .addGap(28, 28, 28) 151 .addComponent(start, javax.swing.GroupLayout.PREFERRED_SIZE, 59, javax.swing.GroupLayout.PREFERRED_SIZE))) 152 .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) 153 ); 154 layout.setVerticalGroup( 155 layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 156 .addGroup(layout.createSequentialGroup() 157 .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) 158 .addComponent(title1) 159 .addGap(18, 18, 18) 160 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.CENTER) 161 .addComponent(start) 162 .addComponent(enter1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) 163 .addComponent(title2, javax.swing.GroupLayout.PREFERRED_SIZE, 53, javax.swing.GroupLayout.PREFERRED_SIZE)) 164 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 18, Short.MAX_VALUE) 165 .addComponent(resultprintf, javax.swing.GroupLayout.PREFERRED_SIZE, 89, javax.swing.GroupLayout.PREFERRED_SIZE) 166 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 167 .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() 168 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 77, Short.MAX_VALUE) 169 .addComponent(title3) 170 .addGap(18, 18, 18) 171 .addComponent(language1) 172 .addGap(38, 38, 38) 173 .addComponent(language2) 174 .addGap(48, 48, 48) 175 .addComponent(language3) 176 .addGap(58, 58, 58)) 177 .addGroup(layout.createSequentialGroup() 178 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) 179 .addComponent(title5) 180 .addComponent(title4) 181 .addComponent(title6)) 182 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) 183 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.CENTER, true) 184 .addComponent(jScrollPane2, javax.swing.GroupLayout.DEFAULT_SIZE, 300, Short.MAX_VALUE) 185 .addComponent(jScrollPane1) 186 .addComponent(userAnswer)) 187 .addGap(50, 50, 50) 188 .addComponent(finish) 189 .addGap(0, 0, Short.MAX_VALUE)))) 190 ); 191 pack(); 192 }// </editor-fold>//GEN-END:initComponents
语言设置:
private void language1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_language1ActionPerformed // TODO add your handling code here: language = 1; title1.setText("四则运算"); //title1.setText("WELCOM TO USE THE SYSTEM"); title2.setText("请输入出题数目:"); title7.setText("输入范围:"); title3.setText("语言"); title4.setText("问题:"); title5.setText("请输入答案:"); title6.setText("正确答案!:"); start.setText("出题"); finish.setText("结束"); }//GEN-LAST:event_language1ActionPerformed private void language2ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_language2ActionPerformed // TODO add your handling code here: language = 2; title1.setText("四則運算"); title2.setText("請輸入四則算式的數量:"); title3.setText("語言"); title4.setText("問題:"); title5.setText("請輸入答案:"); title6.setText("正確答案!:"); start.setText("出題"); finish.setText("結束"); }//GEN-LAST:event_language2ActionPerformed private void language3ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_language3ActionPerformed // TODO add your handling code here: language = 3; title1.setText("Arithmetic"); title2.setText("enter number:"); title3.setText("language"); title4.setText("problem display:"); title5.setText("Enter answer:"); title6.setText("proofreader:"); start.setText("enter"); finish.setText("end"); }//GEN-LAST:event_language3ActionPerformed
正确率与时间计算:
1 try { 2 to = simpleFormat.parse(toDate).getTime(); 3 } catch (ParseException ex) { 4 Logger.getLogger(CalMachineSwingBuild.class.getName()).log(Level.SEVERE, null, ex); 5 } 6 System.out.println((float) ((to - from) / (1000 * 60 * 60))); 7 if (language == 1) { 8 resultprintf.setText("答对" + correct + "题,正确率:" + (float) correct / (correct + fault) * 100 + "%,花费时间:" + (int) ((to - from) / (1000)) + "秒"); 9 } else if (language == 2) { 10 resultprintf.setText("答對" + correct + "題,正確率:" + (float) correct / (correct + fault) * 100 + "%,花費時間:" + (int) ((to - from) / (1000)) + "秒"); 11 } else if (language == 3) { 12 resultprintf.setText("Answer correct " + correct + "questions, correct rate:" + (float) correct / (correct + fault) * 100 + "%,Spend time:" + (int) ((to - from) / (1000)) + "s"); 13 }
是否正确判断:
1 private void finishActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_finishActionPerformed 2 // TODO add your handling code here: 3 rightanswer.setText(""); 4 int correct = 0; 5 int fault = 0; 6 String[] anslist = enter2.getText().split("\n"); 7 for (int i = 0; i < Answer.size(); i++) { 8 if (Answer.get(i).equals(anslist[i])) { 9 correct++; 10 rightanswer.append( "正确!答案是:"+Answer.get(i)+"\n"); 11 } else { 12 13 rightanswer.append( " 错误!正确答案是:"+Answer.get(i)+"\n"); 14 fault++; 15 16 } 17 }
九.界面模块与计算模块的对接。
在两模块对接部分,通过获取参数并调用的方式进行。
出题界面
结果界面
十.结对过程描述。
对于此次结对项目,我们在互相进步在完成。由于时间之间不好协调,因此我们共同作业的部分不多,前后台我们没有很细致的分工。在一起作业的过程中,感觉不再是孤军奋战。在两个人思维碰撞中,共同努力完成此次作业。
十一,结对项目优缺点。
结对项目的优缺点:
1. 程中遇到困难时双方可以互相鼓励,这要比一个人闷头苦想好的多
2. 相监督,避免了在做项目过程中有惰性
3. 替写代码,既减少了产生的bug,两个人又不会很累,效率有所提高
4. 彼此的团队协作和沟通交流的能力
结对项目的缺点:
5. 偶尔会出现分歧,会让效率下降
6. 问题,我们两个人都有各自的时间课程安排,彼此进度不一致,两个人可以一起做项目的时间不多
赵瑞雪的优点:比较有耐心,曾过项目经验识,能出一些新颖的点子
合作过程中积极向上+乐观
赵瑞雪的缺点:我的选修课比较多,时间分配上更多是需要对方来配合我的时间
王怡镔的优点:性格温和,做事踏实,善于合作,在写代码的过程中特别细心
王怡镔的缺点:Java语言基础不是特别好
十二,项目总结与改进。
很高兴此次能和大雪一起完成作业。在这次结对作业中,使我感受的结对编程的力量,也感受到个人的不足。对于有的方面考虑不完善,在同学的指正下得到改进。感受到结对编程促进我们共同进步。对于结对编程,首先就是工作效率得到了提高,有个人在旁边和你一起工作的时候,就比较不容易跑神儿去做跟工作无关的事情了,而且两个人一起思考问题也会更加全面,一起的讨论,可以扩充一个人的思路。但是可能还是彼此需要磨合的关系,在思路上可能不那么一致,还要讨论双方的思路,难免会多花一些时间,不过,这也有助于我们找到更好的解决方案。写代码是一个枯燥的过程,能和同伴一起交流,一同解决问题是一件挺好的事。