201671010447杨露露 实验四软件工程结对项目
一:作业点评#
点评内容:##
评价博文链接:https://www.cnblogs.com/runju/p/10558809.html
1.缺点:博文结构不太清晰,排版可以在美化一些,博文的内容中对程序功能的描述不太齐全,可以在加一下自己做的软件功能的截图,博文结构设计凌乱,对一些功能的描述比较的浅。由于我们之间没有养成对细致软件书写规范,在对PSP的设计与时间的掌握有着很大差别。
2.优点:功能实现的比较完整,对柱形图的实现也比较的完美。在博客中基体现了软件的各种需求,软件实现过程中人机交互书写的比较的好。
评价源代码链接:https://github.com/runju/WordCount
1.优点:最值得表扬的是代码的规范,该同学有着良好的书写代码的习惯,各种类与方法命名见名思意,有着良好书写代码的习惯
2.缺点:在代码方面需要注意的是功能模块的强化,对代码质量的提高,例如在封装类的时候注意封装的方法。
评价心得##
在阅读完改同学的代码与博客之后,值得我学习的地方是该同学书写代码的习惯,对项目功能能够见名思意,由于是我们结对需要完成的作业,也在评价该同学代码的时候向改同学请教了一些我自己不足的问题。
GitHub的使用过程中存在的一些问题:
对GitHub的不熟悉,练习了好几次才学会对GitHub的克隆、Pull request、Merge pull reques等一些操作,对结对方的代码进行下载与修改的时候也存在过一些问题,在网上查找一些资料解决问题。
二:结对项目实施过程#
一.需求分析##
为了练习软件的个人开发流程,设计一个关于词频统计的小程序,在词频统计的小程序中需要实现的功能具体有:
- 1.1:程序可读入任意英文文本文件,该文件中英文词数大于等于1个。
- 1.2:指定单词的查找与所需要的时间
- 1.3:在对指定单词统计做一个柱状图
- 1.4:高频词统计功能:用户从键盘输入高频词输出的个数k,运行程序统计功能,可按文本中词频数降序显示前k个单词的词频及单词。
- 1.5 :对统计的文件进行行数和字符的统计
- 1.6:.统计该文本所有单词数量及词频数,并能将单词及词频数按字典顺序输出到文件result.txt。
二.软件设计##
我们组主要是利用web网页的方式来实现此次项目的功能,服务器是通过Tomcat来支撑项目的实现。采用的是最简单的servlet来传递参数,将所有的方法封装在一个WordCount类,在这个类里面每个功能的核心实现存放在不同的方法里面,将此类进行封装。在servlet中直接调用封装好的方法,通过请求(request)与响应(response)的方式来与jsp页面进行传递。
此次的项目一共有三个类
2.1 WordCount.java 类:对所有功能的方法的一个封装
2.2 WordCountServlet.java :与web页面相联系的servlet类,是java内容与web交互的一个java封装好的类
2.3 WordCount.jsp:一个前台页面,需要在网页中展示的页面
项目类图:
三:核心代码:##
3.1:通过servlet来实现前台与后天的交互,servlet是java封装好的交互类,通过请求(request)与响应(response)的方式来传递数据,实现前后台的交互。###
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//请求与响应的编码格式
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
PrintWriter out=response.getWriter();
String id=null;
//接受页面数据
fileName = request.getParameter("fileName");//文件名
String words = request.getParameter("word");//指定单词
String wordnum = request.getParameter("wordnum");//高频数
String wordlines = request.getParameter("wordlines");//行数
String result = request.getParameter("result");//存放
id=request.getParameter("id");//功能编号的获取
if(id.equals("0")){
//文件的上传
WordCount wordCount = new WordCount();
map=wordCount.count(fileName);
out.print("<script>alert('上传成功!!');location.href='html/WordCount.jsp'</script>");
}else if(id.equals("1")){
//指定单词的查找
//开始时间
long startTime=System.currentTimeMillis();
TreeMap<String,Integer> map1 = new TreeMap<String, Integer>();
WordCount wordCount = new WordCount();
map1= wordCount.bijiao(map, words);
//结束时间
long endTime=System.currentTimeMillis();
float excTime=(float)((endTime-startTime)/1000)*1000;
//向jsp页面传参数
request.setAttribute("map1", map1);
request.setAttribute("excTime", excTime);
System.out.println("执行时间:"+excTime+"ms");
request.getRequestDispatcher("html/WordCount.jsp").forward(request, response);
}else if(id.equals("2")){
//高频词的统计
//开始时间
long startTime=System.currentTimeMillis();
WordCount wordCount = new WordCount();
int k=Integer.parseInt(wordnum);
ArrayList gaopin=wordCount.gaopin(map, k);
//结束时间
long endTime=System.currentTimeMillis();
float excTime2=(float)((endTime-startTime)/1000)*1000;
request.setAttribute("gaopin", gaopin);
request.setAttribute("excTime2", excTime2);
request.getRequestDispatcher("html/WordCount.jsp").forward(request, response);
}else if(id.equals("3")){
//行数统计
//开始时间
long startTime=System.currentTimeMillis();
WordCount wordCount = new WordCount();
List list=wordCount.statistics(fileName);
//结束时间
long endTime=System.currentTimeMillis();
float excTime3=(float)((endTime-startTime)/1000)*1000;
request.setAttribute("excTime3", excTime3);
request.setAttribute("list", list);
request.getRequestDispatcher("html/WordCount.jsp").forward(request, response);
}else if(id.equals("4")){
//写入文件
//开始时间
long startTime=System.currentTimeMillis();
WordCount cunfang = new WordCount();
cunfang.cunfang(map);
//结束时间
long endTime=System.currentTimeMillis();
float excTime1=(float)((endTime-startTime)/1000)*1000;
request.setAttribute("excTime1", excTime1);
out.print("<script>alert('存储成功!!');location.href='html/WordCount.jsp'</script>");
request.getRequestDispatcher("html/WordCount.jsp").forward(request, response);
}
}
四:测试截图##
4.1网页首次显示###
4.2上传###
文件上传首先需要获取的是文件的名字,通过文件名来获取文件的内容,将文件内容存放在TreeMap集合中。
4.3指定单词查找###
在上传的文件中查找指定单词
4.4高频词###
高频词的统计是需要指定所需要查找单词的个数,每个功能都有时间的统计,需要在调用方法前设置时间,在结束后设置一个时间,前后时间相减。
4.5文本行数与字符数###
4.6文件的存放###
4.7柱状图的显示###
柱状图是通过继承JFrame可视化界面来实现的,这个方法中需要传递存放文件的集合和指定单词的数组,调用java已有的方法来绘制柱状图,二维的柱状图方法是Graphics2D。
五:讨论过程与心得(图片)
在项目开发过程中,遇到了很多的问题,主要是在前台与后台的交互,包括前台页面中文件名上传之后再后台获取文件名的问题,在el表达式的操作过程中数据从servlet中拿不到值,主要在servlet中数据获取后调用方法饭后的集合类型的数据在jsp中遍历的空难,通过重定位的方式转接到jsp页面,在JavaScript中通过forEach的方式遍历servlet传来的数据集合,一些必要的jar包的支持,例如standard.jar,jstl.jar等一些jar包。此次项目中还用到了Tomcat服务器来作为运行项目的一个小型的支撑服务器。通过结对项目的过程,体会到团队的重要性,合作工作过程中会有一些分歧,例如各自看法与想法的不同。通过无数次的实验与测试才会有这次的项目。
六:展示PSP,这个环节重要的是让自己看到自己的估计和实际消耗时间,哪个环节耗时最多,哪个环节估计和实践相差巨大?为什么?##
||||
|:--|:--|:--|:--|
|PSP2.1|任务内容|计划共完成需要的时间(min)|实际完成需要的时间(min)|
|Planning|计划|6|5|
|Estimate|估计这个任务需要多少时间,并规划大致工作步骤|10|14|
|Development|开发|200|400|
|Analysis|需求分析 (包括学习新技术)|3|5|
|Design Spec|生成设计文档|5|10|
|Design Review|设计复审 (和同学一起审核设计文档)|5|7|
|Coding Standard|代码规范 (为目前的开发制定合适的规范)|3|3.5|
|Design|具体设计|14|20|
|Coding|具体编码|180|420|
|Code Review|代码复审|6|10|
|Test|测试(自我测试,修改代码,提交修改)|6|10|
|Reporting|报告|10|15|
|Test Report|测试报告|6|15|
|Size Measurement|计算工作量|5|10|
|Postmortem & Process Improvement Plan|事后总结 ,并提出过程改进计划|5|10|
项目心得:##
通过此次的项目认识到自己代码的不足以及对之前知识的回顾,之前所有的项目经验都是通过jsp页面来写的,此次由于时间问题也利用了之前学过的jsp网页的形式来实现,对于一些知识点有一些忘记,通过此次试验认识到软件开发需要时常的练习,不能遗忘,勤动手,多练习一些算法。