一、课程名称:
2016级计算机科学与工程学院软件工程(西北师范大学)
二、课程要求:
实验四 软件工程结对项目
三、实验内容:
任务1:点评队友博客,并给出所点评作业的博客、github链接地址,点评内容和点评心得
(1)点评作业地址:(https://www.cnblogs.com/zhoulin52/p/10535111.html)
(2)github链接地址:https://github.com/zhaoyanxia2016/zhoulin
(3)点评内容:
1)你的博文结构安排的比较好,博文内容也写的很好,在PSP中你在开发和具体编码时花费了较多的时间,我个人觉得一方面是因为你对软件开发不太了解,具体操作不太熟悉,另一方面有可能是因为对Java有些遗忘,以至于在编码时花费了较多的时间,在实现某些功能时忘记了一些控件的操作,比如在柱状图的显示方面,我们都做的不太好,Java里本身就有画图功能,这个我们都忘记使用了,希望下次作业我们都可以更好的改进。
2)你在编写代码时,将功能类和测试类分开这个做法很好,但是如果可以将每一个功能都分为一个类,这样在今后扩展功能时我觉得会比较方便。其次就是我们都应该在人机交互方面做相应的改进。以上就是我的建议,希望在之后的结对项目中我们可以做的更好。
(4)点评心得:
通过对我队友博文的阅读和点评,我了解到了自己的不足,看到了她做的好的地方,比如:她在编写代码时,将功能类和测试类分开编写,而我在编写代码之初是写在一个类里面的,后来才改正过来的;并且她的博文内容非常符合作业要求,设计实现模块也做得很好,这对我来说还是很欠缺的,所以在今后的学习中我要多向她学习。
任务2:给出结对项目源码在Github的仓库主页链接地址,并编写博客文档
(一)需求分析
根据实验四 软件工程结对项目的要求,本次项目采用两人合作方式,设计开发一个英文文本统计分析软件,其基本功能要求如下:
(1)实现 实验2要求的功能;
(2)单词频数可视化柱状图要求是以下样式:
(3)统计该文本行数及字符数;
(4)各种统计功能均提供计时功能,显示程序统计所消耗时间(单位:ms);
(5)可处理任意用户导入的任意英文文本;
(6)人机交互界面要求GUI界面(WEB页面、APP页面都可);
(7)附加分功能:统计文本中除冠词、代词、介词之外的高频词;
(8)附加分功能:统计前10个两个单词组成的词组频率。
(二)功能设计
1.读写文件功能:对文件进行读取和存放,这是英文文本统计分析软件的基本功能;
2.用户输入功能:用户可以输入想要查询的单词或文本,来查询单词或文本的个数以及想进行何种操作;
3.统计功能:用户可以统计文本行数及字符数,还可以统计文本中除冠词、代词、介词之外的高频词;
4.排序功能:降序排序和按字典顺序排序;
5.显示功能:显示单词频数可视化柱状图,显示文本行数及字符数,显示文本中除冠词、代词、介词之外的高频词;
6.计时功能:显示程序统计所消耗时间;
7.人机交互功能:可以用 GUI界面实现人机交互功能。
(三)设计实现
- 1.本次结对项目有五个类:
(1)Main.java:初始化登陆界面,从指定文件读入单词并统计词频,在该界面用户可以点击按钮进行以下操作:查看前N个高频词、查询指定单词词频、执行词频写入文件、查看文本行数和单词数;
(2)HighFrequencyWords.java:这个类实现了显示文本中除冠词、代词、介词之外的高频词,以及执行该操作所需的时间的功能;
(3)PrintToFile.java:这个类实现了文本按字典顺序输出到result.txt文件,以及执行该操作所需的时间的功能。在该类中先按字典顺序排序,再写入result.txt文件;
(4)WordCountStatistics.java:这个类实现了统计指定单词词频的功能,以及执行该操作所需的时间的功能。在该类中先初始化统计指定单词词频界面,再查询并显示指定单词词频;
(5)HighFrequencyWords.java:这个类实现了绘制柱形图的功能;
-
2.数据结构:
本次结对项目采用TreeMap存储从文本读入的数据,用LinkedList进行词频排序,用字符数组String进行文本中冠词、代词、介词的存储。 -
3.程序流程图:
(四)测试运行
-
登陆界面的显示:
-
前k个单词词频及单词的显示:
-
统计指定单词的词频及柱状图的显示:
-
词频写入文件的显示:
-
行数单词数的显示:
(五)优秀代码片段
显示文本中除冠词、代词、介词之外的高频词,以及执行该操作所需的时间部分的代码
inputButton.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent event)
{
if (event.getSource()==inputButton)
{
long start = System.currentTimeMillis();
String n=number2.getText();
int wordNum=Integer.parseInt(n);
String print = "";
if (!n.isEmpty())
{
String str = "above, over,in,of,at,on,behind,during,from,into, onto,inside,outside,to,without,"
+ "throughout,out,she,he,its,we,them,your,i,you,my,myeself,a,an,the";
String s[] = str.split(",");
ArrayList<Map.Entry<String, Integer>> list = new ArrayList<Map.Entry<String, Integer>>(maps.entrySet());
//按词频排序
Collections.sort(list, new Comparator<Map.Entry<String, Integer>>()
{
public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2)
{
return o2.getValue() - o1.getValue();
}
});
int j=0;
int i=0;
while (j<wordNum)
{
boolean flag = true ;
String tmpString = list.get(i).getKey();
for (String string : s)
{
if(tmpString.equals(string))
{
flag = false;
}
}
if(flag)
{
print += list.get(i).getKey()+ ": " +list.get(i).getValue()+" ";
j++;
}
i++;
}
JOptionPane.showConfirmDialog(null,print+"
"+"所用时间:"+(System.currentTimeMillis() - start)+"ms","结果",JOptionPane.DEFAULT_OPTION);
}
}
else
{
JOptionPane.showConfirmDialog(null, "请输入要查询的信息!","提示",JOptionPane.DEFAULT_OPTION);
}
}
});
绘制柱状图部分的代码
public void paint(Graphics g)
{
int Width = getWidth();
int Height = getHeight();
int leftMargin = 50;//柱形图左边界
int topMargin = 50;//柱形图上边界
Graphics2D g2 = (Graphics2D) g;
int ruler = Height-topMargin;
int rulerStep = ruler/20;//将当前的高度平分为20个单位
g2.setColor(Color.WHITE);//绘制白色背景
g2.fillRect(0, 0, Width, Height);//绘制矩形图
g2.setColor(Color.LIGHT_GRAY);
for(int i=0;i<rulerStep;i++){
g2.drawString((30000-1500*i)+"个", 8, topMargin+rulerStep*i);//绘制Y轴上的数据
}
g2.setColor(Color.PINK);
int m=0;
for (Entry<String, Integer> entry : map.entrySet())
{
int value =entry.getValue();
int step = (m+1)*40;//设置每隔柱形图的水平间隔为40
g2.fillRoundRect(leftMargin+step*2,Height-value/50-5, 40, value, 40, 10);//绘制每个柱状条
g2.drawString(entry.getKey(), leftMargin+step*2, Height-value/50-5); //标识每个柱状条
m++;
}
}
(六)结对过程的描述
1、在做本次结对项目时,我和队友首先根据老师给出的代码规范参考资料确定了本次项目的代码规范,比如基本的缩进、命名和注释的规范,阅读了对方的代码,按照制定的规范对对方的代码进行了改进。
2、接下来我们俩一起对本次实验进行了需求分析,明确了在本次结对项目中我们需要在上一次的基础之上再完成的功能有:统计该文本行数及字符数、提供计时功能、可处理任意用户导入的任意英文文本、实现人机交互界面、统计文本中除冠词、代词、介词之外的高频词。确定了项目的基本框架,项目该如何开展和大体的用时时间,按照该计划我们填写了粗略的PSP表;
3、然后我们开始着手编程。首先我们进行了分工,我做柱状图的统计和附加功能一,我队友做行数及字符数的统计 、计时功能和处理任意用户导入的任意英文文本的部分。所以在本次结对项目中,我们创建了五个类:Main.java:初始化登陆界面;HighFrequencyWords.java:显示文本中除冠词、代词、介词之外的高频词,以及执行该操作所需的时间;PrintToFile.java:按字典顺序输出到result.txt文件,以及执行该操作所需的时间;WordCountStatistics.java:统计指定单词词频,以及执行该操作所需的时间;HighFrequencyWords.java:绘制柱形图;
4、整个项目完成后,我们两人共同根据代码规范进行复审,对多余的语句进行简化;
5、最后我们根据完成该项目实际情况填写PSP实际所用时间;
6、撰写报告文档。
在做本次结对项目时,我和队友的想法既有相同的时候,但同时也有碰撞的时候,在这个时候我们通常是采用谁对就听谁的策略。通过这次结对项目,我了解到团队合作的重要性,以及在团队合作时我们应该注意的诸多事项,知道了在做一个团队项目时,双方交流、沟通的重要性,双方合作的重要性。
(七)PSP
任务内容 | 计划完成时间(min) | 实际完成时间(min) |
---|---|---|
计划 | 10 | 7 |
规划工作步骤 | 10 | 7 |
开发 | 255 | 264 |
需求分析 | 10 | 9 |
生成文档 | 5 | 10 |
设计复审 | 15 | 10 |
代码规范 | 20 | 15 |
具体编码 | 180 | 200 |
代码复审 | 15 | 10 |
测试 | 10 | 10 |
报告 | 15 | 12 |
测试报告 | 5 | 7 |
计算报告量 | 5 | 2 |
事后总结 | 5 | 3 |
**(八)项目总结 **
从上表中可以看出,在开发和具体代码的编写时,我们花费了较多的时间,一方面有可能是因为这是我们第一次做结对项目,还不太熟悉,另一方面有可能是因为我们对于有些功能的实现方面有困难:比如在绘制柱状图来进行单词的统计,用GUI界面实现人机交互,以及完成附加功能一中的统计文本中除冠词、代词、介词之外的高频词等,所以在开发和具体代码的编写时我们花费了较多的时间。尽管在完成这些部分时我们都做的非常吃力,但是最终我们还是做出了结果。在这次结对项目中,我是真的认识到了自己在编程方面的不足,在今后的学习中要更加努力才行。
点击源码,查看全部代码!