项目 | 内容 |
---|---|
作业所属课程 | 西北师范大学软件工程 |
作业的要求 | 实验四软件工程结对项目 |
课程学习目标 | 熟悉软件开发整体流程,提升自身能力 |
本次作业的意义 | 第一次体验一个完整的工程 |
任务1.结对准备工作
- 点评博客(点评链接),点评内容如下:
你的博文结构整体思路很清晰,博文内容简单明了,博文结构中的整体思路和PSP中“任务内容”列的思路一致。从需求分析到测试总结,每个环节都用文字或者图标的形式给出了整个项目较为完整的思路。通过分析你的PSP,在PSP中“计划共完成需要的时间”与“实际完成需要的时间”还是有一定的差距。在生成文档等这样的任务中实际花费的时间就比计划花费的时间少,这说明你在编写文档的方面还是很有优势的,而在编码这样的任务中实际和计划的时间就相差有点大,这说明你的编码能力还有待提高。
你的代码结构清楚,在实现题目要求的功能时有一个欠缺的地方是:当你输入一个该文本中没有的单词时,系统不会有任何提示而是继续显示菜单栏进行功能选择。除此之外,我发现我们在柱状图的实现上都有一定欠缺,我相信经过我们的结对合作一定可以改进这个问题的!
- 点评心得:
在结对之前通过阅读对方的博客内容以及运行对方项目的代码可以学习到很多东西。可以学习对方好的优秀的编码习惯,可以提升自身的编码能力。
任务2.结对项目仓库地址
点击这里!
任务3.结对项目实施过程
3.1需求分析
a.实验二的功能
b.完善实验2中的统计图功能
c.统计该文本行数及字符数
d.各种统计功能均提供计时功能,显示程序统计所消耗时间(单位:ms)
e.可处理任意用户导入的任意英文文本
f.人机交互界面要求GUI界面
g.统计文本中除冠词、代词、介词之外的高频词
h.统计前10个两个单词组成的词组频率
3.2软件设计
3.3核心功能代码展示
a.统计图功能
public void paint(Graphics g)
{
int Width = getWidth();
int Height = getHeight();
int leftMargin = 20;//柱形图左边界
int topMargin = 50;//柱形图上边界
Graphics2D g2 = (Graphics2D) g;
int ruler = Height-topMargin;
int rulerStep = ruler/20;//将当前的高度平分为20个单位
g2.setColor(Color.PINK);//绘制白色背景
g2.fillRect(0, 0, Width, Height);//绘制矩形图
g2.setColor(Color.BLACK);
g.setColor(Color.gray);
for(int i=0;i<=100;i+=5){//绘制灰色横线
g2.drawLine(5, topMargin+rulerStep*i, Width, topMargin+rulerStep*i);//绘制灰色横线
}
for(int i=0;i<rulerStep;i++){
g2.drawString((35000-2000*i)+"个", 8, topMargin+rulerStep*i);//绘制Y轴上的数据
}
g2.setColor(Color.black);
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++;
}
}
b.统计文本行数及字符数功能
lineWordCount.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent event)
{
if (event.getSource()==lineWordCount)
{
try
{
FileName(map);
}
catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
JOptionPane.showMessageDialog(null,"Lines:"+rowNumber+"\n"+"WordsNumber:"+wordNumber+"\n"+"Time:"+time+"ms","Result",JOptionPane.INFORMATION_MESSAGE);
}
}
});
c.按字典顺序排列
/**按字典顺序排序*/
void Sort(Map<String, Integer> map)
{
Set<Entry<String,Integer>> m= map.entrySet();
LinkedList<Entry<String, Integer>> List = new LinkedList<Entry<String,Integer>>(m);
Collections.sort(List, new Comparator<Entry<String,Integer>>()
{
public int compare(Entry<String, Integer> a, Entry<String, Integer> b)
{
return a.getKey().compareTo(b.getKey());
}
});
for (Entry<String,Integer> entry: List)
{
Map.put(entry.getKey(), entry.getValue());
}
}
3.4程序运行
a.可视界面测试截图
b.实验2功能测试截图
输出前N个高频词
统计高频词
将结果写入文件
c.统计图测试截图
统计高频词
d.统计文本行数及字符数测试截图
3.5结对讨论过程
在开始结对编程项目之前,我们先一起学习了何为结对编程,以便双方能够在此次结对项目中把握好自己的角色。在这之后,我们阅读了对方的代码,并对对方的编码习惯和编码能力进行了一定的了解。经过双方讨论,我们约定了一定的代码规范。结合我们自身的编码能力,我们对PSP的计划部分进行了认真的规划,但在实施过程中,我们解决问题的办法是一起讨论解决办法,并对某一功能分别担任设计、编码和测试和复审的角色。在这次结对项目的合作中我体会到了合作沟通的重要性,双方对于问题的解决要进行及时有效的沟通便能事半功倍!
3.6展示PSP
psp | 任务内容 | 计划共完成需要的时间(min) | 实际完成需要的时间(min) |
---|---|---|---|
Planning | 计划 | 20 | 15 |
Estimate | 估计这个任务需要多少时间,并规划大致工作步骤 | 20 | 20 |
Development | 开发 | 200 | 230 |
Analysis | 需求分析 | 15 | 10 |
Design Spec | 生成设计文档 | 30 | 25 |
Design Review | 设计复审 | 10 | 10 |
Coding Standard | 代码规范 | 20 | 15 |
Design | 具体设计 | 20 | 15 |
Coding | 具体编码 | 150 | 200 |
Code Review | 代码复审 | 20 | 15 |
Test | 测试 | 10 | 15 |
Reporting | 报告 | 30 | 25 |
Size Measurement | 计算工作量 | 5 | 3 |
Postmortem & Process Improvement Plan | 事后总结 ,并提出过程改进计划 | 10 | 1 |