项目 | 内容 |
---|---|
课程名称 | 2016级计算机科学与工程学院软件工程(西北师范大学) |
作业要求 | 实验四 软件工程结对项目 |
课程学习目标 | 熟悉软件开发整体流程,提升自身能力 |
具体方面的帮助 | 第一次体验一个完整的工程 |
###任务一 两两自由结对,对结对方的《实验二 软件工程个人项目》的项目成果进行评价
项目 | 内容 |
---|---|
点评博客 | 201671030126 赵佳平词频统计软件项目报告 |
Github | github地址 |
点评内容 | 博文结构整体很清楚,很简洁。对需求分析做了认真分析,基本完成了各项功能。但在博文排版上有所不足,表格和代码部分尽量不要使用截图;另外可以把所实现功能的截图尽可能详细的写到博文中。在具体代码方面,希望可以把不同的类分开,不要都写在一个java文件里面,这样可以使代码结构更加清晰。希望博主可以不断完善,继续努力。 |
点评心得 | 通过阅读结对方的代码,首先感觉到的是我们两个代码风格有很大的不同。其次在思考和解决问题的方法上也有很大的差别。了解了对方的编码习惯,为任务二的开展奠定了一些基础。当然通过阅读也注意的到自己在编码时需要进一步改进的问题。在接下来的结对编程中,会充分听取对方的意见,共同讨论完成本次项目 |
###任务二 采用两人合作方式,设计开发一个英文文本统计分析软件
-
a.需求分析
(1)实验2要求的功能; (2)单词频数可视化柱状图; (3)统计该文本行数及字符数; (4)各种统计功能均提供计时功能,显示程序统计所消耗时间(单位:ms); (5)可处理任意用户导入的任意英文文本; (6)人机交互界面要求GUI界面(WEB页面、APP页面都可); (7)附加分功能:统计文本中除冠词、代词、介词之外的高频词;
-
b.软件设计
- 类图
<img src="https://img2018.cnblogs.com/blog/1616079/201904/1616079-20190403020817412-2035858442.png" width = "500" height = "360">
(1) 本次项目主要有三部分构成,登录界面(login)、主界面、主类(Main)。 (2) 高频词的统计在Highword.java中实现,指定单词词频和柱状图在chart.java中实现,其余功能在function.java实现。 (3) 计时功能主要是利用函数System.currentTimeMillis()实现。
-
c.核心功能代码展示
- 单词频数可视化柱状图部分,主要采用外部包jcommon-1.0.23.jar,jfreechart-1.0.19.jar实现。另参考这篇博文完成
JFreeChart chart = ChartFactory.createBarChart( "指定单词的词频柱状图", //标题 "", //x轴名称 "", //y轴名称 dataset,//数据集 PlotOrientation.VERTICAL,//使用垂直柱状图 true,//是否使用legend false,//是否使用tooltip false); //是否使用url Font kfont = new Font("宋体", Font.PLAIN, 20); // 底部 Font titleFont = new Font("宋体", Font.BOLD, 25); // 图片标题 // 图片标题 chart.setTitle(new TextTitle(chart.getTitle().getText(), titleFont)); // 底部 chart.getLegend().setItemFont(kfont); ChartFrame cf = new ChartFrame("词频显示", chart); cf.pack(); cf.setVisible(true);
- 行数和字符数统计。该部分主要是在读入文件的时候进行统计。
while((temp = br.readLine())!=null) { stmplength1+=temp.length();//字符数 String[] str = temp.split("([^a-zA-Z])"); //过滤出只含有字母的 stmplength++;//行数 for(int i=0;i<str.length;i++) { String word = str[i].trim(); if(word.length()!=0) //去除长度为0的行 staff.put(word, staff.getOrDefault(word, 0)+1); } }
- 除去介词,冠词,代词的高频词汇。该部分的实现是在输出的时候与介词,冠词,代词表进行比对,然后决定是否输出。
/*该部分主要是通过flag来控制要显示的界面*/ ok.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent arg0) { // TODO Auto-generated method stub textArea.setText(""); long startTime=System.currentTimeMillis(); int k=Integer.parseInt(textField.getText().toString()); for(int i=0;i<k;i++)//10 { boolean ok=false; if(flag) //flag为true显示正常高频词界面,否则显示除去代词,冠词,介词的界面 textArea.append(function.aList.get(i).getKey()+"\t"+function.aList.get(i).getValue()+"\n"); else { for(int j=0;j<function.stop.size();j++) { if(function.aList.get(i).getKey().toLowerCase().equals(function.stop.get(j))) { k++; ok=true; break; } } if(!ok) textArea.append(function.aList.get(i).getKey()+"\t"+function.aList.get(i).getValue()+"\n"); } } long endTime=System.currentTimeMillis(); JOptionPane.showMessageDialog(null, "耗时:"+(endTime-startTime)+"ms"); } });
-
d.程序运行截图
- 登录界面:用户名(nwnu),密码(2019)
<img src="https://img2018.cnblogs.com/blog/1616079/201904/1616079-20190403005227415-239027120.png" width = "500" height = "360">
-
主界面 <img src="https://img2018.cnblogs.com/blog/1616079/201904/1616079-20190403005339418-250640631.png" width = "500" height = "360">
-
点击浏览,选择需要读入的文件,然后点击开始读入
<img src="https://img2018.cnblogs.com/blog/1616079/201904/1616079-20190403005823946-666483022.png" width = "500" height = "360"> <img src="https://img2018.cnblogs.com/blog/1616079/201904/1616079-20190403010229029-1299514048.png" width = "500" height = "360">
- 指定单词词频统计及柱状图
<img src="https://img2018.cnblogs.com/blog/1616079/201904/1616079-20190403011847194-1974509402.png" width = "500" height = "360"> <img src="https://img2018.cnblogs.com/blog/1616079/201904/1616079-20190403012001753-470062895.png" width = "500" height = "360">
-
前k个高频词统计 <img src="https://img2018.cnblogs.com/blog/1616079/201904/1616079-20190403012243923-1743857873.png" width = "500" height = "360">
-
前k个高频词统计 <img src="https://img2018.cnblogs.com/blog/1616079/201904/1616079-20190403012410532-29098887.png" width = "500" height = "360"> <img src="https://img2018.cnblogs.com/blog/1616079/201904/1616079-20190403012609776-571026367.png" width = "500" height = "160">
-
统计行数和字符数 <img src="https://img2018.cnblogs.com/blog/1616079/201904/1616079-20190403013318546-1941197430.png" width = "500" height = "360">
-
附加1:除去代词,介词,冠词的高频词 <img src="https://img2018.cnblogs.com/blog/1616079/201904/1616079-20190403013445839-1012665444.png" width = "500" height = "360">
-
e.结对的过程
- 在结对过程,我们首先提出自己对某一功能的想法,然后经过讨论决定采用其中的一种实现。采用谁的想法,谁编程。在讨论过程也可能会有新的想法出现,也会很明显的感到自己的有些想法不太好。
<img src="https://img2018.cnblogs.com/blog/1616079/201904/1616079-20190403014655539-367496585.png" width = "300" height = "260">
- ##PSP
任务内容 | 计划完成时间(min) | 实际完成时间(min) |
---|---|---|
计划 | 10 | 8 |
估计这个任务需要多长时间,并规划大致工作步骤 | 5 | 6 |
开发 | 110 | 130 |
需求分析(包括学习新技术) | 8 | 6 |
生成设计文档 | 5 | 8 |
设计复审(和同事审核设计文档) | 5 | 4 |
代码规范(为当前的开发制定合适的规范) | 4 | 3 |
具体设计 | 15 | 10 |
具体编码 | 150 | 200 |
代码复审 | 5 | 6 |
测试(自我测试、修改代码、提交修改) | 15 | 12 |
报告 | 9 | 5 |
测试报告 | 5 | 3 |
计算工作量 | 3 | 2 |
事后总结,并提出工程改进计划 | 5 | 3 |
-
##小结
通过此次项目,体会了结对编程的过程,很大的一个感受是在编码、测试以及复审时能够很容易的发现代码中的一些逻辑错误,相比一个来说编码效率比较高。另外通过这次项目也感受到了编码规范也是很重要的,当对变量随意定义,没有相应注释的时候,读代码非常的耗时。在项目中我们主要是先讨论某个功能怎么实现,充分听取对方的想法,最后用谁的想法,谁编程实现。总之,在此次项目中,彼此配合的还是很友好的,也有很大的收获。在以后的过程中也会注意在此次项目中遇到的问题,不断完善,继续努力。
来源:oschina
链接:https://my.oschina.net/u/4360005/blog/3588273