结对项目--wordCount
结对作业:
成员:201631062115(partner),201631062613(me)
代码地址:https://gitee.com/ackary/WordCount
作业的链接地址:https://edu.cnblogs.com/campus/xnsy/2018Systemanalysisanddesign/homework/2188
partner的博客:https://www.cnblogs.com/ackary/p/9803601.html
PSP表格:
PSP2.1 |
PSP阶段 |
预估耗时 (分钟) |
实际耗时 (分钟) |
Planning |
计划 |
80 |
100 |
· Estimate |
· 估计这个任务需要多少时间 |
80 |
100 |
Development |
开发 |
1290 |
1910 |
· Analysis |
· 需求分析 (包括学习新技术) |
100 |
200 |
· Design Spec |
· 生成设计文档 |
60 |
80 |
· Design Review |
· 设计复审 (和同事审核设计文档) |
80 |
100 |
· Coding Standard |
· 代码规范 (为目前的开发制定合适的规范) |
60 |
60 |
· Design |
· 具体设计 |
50 |
60 |
· Coding |
· 具体编码 |
600 |
1000 |
· Code Review |
· 代码复审 |
100 |
150 |
· Test |
· 测试(自我测试,修改代码,提交修改) |
240 |
260 |
Reporting |
报告 |
300 |
530 |
· Test Report |
· 测试报告 |
80 |
150 |
· Size Measurement |
· 计算工作量 |
100 |
180 |
· Postmortem & Process Improvement Plan |
· 事后总结, 并提出过程改进计划 |
120 |
200 |
|
合计 |
1670 |
2540 |
代码互审情况:
在开发过程中,HalfofHeart 同学主要负责的是函数功能编写,F丶Y同学负责的是图形化界面的扩展和测试代码的编写。
F丶Y:对于HalfofHeart 同学,代码写的逻辑清晰,读起来易懂,就是注释有点少了,希望多写点注释。解析命令和实现统计单个文件和遍历文件的代码全在主函数中,这样显得主函数过于臃肿,建议将解析命令的部分抽离出去。
HalfofHeart:对于F丶Y同学,你的测试代码写的一般,感觉是不是应该用Assert来测试啊,这样测试比较正规!
设计过程:
由于我们之前已经实现了基础功能和拓展功能(详情参考HalfofHeart 同学的博客https://www.cnblogs.com/ackary/p/9697199.html),因此我们将这部分的代码按照一定规范整合后,再编写对应的高级功能。高级功能的实现就非常的简单了,只需要建好相应的UI界面,之后调用整合编写好的代码实现对应的计数,然后将结果显示在界面上的TextArea里面即可。
大致流程如下:
关键代码:
UI界面:
界面布局的关键代码:
final JFrame f = new JFrame("WordCount");
f.setLayout(null);
final JFileChooser fc = new JFileChooser();
JButton bOpenDir = new JButton("打开文件或文件夹");
bOpenDir.setContentAreaFilled(false);
JButton bWriteFile=new JButton("将结果写入文件");
bWriteFile.setContentAreaFilled(false);
JCheckBox cb=new JCheckBox("选用停用词表stopList");
bOpenDir.setBounds(42,15,140,30);
bWriteFile.setBounds(190,15,140,30);
cb.setBounds(390,10,150,40);
JTextArea ja = new JTextArea();
ja.setFont(new Font("黑体",Font.BOLD,15));
ja.setEditable(false);
JScrollPane jsp=new JScrollPane(ja);
jsp.setBounds(42,50,600,400);
f.add(bOpenDir);
f.add(bWriteFile);
f.add(cb);
f.add(jsp);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setSize(700, 500);
f.setLocationRelativeTo(null);
f.setVisible(true);
重写的用于输出统计结果到UI界面的output()方法:
1 public String output(String inputFile){ 2 String output=""; 3 output=inputFile + "\r\n" + "字符个数:" + charNum + "\r\n" + "单词个数:" + wordNum + "\r\n" + "文件总行数:" + lineNum+ "\r\n" + 4 "代码行数:" + codeNum + "\r\n" + "空行行数:" + emptyNum + "\r\n" + "注释行数:" + noteNum; 5 return output; 6 }
主函数部分:
1 public class wordCount { 2 public static void main(String[] args) throws IOException { 3 outputCount WC = new outputCount(); 4 showCount sc=new showCount(); 5 String inputFile = ""; 6 String stopFile = "stopList.txt"; 7 String outputFile = "result.txt"; 8 9 for (int j = 0;j < args.length;j++) { 10 if (args[j].equals("-x")) { 11 sc.showUI(); 12 break; 13 } 14 else { 15 for (int i = 0; i < args.length; i++) { 16 if (args[i].length() > 2 && !args[i-1].equals("-o") && !args[i-1].equals("-e")) 17 inputFile = args[i]; 18 if (args[i].equals("-o")) 19 outputFile = args[i + 1]; 20 if (args[i].equals("-e")){ 21 outputCount.isStop=true; 22 if((i!=(args.length-1))&&args[i+1].endsWith(".txt")) 23 stopFile=args[i+1]; 24 } 25 } 26 boolean flag=false; 27 for(int i=0;i<args.length;i++){ 28 if(args[i].equals("-s")) 29 flag=true; 30 } 31 if(flag){ 32 for (int i = 0; i < args.length; i++) { 33 if ((args[i].indexOf("*") != -1)) { 34 outputCount.endString = args[i].substring(args[i].lastIndexOf("*") + 1, args[i].length()); 35 outputCount.getPath = args[i].substring(0, args[i].lastIndexOf("*")); 36 if (outputCount.getPath.equals("")) 37 outputCount.getPath = "."; 38 } 39 } 40 File dir = new File(outputCount.getPath);//.表示当前目录 41 List<File> files = outputCount.getFile(dir);//获取当前目录 42 for (File file : files) { 43 outputCount filesWC = new outputCount(); 44 String filePath = file.getAbsolutePath(); 45 filesWC.count(filePath, stopFile); 46 filesWC.output(args, filePath, outputFile, filesWC); 47 outputCount.lineNum=outputCount.wordNum=outputCount.charNum=outputCount.codeNum=outputCount.emptyNum=outputCount.noteNum=0; 48 } 49 } 50 else{ 51 WC.count(inputFile, stopFile); 52 WC.output(args, inputFile, outputFile, WC); 53 } 54 } 55 break; 56 } 57 } 58 }
测试过程:
新建测试模块Test:
使用Juit为每个模块编写测试代码:
测试不含停用词的输出:
代码:
1 @org.junit.Test 2 public void testOutputWithoutStopfile() { 3 try { 4 outputCount.count(inputfile,stopfile); 5 } catch (IOException e) { 6 e.printStackTrace(); 7 } 8 System.out.println("字符数:"+ outputCount.charNum); 9 System.out.println("单词数(不含停用词):"+ outputCount.wordNum); 10 System.out.println("总行数:"+ outputCount.lineNum); 11 System.out.println("代码行:"+ outputCount.codeNum); 12 System.out.println("空行:"+ outputCount.emptyNum); 13 System.out.println("注释行:"+ outputCount.noteNum); 14 }
输出结果:(符合预期)
测试包含停用词的输出:
代码:
1 @org.junit.Test 2 public void testOutputWithStopfile() { 3 outputCount.isStop=true; 4 try { 5 outputCount.count(inputfile,stopfile); 6 } catch (IOException e) { 7 e.printStackTrace(); 8 } 9 System.out.println("字符数:"+ outputCount.charNum); 10 System.out.println("单词数(含停用词):"+ outputCount.wordNum); 11 System.out.println("总行数:"+ outputCount.lineNum); 12 System.out.println("代码行:"+ outputCount.codeNum); 13 System.out.println("空行:"+ outputCount.emptyNum); 14 System.out.println("注释行:"+ outputCount.noteNum); 15 }
输出结果:(符合预期)
测试遍历文件功能:
代码:
1 @org.junit.Test 2 public void dirFile() { 3 File dir = new File(outputCount.getPath); 4 List<File> files = outputCount.getFile(dir); 5 for (File file : files) { 6 outputCount filesWC = new outputCount(); 7 String filePath = file.getAbsolutePath(); 8 try { 9 filesWC.count(filePath, stopfile); 10 } catch (IOException e) { 11 e.printStackTrace(); 12 } 13 System.out.println(filePath); 14 System.out.println("字符数:"+ outputCount.charNum); 15 System.out.println("单词数(不含停用词):"+ outputCount.wordNum); 16 System.out.println("总行数:"+ outputCount.lineNum); 17 System.out.println("代码行:"+ outputCount.codeNum); 18 System.out.println("空行:"+ outputCount.emptyNum); 19 System.out.println("注释行:"+ outputCount.noteNum); 20 outputCount.lineNum=outputCount.wordNum=outputCount.charNum=outputCount.codeNum=outputCount.emptyNum=outputCount.noteNum=0; 21 } 22 }
输出结果:(符合预期)
测试UI界面:
代码:
1 @org.junit.Test 2 public void testUI() { 3 showCount.showUI(); 4 try { 5 Thread.sleep(100000); 6 } catch (InterruptedException e) { 7 e.printStackTrace(); 8 } 9 }
结果:(符合预期)
总结:
两个人合作感觉写起来更加有效率,有问题可以及时的相互讨论,相互学习,但有时候遇到某些情况,总是争执不下来,各抒己见。但总的来说,合作写项目更加有激情,有动力,遇到问题处理起来的速度也更快。所以我们认为结对编程是一种行之有效的方法,这样的1+1是大于2的。