1.本次作业
合作者:201631062531,201631062111
码云地址:https://gitee.com/zhuyao1/workCount
作业链接地址:https://edu.cnblogs.com/campus/xnsy/2018Systemanalysisanddesign/homework/2188
2.PSP表格
PSP2.1表格
PSP2.1 |
PSP阶段 |
预估耗时 (分钟) |
实际耗时 (分钟) |
Planning |
计划 |
20 |
15 |
· Estimate |
· 估计这个任务需要多少时间 |
10 |
10 |
Development |
开发 |
300 |
360 |
· Analysis |
· 需求分析 (包括学习新技术) |
90 |
80 |
· Design Spec |
· 生成设计文档 |
10 |
20 |
· Design Review |
· 设计复审 (和同事审核设计文档) |
20 |
10 |
· Coding Standard |
· 代码规范 (为目前的开发制定合适的规范) |
15 |
15 |
· Design |
· 具体设计 |
30 |
40 |
· Coding |
· 具体编码 |
240 |
300 |
· Code Review |
· 代码复审 |
30 |
20 |
· Test |
· 测试(自我测试,修改代码,提交修改) |
30 |
20 |
Reporting |
报告 |
10 |
10 |
· Test Report |
· 测试报告 |
20 |
10 |
· Size Measurement |
· 计算工作量 |
20 |
15 |
· Postmortem & Process Improvement Plan |
· 事后总结, 并提出过程改进计划 |
30 |
30 |
|
合计 |
875 |
955 |
3.代码互省
我们一开始在做扩展功能之前我们就开始了代码互省,主要针对的是两个人之前写的基本功能的代码进行检查,基本功能的查询行数,单词数,字符数的检查,两个人因为代码的编程思想有所不同,所以在实现功能的时候也有许多不一样,还有个人的习惯,导致一些代码的可读性较差,或者复用率较高。看了代码我们,决定使用相同的编程规范,主要参考了阿里巴巴的java编程手册,对之前的代码进行修改,写之后的扩展功能时也会遵守规范。在之后的扩展功能的编程上,我们主要是互相监督和督促吧,两个人一人写一些,在遇到问题也会讨论,或者在看到他的一些不足也会指出,两个人相辅相成完成项目。
4.设计过程
功能类:
界面类:
主函数类:
测试类:
这次是第二次来完成作业,主要是在之前的基础上,添加了一些扩展功能,和高级功能,所以我会借用之前的功能类,并在其中加入自己的新的功能,主要是三个扩展功能和一个高级功能,通过主函数的调用,就可以实现对文件的各种操作。功能类中有6个函数,可供实现功能。主函数类中有三个函数,主函数,功能选择函数和结果输出函数。界面类则是在设置各种控件。
5.代码说明
主要是对扩展功能的说明:
对复杂行数的统计
public String count_moreLine(String filename) throws IOException// 返回各种行数 { int noteLine=0; // 注释行 int emptyLine=0; // 空行 int codeLine=0; // 代码行 int sumLine=0; int tag=0; // 设置标记,记录多行注释时的注释代码行数 File file=new File(filename); BufferedReader bReader=new BufferedReader(new FileReader(file)); String s; while((s=bReader.readLine())!=null){ sumLine++; if(s.isEmpty()||s.startsWith("{")&&s.endsWith("{")||s.startsWith("}")&&s.endsWith("}")){ // 对空行的判断 emptyLine++; } if(tag==0){ if(s.contains("//")){ // 判断注释符 noteLine++; }else if(s.contains("/*")){ noteLine++; tag=1; } }else { noteLine++; if(s.contains("*/")){ //判断下一行是否有下一个注释符 tag=0; } } } bReader.close(); codeLine=sumLine-emptyLine-noteLine; String result=filename+",注释行:"+noteLine+",空行数:"+emptyLine+",代码行:"+codeLine; return result; }
递归对文件的查询
public String recursiveFindFile(String filepath) throws IOException//递归 { String result=null; File file=new File(filepath); if(file.isDirectory()){ File[] files=file.listFiles(); if(files.length==0) { System.out.println("空目录"); }else{ for(File f : files) { if(f.isDirectory()) // 判断是否为目录 { recursiveFindFile(f.getPath()); }else if(f.isFile()) { // 判断是否为文件 result+="\n文件名:"+f.getPath()+"\n"+count_word(f.getPath())+ "\n"+count_line(f.getPath())+ "\n"+count_char(f.getPath())+ "\n"+count_moreLine(f.getPath()); } } } }else if(file.isFile()){ // 判断是否直接就为文件 result="文件名:"+filepath+"\n"+count_word(filepath)+ "\n"+count_line(filepath)+ "\n"+count_char(filepath)+ "\n"+count_moreLine(filepath); } return result; }
使用停词表查询
public int stopWordList(String pathname,String stopList_filepath) throws IOException { count_word(pathname); // 设置两个临时变量,strs和strs2用于对停词表里面的数据进行判断 String strs =""; String strs2=""; // 设置num用于统计文本文件和停词表中单词的数量 int num=0; // contentTxt(pathname," ")返回的是对象结果集的变量,对两个结果集进行遍历,返回及结果 for(Object ob2:contentTxt(pathname," ")) { //文本文件中的单词数据,放到strs中 strs = (String)ob2; for(Object ob: contentTxt(stopList_filepath, " ")) { // 停词表文件中的单词数据,放到strs2中 strs2 = (String)ob; // 判断两个strs是否相等,相等就统计次数 if(strs.equals(strs2)) num++; } } wordnum=wordnum-num; return wordnum; }
界面类的代码说明
public wcUI(){ JFrame jUI=new JFrame("查询工具"); JPanel jPanel =new JPanel(); jPanel.setLayout(null); jPanel.setBorder(BorderFactory.createTitledBorder("用户专属")); final JTextField showpath=new JTextField();//用于展示所查文件的路径 final JTextArea showresult=new JTextArea();//展示结果 JButton selectfile=new JButton("选择文件");//出发文件选择器 JButton select=new JButton("查询");//执行查询功能 final JTextField showstop=new JTextField();//展示停词表文件路径 JButton selectstop=new JButton("停词表");//选择停词表 ... selectfile.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub //展示文件的路径 JFileChooser jFileChooser=new JFileChooser("选择文件"); jFileChooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES ); jFileChooser.showOpenDialog(null);//显示文件选择器 if(jFileChooser.getSelectedFile().getPath()!=null) { showpath.setText(jFileChooser.getSelectedFile().getPath()); } else{ System.out.println("没有选择文件"); } } }); select.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub workCount wCount=new workCount(); //根据复选框,选择功能并执行,返回结果 try { if(command1.isSelected()){ result+="\n"+wCount.count_char(showpath.getText()); } if(command2.isSelected()){ result+="\n"+wCount.count_word(showpath.getText()); } if(command3.isSelected()){ result+="\n"+wCount.count_line(showpath.getText()); } if(command4.isSelected()){ result+="\n"+wCount.count_moreLine(showpath.getText()); } if(command5.isSelected()){ result+="\n使用停词表后,单词数为:"+wCount.stopWordList(showpath.getText(), showstop.getText()); } showresult.setText(result); } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } } }); }
6.效果展示
停词表:
访问目录,查询所有文件:
选择查询,复杂行数:
启动图形化界面:
普通查询结果:
使用停词表:
7.总结
我觉得这次的结对项目让我收获了很多,编程不是一个人的事,我们需要与人合作,结对编程就给了我们这个机会。结对不仅仅是两个人编程那么简单,这更是两个人进步的机会,两个人都有各自编程的想法,在结对的过程,另一个人更可以让一个人产生自己以前没有的编程思路,有好,有坏,但在一次次的讨论中都会有较好的解决方法,两个人相辅相成,在各自学习中完成项目。对于1+1>2?我觉得不是这么简单的,这不是翻倍的收获,更是多与翻倍的收获,对于以后的工作也十分的有帮助。
同伴链接:
https://www.cnblogs.com/zhengzhibin/p/9805504.html