| 项目 | 内容 | 
|---|---|
| 这个作业属于哪个课程 | http://www.cnblogs.com/nwnu-daizh/ | 
| 这个作业的要求在哪里 | https://www.cnblogs.com/nwnu-daizh/p/10569690.html | 
| 课程学习目标 | 熟悉软件开发整体流程,提升自身能力 | 
| 本次作业在哪个具体方面帮助我们实现目标 | 第一次体验一个完整的工程 | 
任务1:两两自由结对,对结对方的《实验二 软件工程个人项目》的项目成果进行评价,具体要求如下:
对项目博文作业进行阅读并进行评论,评论要点包括:博文结构、博文内容、博文结构与PSP中“任务内容”列的关系、PSP中“计划共完成需要的时间”与“实际完成需要的时间”两列数据的差异化分析与原因探究。
克隆结对方项目源码到本地机器,阅读并测试运行代码,结合运行结果评论程序代码,评论要点包括:软件结构、代码规范、功能实现、人机交互等。
尝试利用github中的Fork、Clone、Push、Pull request、Merge pull request对结对方仓库中的源码进行合作修改。
| 项目 | 内容 | 
|---|---|
| 点评博客地址 | https://www.cnblogs.com/yanyanH/p/10556839.html | 
| GitHub源码地址 | https://github.com/Hanyy2019/test2 | 
| 点评内容 | 在读完你的博文后,首先在博文排版方面,你的结构清晰,内容明了,并且使用了博文简要内容信息表,这点做的很不错,值得我学习。在博文结构方面,模块化的划分让人读起来很舒服。在博文内容方面,你做的是英文文本词频统计,根据老师所给的要求,你基本实现了查询指定单词,查询前K个高频单词,将所有单词按字典顺序输出到文本中。但是,在绘制柱状图方面,你可以再学习学习,这部分其实很简单。博文结构与PSP中“任务内容”列的关系:你的博文结构和PSP任务内容列的关系比较紧密,基本按照PSP任务内容列的顺序编写了博文. PSP中“计划共完成需要的时间”与“实际完成需要的时间”两列数据的差异化分析与原因探究:通过对比博文中计划完成时间和实际完成时间,发现实际完成时间比计划完成时间超出很多,看到你在下面总结了自己在PSP过程中的困难,主要在于编程能力不强,在开发过程中花费了较多的时间。其他的流程花费时间基本和计划时间差别不大,但是也超出了一些时间,可能是由于初次按照PSP流程进行软件开发,所以对时间的把握不充分。最后我在GitHub上下载了你的源码,编译运行后,和博文内容贴合,代码比较规范,基本实现了老师所要求的功能,但是柱状图部分没有实现。 | 
| 点评心得 | 通过阅读点评别人的博文,我了解到了别人在编写代码和博文的优点,比如结构化的设计,以及图片大小的调整。 | 
任务2:采用两人合作方式,设计开发一个英文文本统计分析软件,使之具有以下功能:
(1)实验2要求的功能;
(2)单词频数可视化柱状图要求是以下样式:

(3)统计该文本行数及字符数;
(4)各种统计功能均提供计时功能,显示程序统计所消耗时间(单位:ms);
(5)可处理任意用户导入的任意英文文本;
(6)人机交互界面要求GUI界面(WEB页面、APP页面都可);
(7)附加分功能:统计文本中除冠词、代词、介词之外的高频词;
(8)附加分功能:统计前10个两个单词组成的词组频率。
GitHub源码
需求分析
- 
实验2要求的功能; 
- 
绘制单词频数可视化柱状图; 
- 
统计该文本行数及字符数; 
- 
各种统计功能均提供计时功能,显示程序统计所消耗时间(单位:ms); 
- 
可处理任意用户导入的任意英文文本; 
- 
人机交互界面要求GUI界面(WEB页面、APP页面都可); 
软件设计

核心功能代码展示
柱状图的实现
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.darkGray);
		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++;
         } 
		 
	} 
输出到文件
Map<String,Integer> Map = new LinkedHashMap<String, Integer>(); 
	 /**按字典顺序排序*/
    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());  
       }  
   } 
    /**写入文件*/
	 void PrintToF(Map<String, Integer> map)throws IOException 
	 {  
		    long start = System.currentTimeMillis();
	    	Sort(map);
	        File file = new File("result.txt");
	        FileWriter f = new FileWriter(file.getAbsoluteFile());
	        for (Entry<String,Integer> w: Map.entrySet()) 
	        {
	        	f.write(w.getKey() + "/" + w.getValue()+"     ");
	        }
	        f.close();
	        JOptionPane.showConfirmDialog(null,"所用时间:"+(System.currentTimeMillis() - start)+"ms","结果",JOptionPane.DEFAULT_OPTION);
	 }         
程序运行
主页面

高频词

柱状图显示

单词、行数

生成result文件

结对过程

PSP
| PSP2.1 | 任务内容 | 计划共完成需要的时间(min) | 实际完成需要的时间(min) | 
|---|---|---|---|
| Planning | 计划 | 8 | 12 | 
| Estimate | 估计这个任务需要多少时间,并规划大致工作步骤 | 8 | 10 | 
| Development | 开发 | 120 | 150 | 
| Analysis | 需求分析 (包括学习新技术) | 10 | 15 | 
| Design Spec | 生成设计文档 | 5 | 5 | 
| Design Review | 设计复审 (和同事审核设计文档) | 10 | 10 | 
| Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 10 | 10 | 
| Design | 具体设计 | 20 | 25 | 
| Coding | 具体编码 | 120 | 150 | 
| Code Review | 代码复审 | 20 | 30 | 
| Test | 测试(自我测试,修改代码,提交修改) | 10 | 20 | 
| Reporting | 报告 | 20 | 20 | 
| Test Report | 测试报告 | 10 | 10 | 
| Size Measurement | 计算工作量 | 10 | 15 | 
| Postmortem & Process Improvement Plan | 事后总结 ,并提出过程改进计划 | 15 | 30 | 
总结
我认为两人合作真的能够带来1+1>2的效果,首先一个人总有累的时候,这时候出错的概率就会大大增加,而结对编程就避免了这种低级错误。