合作者:201631062124,201631062423
代码地址:https://gitee.com/yryx/WordCount
作业地址:https://edu.cnblogs.com/campus/xnsy/2018Systemanalysisanddesign/homework/2188
代码互审:
关于代码互审有一点需要说明,在之前实现wordcount的基本功能时我使用的是c++语言实现,而周欣则是使用的是java语言实现,所以在进行结对项目的时候我们商量了关于使用那种语言实现接下来的功能,最后我们确定使用java语言进行接下来的功能实现,所以在后面的实现过程中周欣主要负责实现代码,我则是在一旁进行相关的帮助,包括代码问题的解决,功能实现问题的解决以及代码测试。不过在开始扩展功能的实现之前我们还是对周欣之前实现的基本功能的代码进行了简单的审查。
代码审查 | 相关问题 | 想法和解决方案 |
代码的编码格式,语法,逻辑等相关部分 | 编码格式是否符合规范,语法是否正确,代码逻辑是否正确, | 根据代码规范来检查完成的所有代码是否存在问题 |
程序的整体结构,包括类之间的关系 | 类的定义是否符合规范,整体结构是否紧凑完整 | 在进行类的定义之前先参考代码规范和程序流程图 |
文件处理部分的处理 | 由于文件的访问存在资源的使用,是否有资源泄漏的问题 | 对所有涉及了文件访问的地方重点检查资源的开闭,是否有资源泄漏的问题 |
结对psp表格:
PSP阶段 | 预计耗时(分钟) | 实际耗时(分钟) |
计划 | 10 | 10 |
.估计任务所需时间 | 10 | 10 |
开发 | 475 | 553 |
.需求分析 | 5 | 5 |
.生成设计文档 | 10 | 17 |
.设计复审 | 10 | 14 |
.代码规范 | 30 | 46 |
.具体设计 | 60 | 42 |
.具体编码 | 180 | 248 |
.代码复审 | 90 | 66 |
.测试 | 90 | 115 |
报告 | 50 | 59 |
.测试报告 | 10 | 13 |
.计算工作量 | 10 | 10 |
.事后总结 | 30 | 36 |
合计 | 535 | 622 |
设计过程:
整个程序一共设计了三个类,分别为test,FileChooser,Execute-Char,其中test类作为主函数所在类,负责整个程序的启动和运行,其中的逻辑负责分析输入的命令,然后再根据命令调用另外两个类中的方法实现对应的功能。FileChooser类中定义了三个方法:rePath(),用于返回输入的文件路径;FileChooser()为该类的构造方法,用于绘制进行文件选择的窗口;actionPerformed(ActionEvent e),用于进行文件的选择。该类的作用就是绘制一个窗口实现文件的选择,然后给出查询结果。Execute-Char类就是所有功能实现的类,其中定义了9个方法,实现了查询总字符数,总单词数,总行数,某个单词出现次数,读取文件,读取总的空行,代码行和注释行,停词表。这些具体的实现方法会在test类中得到调用,从而实现相应功能。
代码说明:
FileChooser类中实现文件选择的代码:
//定义一个文件选择类,用于实现窗口文件选择 public class FileChooser extends JFrame implements ActionListener{ JButton open=null; String path; //绘制文件选择框 public FileChooser(){ open=new JButton("open"); this.add(open); this.setBounds(400, 200, 100, 100); this.setVisible(true); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); open.addActionListener(this); } @Override //重写actionPerformed()方法,用于实现文件选择 public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub JFileChooser jfc=new JFileChooser(); jfc.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES ); jfc.showDialog(new JLabel(), "选择"); File file=jfc.getSelectedFile(); path=file.getAbsolutePath(); } //返回文件路径 public String rePath() { return path; } }
查询代码行,空行,注释行:
try { BufferedReader bufferedReader = new BufferedReader(new FileReader( file)); String coun = null; while ((coun = bufferedReader.readLine()) != null) { line++; if (coun.trim().length() == 0 || coun.trim().length() == 1) { nuline++; } else { for (int i = 0; i < coun.length() - 2; i++) { temp = coun.substring(i, i + 1); if (temp.equals("/") && coun.substring(i + 1, i + 2).equals("/")) { annoline++; } } } } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } codeline = line - nuline - annoline; System.out.println("代码行:" + codeline + " " + "空行:" + nuline + " " + "注释行:" + annoline);
停词表:
int ReStopList(File file) { String str = null; int stopword = 0; int k = 0; String reg1 = "\s+|,+"; try { BufferedReader bufferedReader = new BufferedReader(new FileReader( file)); while ((str = bufferedReader.readLine()) != null) { String strc[] = str.split(reg1); for (String s : strc) { k = count_word(s); stopword += k; } } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } return stopword; }
由于在上一次的博客中已经实现了查询总字符数,单词数,总行数,所以在这里就不再展示代码,具体的可以参考:https://www.cnblogs.com/zhouxin523/p/9733271.html。
总结与感受:
关于结对编程开发:以前进行程序开发的时候要么是自己进行程序开发,要么都是组成了多人的团队进行程序开发,从来没有体会过两人进行结对编程,在这次课程中得以体会了一次结对编程,首先来说结对编程有一点好处就是多了一双眼看代码,多了一个脑子想问题,多了张嘴讲建议,所以在进行编程的时候可以注意到许多一个人进行编程时发现不了的问题,并且两个人都在对一个问题进行思考,使得解决问题的思路得到了更多的拓展,并且在交流的过程中还会产生新的想法, 我觉得这是很棒的。其次,在代码完成速度上感觉也有了明显的不同,在进行编程之前如果进行了明确分工,在合理的代码规范前提下两人分工完成各自的任务,使得完成的时间得到了很大程度的减少,并且代码完成的质量在合成一份程序之后就可以得到验证,而不必反复在编程的各个阶段进行代码测试,减少了很多时间的浪费。
关于在构建之法的一些体会:在构建之法这本书中我感觉自己确实是学到了很多知识,首先是系统的软件工程的知识,在接触这本书之前虽然已经学习了不少软件工程的相关知识,但是一种感觉都是零散的,独立的知识片段,但是在学习了构建之法后感觉这些知识都到了一定程度的整合,慢慢开始形成一个整体,并且感觉脑子里的思路也清晰起来。然后构建之法中在每一章的结尾都给出了大量的知识链接,这些知识链接可以丰富我的阅读,拓宽视野,并且加深我自己对于课堂知识的理解, 对于我来说是起到了极大的帮助的,我相信就算在这门课结束之后我还是会经常把这本书拿出来阅读,感觉还可以收获更多的东西。