项目 | 内容 |
---|---|
课程名称 | 2016级计算机科学与工程学院软件工程(西北师范大学) |
作业要求 | 实验四 软件工程结对项目 |
课程学习目标 | 熟悉软件开发整体流程,提升自身能力 |
本次结对项目的意义 | 第一次体验一个完整的工程 |
一、任务一
两两自由结对,对结对方的《实验二 软件工程个人项目》的项目成果进行评价
1、所在班级:2016级计算机科学与工程学院软件工程(西北师范大学)
2、所评博文:201671030125+词频统计软件项目报告
3、github链接地址:github
4、点评内容:
以下是我读完这篇博文之后,自己的一些拙见。
- (1)、这篇博文整体结构布局还是很不错的,可以看出博主有对Markdown编辑器进行系统的了解和学习,但在一些细节方面还需要进一步完善。比如,我个人认为各个模
块之间的空行有点多,可以考虑只空出一行即可。 - (2)、显示词频和柱状图时,感觉柱状图有点取巧,虽然用符号的个数表示柱状图是一个很不错的想法,但是还是希望可以了解一下Java的可视化,用可视化界面实现柱状
图,以此凸显基本的专业素养。 - (3)、设计实现部分做的挺好,可以看出在词频统计软件项目的需求分析阶段有用心去做。
- (4)、美中不足的是菜单循环结构部分,可以参考其他一些同学的博文,进行适当的完善。
- (5)、流程图本身没有逻辑上的问题,但是美观度需要提高,按照规定开始符和结束符应该位于最顶端和最底端,且均独立为一行。
- (6)、编码时要注意代码规范,切实可行,容易观察和客观检验,以便提高开发效率。博主在github中所提交的代码基本符合现有的代码规范,但是依旧存在一些细节问
题。对于函数以及变量的命名需要进一步加强规范,为了达到代码自解释的目标,任何自定义编程元素在命名时,都要使用尽量完整的单词组合来表达其意。括号的使
用做的不错,符合基本的代码规范,只有少部分需要进行更改。还有其他的一些问题,比如所有的类都必须添加创建者和创建日期;所有的枚举类型字段必须要有注
释,说明每个数据项的用途等,在博主的代码中并未体现,建议仔细阅读代码规范 ,在以后编写代码的过程中多多注意这些问题。 - (7)、PSP中,在开发阶段和具体编码阶段,计划共完成需要的时间与实际完成需要的时间之间的差距比较大,博主自己总结原因是对Java语言掌握不熟练,上机练习不
够。我自己也存在着同样的问题,由于基础不扎实,对Java掌握的不熟练,因此导致写代码的过程很困难。希望我们可以一起努力,多加练习,尽快解决这些问题。
5、点评心得:
不同的同学有不同的思维方式,对同一个问题的认知也有各自的独特之处。通过阅读其他同学的博文,我受益匪浅,深刻认识到了自己的不足之处,懂得了应该善于互相学习,汲取他人的精华,不断改善自己的学习。同时,对于编码规范有了一定的认识,以前编写代码的时候,会随心所欲地按照自己的方式来写,通过阅读代码规范 ,发现自己存在很多问题,以后会多加注意去改正。此外,我对软件工程的内涵有了更深刻的体会,感受到了文档在项目开发过程中的重要性。阅读其他同学的博文,发现问题并进行适当的评价,其实是一种很好的学习方式,从别人的问题中可以反射出自己存在的问题。因此,我们在平常的学习中,要善于去评价他人,评价自己。
二、任务二
(一)、需求分析
采用两人合作方式,设计开发一个英文文本统计分析软件,使之具有以下功能:
1、实验2要求的功能
2、单词频数可视化柱状图
3、统计该文本行数及字符数
4、各种统计功能均提供计时功能,显示程序统计所消耗时间(单位:ms)
5、可处理任意用户导入的任意英文文本
6、人机交互界面要求GUI界面(WEB页面、APP页面都可)
7、附加分功能1:统计文本中除冠词、代词、介词之外的高频词
8、附加分功能2:统计前10个两个单词组成的词组频率
(二)、功能设计
1、柱状图功能——单词频数可视化柱状图
2、计时功能——各种统计功能均提供计时功能,显示程序统计所消耗时间(单位:ms)
3、显示功能——人机交互界面GUI界面
4、统计功能——统计文本行数、字符数、大小写字母、汉字、数字、字节数等
(三)、软件设计——使用类图
1、本次项目设计一共使用了三个类,分别为Main.java,Result.java,Histogram.java
2、程序总体流程图如下:
(四)、结对过程
1、首先我们对实验二中对方的代码进行了仔细研读,了解了对方的编码习惯,根据老师所给的代码规范 确定了本次项目的代码规范。
2、本次项目是在实验二的基础上添加、修改部分功能而实现的,因此在实验二的基础上,我们对本次项目进行了需求分析,确定了基本的框架。
3、对统计文本行数、字符数、大小写字母、汉字、数字、字节数等功能,计时功能,统计文本中除冠词、代词、介词之外的高频词功能等进行了分工。
4、共同编写了GUI界面。
5、代码编写结束后,我们根据代码规范进行了代码复审。
6、最后我们根据完成该项目的实际情况填写了PSP中各个阶段实际所用时间,并各自撰写了博客。
在讨论、细化和编程时的结对照片
(五)、程序运行——程序运行时每个功能界面截图
1、人机交互界面——GUI界面
2、输出词频和柱状图
3、输出前N个高频词
4、词频导出到文件
5、对文本行数、字符数、大小写字母、汉字、数字、字节数等进行统计
(六)、核心功能代码展示
-
1、单词频数可视化柱状图
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.BLACK);
for(int i=0;i<rulerStep;i++){
g2.drawString((3000-150*i)+"个", 8, topMargin+rulerStep*i);//绘制Y轴上的数据
}
g2.setColor(Color.YELLOW);
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++;
}
}
-
2、计时功能
long time=System.currentTimeMillis() - start;
JOptionPane.showConfirmDialog(null,print+"
"+"所用时间为:"+(System.currentTimeMillis() - start)+"ms","结果",JOptionPane.DEFAULT_OPTION);
Histogram histogram=new Histogram(map1,input.length);
-
3、统计文本行数、字符数、大小写字母、汉字、数字、字节数等功能
while ((str = in.readLine())!= null) {//readLine()方法, 用于读取一行,只要读取内容不为空就一直执行
i++;//每循环一次就进行一次自增,用于统计文本行数
c += str.length();//用于统计总字符数
byte[] bytes=str.getBytes();//求出该行的字节数组
d += bytes.length;//用于统计总字节数
for (int j = 0; j < str.length(); j++) {//for循环的条件,当j小于该行长度时就一直循环并自增
b = Character.toString(str.charAt(j));//返回一个字符串对象
if (b.matches("[\u4e00-\u9fa5]")) {//if语句的条件,判断是否为汉字
c1++;//若为汉字则c1自增
} else if(b.matches("[A-Z]")){//if语句的条件,判断是否为大写字母
c2++;//若为大写字母则c2自增
} else if(b.matches("[a-z]")){//if语句的条件,判断是否为小写字母
c3++;//若为小写字母则c3自增
} else if(b.matches("[0-9]")){//if语句的条件,判断是否为数字
c4++;//若为数字则c4自增
} else {//否则可判断为其他字符
c5++;//若为其他字符则c5自增
}
}
}
(七)、PSP展示
PSP2.1 | 任务内容 | 计划共完成需要的时间(min) | 实际完成需要的时间(min) |
---|---|---|---|
Planning | 计划 | 15 | 10 |
Estimate | 估计这个任务需要多少时间,并规划大致工作步骤 | 8 | 10 |
Development | 开发 | 130 | 150 |
Analysis | 需求分析 (包括学习新技术) | 18 | 20 |
Design Spec | 生成设计文档 | 10 | 12 |
Design Review | 设计复审 | 15 | 10 |
Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 20 | 15 |
Design | 具体设计 | 15 | 20 |
Coding | 具体编码 | 250 | 280 |
Code Review | 代码复审 | 20 | 20 |
Test | 测试(自我测试,修改代码,提交修改) | 25 | 30 |
Reporting | 报告 | 20 | 20 |
Test Report | 测试报告 | 10 | 15 |
Size Measurement | 计算工作量 | 12 | 15 |
Postmortem & Process Improvement Plan | 事后总结 ,并提出过程改进计划 | 20 | 20 |
(八)、总结
“他们并排坐在一台电脑前,面对同一个显示器,使用同一个键盘,同一个鼠标一起工作。他们一起分析,一起设计,一起写测试样例,一起编码,一起做单元测试,一起做集成测试,一起写文档,等等。”
——《构建之法》
本次实验是第一次结对项目实验,因此感触颇深。两人结对完成一个软件工程项目首先需要进行需求分析,对项目需求研究理解到位,对一个项目有整体的认知,然后再由两人分工互助实现所需的功能。由于每个人都有自己编写程序的习惯和风格,因此为了避免实验过程中产生分歧,首先我们对实验二中对方的文档和代码进行了仔细研读和评价,了解了对方的编码习惯,分析并指出了各自项目的优点和不足,最终达成了一致的代码规范。在具体的实现过程中也遇到了很多问题,但是通过我们一起讨论,相互协助,反复修改反复测试,最终都解决了这些问题。通过本次结对项目,自己的个人能力有所提升,同时明白了两人合作的重要性以及1+1>2的深刻内涵。此外,还体会到了结对编程可以提高设计质量和代码质量以及两个人合作解决问题的能力,同时可以互相交流学习经验,提高自己的整体水平。“一千个读者眼中就有一千个哈姆雷特”,通过两个人思想的交融,最终的成果才会显得更加有意义。