kangzhishi

导航

WordCount优化

小组github 地址 

https://github.com/whoNamedCody

小组成员:17048冷福星   17050李慎纲  17039付佳韵  17040康之是

PSP表格

PSP2.1PSP阶段预估耗时(分钟)实际耗时(分钟)
Planning 计划 30 20
Estimate 估计任务需要多少时间 30 20
Development 开发 240 250
Analysis 需求分析 20 20
Design Spec 生成设计文档 20 10
Design Review 设计复审 20 10
Coding Standard 代码规范 20 10
Design 具体设计 30 30
Coding 具体编码 60 80
Code Review 代码复审 20 30
Test 测试 50 60
Reporting 报告 70 100
Test Report 测试报告 30 60
Size Measurement 计算工作量 20 20
Postmortem 总结 20 20
  合计 340 370

接口设计

输入模块:

class WCinput
{

public String input(String[] args)

核心模块:

ArrayList<WordInfo> handle(String handleString){
ArrayList<WordInfo> result=new ArrayList<WordInfo>();

输出模块:public class wcoutput

接口实现

输入模块:

package wcpro;
import java.io.File;
class WCinput 
{
	
	public String input(String[] args) 
	{
		
		String inputFile=null;
		if (args.length == 0)
		{                                   
			System.out.println("您调用WCpro.exe时没有指定任何参数,请输入待分析文件名");  
			System.exit(0);  
	    }
		else if (args.length > 1)
		{                                   
			System.out.println("您调用WCpro.exe时指定输入文件过多,请输入一个待分析文件名");  
			System.exit(0);
	    }
		else if(args[0].endsWith(".txt"))
		{
			inputFile=args[0];
			File file=new File(inputFile);
			if(!file.exists())
			{
				System.out.println("待分析文件"+inputFile+"不存在");
				System.exit(0);
			}
			
		}
		else 
		{
			System.out.println("请输入.txt文件作为待分析文件");
			System.exit(0);
		}
		return inputFile;
	}
	
	
	
	

  核心代码实现:

ArrayList<WordInfo> handle(String handleString){
		ArrayList<WordInfo> result=new ArrayList<WordInfo>();
		Pattern pattern=Pattern.compile("[a-zA-Z]+\\-?[a-zA-Z]*");
		Matcher matcher=pattern.matcher(handleString);
		while(matcher.find()){
			String word=matcher.group().toLowerCase();
			if(word.lastIndexOf("-")==(word.length()-1))
				word=word.substring(0, word.length()-1);
			WordInfo wordInfo=new WordInfo(word);
			int index=result.indexOf(wordInfo);
			if(index==-1)
				result.add(wordInfo);
			else result.get(index).count();
		}
		Collections.sort(result);
		return result;
	}

  输出代码实现:

package output;
import java.io.*;
public class wcoutput
{
	public static void output(String[] word,int[] wordFreq) 
	{
		String Uppercase = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
		String lowercase = "abcdefghijklmnopqrstuvwxyz";
		char arr[]= new char[100];
		String newword = "";//更新大小写后的单词
		int out;
		int ascll;
		int length;int serial=0;
		 try
		 {
		 //向默认文件"result.txt"中输出信息
		 FileOutputStream fs =new FileOutputStream(new File("result.txt"));
	     PrintStream p =new PrintStream(fs);
	     //输出数组元素个数大于100时只输出前100个
	     if(wordFreq.length>100) out=100;
	     //否则按实际个数输出
	     else out = wordFreq.length;
	     for(int i=0;i<out;i++)
	     {
	    	 newword = "";
	    	 for(int j=0;j<word[i].length();j++)
	    	 {
	    		 ascll=word[i].charAt(j);//把字符转换成对于的Ascll码
	    		 //如果是大写转换成小写
	    		 if(Uppercase.indexOf(ascll)!=-1)
	    		 {
	    		  arr[j]=lowercase.charAt(Uppercase.indexOf(ascll));
	    		  newword +=arr[j];
	    		 }
	    		 //如果是小写或其它字符则保持不变
	    		 else
	    		 {
	    			 arr[j]=word[i].charAt(j);
	    		     newword +=arr[j];
	    		 }
	    	 }

测试设计

保证设计的测试用例应至少覆盖函数中所有的可执行语句,同时主要针对特殊字符数字连字符大小写字母等 的出现设计测试用例。由于模块功能较为单一,主要使用黑盒测试。

 

测试运行及评价

测试结果:

 

 

 

高级功能实现

(1)测试数据集设计思路:a.有140个以上需要根据词频排序的单词

              b.每种类型的单词出现20个以上:纯单词如software;连字符单词如content-based;单引号单词如Let’s;带短横线的单词如moon-;带双引号的单词如“aaa;带数字、                                                  常用字符和单词的情况如(see Box 3–2).8885d_c01_016;带数字的单词如bbb-2;

              c.5个以上统一单词的大小写形式,如apple和APPLE

              d.5个以上词频相同的不同单词排序,如:apple 5 camera 5 demo 5 yellow 5 zero 5

 

(2)优化前:

同时我做了单元测试的优化时间,显示时间的高级功能,代码参考组长github里的word的java文件。

具体代码如下:

时间显示:

 

优化后:

改用正则词法进行单词判断,并且先进行了大小写的转换。

 

  

结论:单元测试效果较好,通过了所有测试,被测模块质量水平较高。

 

 

拓展功能实现

我们小组统一选用FindBugs,具体教程是谷歌搜索教程。

具体做法:在需要查找bug的java文件、包或项目上点击右键,选择Find Bugs。并在Bug Explorer 中查看bug

 

 

开发规范说明

代码规范与复审(精简版)现代软件工程讲义 3 代码规范与代码复审

      选择部分:代码风格规范,代码设计规范中的函数和错误处理

交叉代码评审

使用该规范分析[学号17048]提交的代码,分析其所有的函数命名,变量命名,结论为其代码完全符合所选取的开发规范,其命名均具有良好的可读性。

      对项目中各模块的静态分析见(3)

      不足之处:代码中定义了两个没有无用变量;对{}的使用没有另起一行,使得结构清晰标准;

      好的规范:写了详尽的注释,并且注释为英文,格式统一,长注释在前一行开头,变量短注释在定义后;

            变量命名遵循规范,具有一定的实际意义,便于区分;

            变量统一在方法前集中声明,说明变量含义;

            函数方法设计分工合理;

            对可预料的各种错误输入和异常情况进行处理;

组内代码分析

组内提交的代码大多有良好的代码规范,但是模块划分不够细致,而且整体注释较少,所使用的数据结构也不够高效。

同时很多注释位置没有按规范来,并没有使用英文注释。

findbugs检查输入模块(input)没有发现问题;

代码规范上不足之处:{}的使用与小组其他成员不统一;注释没有使用英文注释,平台移植时可能出现问题;缺乏统一的变量说明注释

     规范之处:变量命名遵循规范,有实际意义;对各种错误输入有所处理,容错性提高;函数方法设计合理。

 

同行评审及性能分析

参加者:小组成员:康之是,冷福星,李慎纲,付佳韵

主持,记录:康之是

评审者:李慎纲,付佳韵

开发者,代码讲解:冷福星

评审对象:核心模块(kernel)

评审过程:开发者讲解代码逻辑,函数功能等;

     开发者运行程序,测试压力txt文件,反复多次,得到平均运行时间;

     评审者提出意见,开发者回答;

     达成共识,进行改进

提出意见:核心功能中先进行大小写转换再进行判断,并且更改对单词的判断方法函数,采用正则表达式进行词法分析。

作业小结

软件开发过程中软件测试是不可缺少的一部分,同时软件测试也是软件质量的重要保证。

我在小组里主要做的是其他模块,包括main函数,整合组内各个模块,使之生成完整的代码,完成了单元测试的高级功能,设计了测试用例,统计了时长,做了优化。

同时小组成员在实现基础功能前提下,每个人分别做了各个模块的拓展功能,并三个以上的人实现了显示时间,优化代码的高级功能。

posted on 2018-04-02 11:40  kangzhishi  阅读(267)  评论(1编辑  收藏  举报