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)
Planning 计划 6
Estimate 估计这个任务需要多少时间,并规划大致工作步骤 10
Development 开发 200
Analysis 需求分析 (包括学习新技术) 3
Design Spec 生成设计文档 5
Design Review 设计复审 (和同学一起审核设计文档) 5
Coding Standard 代码规范 (为目前的开发制定合适的规范) 3
Design 具体设计 14
Coding 具体编码 180
Code Review 代码复审 6
Test 测试(自我测试,修改代码,提交修改) 6
Reporting 报告 10
Test Report 测试报告 6
Size Measurement 计算工作量 5
Postmortem & Process Improvement Plan 事后总结 ,并提出过程改进计划 5

项目心得:##

通过此次的项目认识到自己代码的不足以及对之前知识的回顾,之前所有的项目经验都是通过jsp页面来写的,此次由于时间问题也利用了之前学过的jsp网页的形式来实现,对于一些知识点有一些忘记,通过此次试验认识到软件开发需要时常的练习,不能遗忘,勤动手,多练习一些算法。

查看源代码:https://github.com/yanglulu-yang/shiyan4

原文地址:https://www.cnblogs.com/yanglulu-yang/p/10645518.html