寒假作业(2/2)

基本情况

所属班级 班级链接
作业要求 作业链接
其他参考文献 百度

第一部分:阅读《构建之法》并提问

1.书中2.3提到不经能效分析就进行优化,反而会事倍功半,前文还提到一个过早优化的例子。可能是现在实践还不足,不明白把每一部分都优化到力所能及的地步,应该能让程序的效能达到最理想的状态。在查看资料后知道,在大型项目开发的时候,项目规模巨大不可能对每一部分都进行优化,最好的方法就是在效能分析后对重复次数最多,最耗时的部分优化才是最正确的做法。
2.第4章中提到了结对编程和极限编程的思想。极限编程希望以最高的效率和质量来解决用户目前的问题。结对编程希望能够避免闭门造车减少后期维护的成本和时间。随着软件规模的变大,已经不是三两个人可以完成的了,如何在某种情况下选择哪种方式,在书中并没有准确提及。如何在实践中选择这两种方式?查阅资料后得知在大规模的项目中,两种方式是同时存在的,在较小的功能中通常采用极限编程的策略,在较大一些的功能会采用结对编程,甚至需要小组来完成。
3.第9章中提到了PM对于团队的作用,带领团队实现最重要目标,保持团队平衡。如果PM一开始对于用户需求的分析是有误的,项目开发到一半发现和项目的初心已经偏离,造成人力物力的损失,如何保证PM的领导能基本实现项目的目标,这时如何能最大程度的将项目拉回正轨?
4.第12章中提到用户体验,在在竞争越来越激烈的现在,随着软件复杂度的提高,软件功能出现了越来越多的冗余,就拿QQ来说,在其中的很多功能可能百分之九九的人都用不到,但是却是个公共功能,造成了用户硬盘空间的浪费,针对这种情况项目经理该如何规划?用户体验设计的一个重要目的就是要降低用户的认知阻力。对于这个问题查阅资料后得知,中功能有一部分是开发人员的点子,团队觉着有用便采纳了,但后续使用中发现使用率并不高,就拿QQ的兴趣部落来说,由于使用率过低,最后直接将这部分删除。
5.第17章中提到对于创造性思维的活动来说,创造力的激发和金钱成反比?奖金为何会没有作用?在查看资料才知道,创造力的激发和金钱还真是成反比。人脑其实非常孱弱,因此要好好发挥其灵光闪耀,则必须提供和营造良好的分享氛围,强调和激励工作人员去关注创造力本身,而不去纠结奖金激励。

冷知识

微软也曾经是jcp甚至是java的主要贡献者,但是利益驱使下,想扩展java,从而破坏java跨平台的特性,所以跟sun闹翻,其本质原因就是想让客户写的java代码跟windows绑定,sun坚决不同意,闹翻,今天回头看这个结果,只能说:双输,sun挂了,微软的ria也离挂不太远了,silverlight已经放弃了,比起当年ie自带有jvm的支持来说,那完全就是两回事。

第二部分

项目地址

项目地址

PSP表格

psp2.1 Personal Software Process Stages 预估耗时(min) 实际耗时(min)
Planning 计划 20 25
Estimate 估计这个任务需要多少时间 20 20
Develoment 开发 1000 1140
Analysis 需求分析(包括学习新技术) 200 240
Design Spec 生成设计文档 30 40
Design Review 设计复审 25 20
Coding Standard 代码规范设计 60 70
Design 具体设计 60 70
Coding 具体编码 400 450
Code Review 代码复审 60 60
Test 测试(自我测试,代码修改,提交修改) 60 60
Reporting 报告 30 30
Test Repor 测试报告 20 15
Size Measuremen 计算工作量 20 15
Postmortem&Process Improvement Plan 事后总结,并提出过程改进计划 20 25
合计 1025 1140

解题思路描述

1.文件数处理,将文件数据直接从文件中取出,获得结果后将结果拼接成字符串,利用bufferedwriter写入文件中,读取文件数据使用bufferedreader。
2.文件中字符串的长度直接使用length()方法获取,在返回字符串长度。
3.单词数的统计采用正则表达式来分割字符串,再用matches()方法获取匹配的单词,忽略字符数小于4,数字开头等。在利用map<string ,integer>,将单词和对应出现次数加入wordMap中。
4.统计行数,利用bufferedreader中的readline()方法,整行读取,读取整行数据同时判断是否为空行,为空则忽略改行。直到最后为空,文件完全读取。
5.对单词出现的频率进行排序。利用map<string,intger>对象,利用sort方法和匿名内部类的比较器进行排序,最后返回一个list对象。
6.将数据拼接成完整字符串,利用bufferedwriter写入对应的文件中。

代码规范链接

代码规范

设计与实现过程

1.读取文件数据

 public static String charactersCount(String filePath)
    {

        BufferedReader bReader=null;
        StringBuilder str=null;

        try 
        {
            FileReader reader=new FileReader(filePath);
            bReader=new BufferedReader(reader);
            str=new StringBuilder();
            int flag;
            //str.append(bufferedReader.read());
            while ((flag=bReader.read())!=-1)
            {
                str.append((char)flag);
            }
        } catch (FileNotFoundException e) 
        {
            e.printStackTrace();
        } 
        catch (IOException e) 
        {
            e.printStackTrace();
        }finally 
        {
            try 
            {
                bReader.close();
            } 
            catch (IOException e) 
            {
                e.printStackTrace();
            }
        }

        return str.toString();
    }

2.字符数统计

//字符数总数统计
    public static int charactersNumberCount(String str)
    {

    	//将字符串改为字符
        char[] ch = str.toCharArray();
        int num = 0;
        for(int i = 0; i < ch.length; i++) {
            if(ch[i] >= 0 && ch[i] <= 127) {
                num++;
            }
        }
        
        return num;
    }

3.行数统计,利用readerline每次读取一行,在判断该行是否为空行

//计算行数
    public static int linesNumberCount(String filePath)
    {
    	File file=new File(filePath);
    	int count=0;
    	
    	if(file.exists()) 
    	{
    		try
    		{
    			BufferedReader in = new BufferedReader(new FileReader(file));
    			String line;
    			while((line = in.readLine()) != null)
    			{
    				//忽略空行
    				if(!line.equals("") )
    				{
    					count ++;
    				}
    			}
    			//System.out.print(count);
    			in.close();
    		}
    		catch(FileNotFoundException e)
    		{
    			e.printStackTrace();
    		}
    		catch(IOException e)
    		{
    			e.printStackTrace();
    		}
    		
    	}

        return count;
    }

4.按照单词出现频数进行排序

//按单词频率进行排序
    public List<Map.Entry<String,Integer>> SortMap()
    {

        List<Map.Entry<String,Integer>> wordList=new ArrayList<Map.Entry<String, Integer>>(wordsMap.entrySet());

        Collections.sort(wordList, new Comparator<Map.Entry<String, Integer>>() 
        {
        	
        	//利用匿名内部类实现排序
            @Override
            public int compare(Map.Entry<String, Integer> map1, Map.Entry<String, Integer> map2) 
            {
                if (map1.getValue().equals(map2.getValue()))
                {
                    return map1.getKey().compareTo(map2.getKey());
                }
                else 
                {
                    return map2.getValue()-map1.getValue();
                }
            }
        	
        });

        return wordList;
    }

性能改进

在单词排序部分利用匿名内部类的方式利用比较器提高比较速度。

单元测试

对字符数,单词数统计和行数统计都进行了测试
1.字符数统计测试

public void testCharactersNumberCount() {
		String str="helloworld\nmyname\nisjohn";
		String strTest="";
		for(int i=0;i<10000;i++)
			strTest+=str;
		System.out.print(Lib.charactersNumberCount(strTest));
		assertEquals(Lib.charactersNumberCount(strTest),240000);
	}

2.单词数统计测试

public void testWordsNumberCount() {
		String str="hello world \n myname \n isjohn\n";
		String strTest="";
		for(int i=0;i<10000;i++)
			strTest+=str;
			
		System.out.print("\n"+Lib.wordsNumberCount(strTest));
		assertEquals(40000,Lib.wordsNumberCount(strTest));
		
	}

3.行数统计测试

public void testLinesNumberCount() throws IOException {
		String str="helloworld\nmyname\nisjohn";
		String strTest="";
		
		//地址为本地测试文件地址
		String outPath="D:\\\\eclipse\\\\wordcount_java\\\\src\\\\wordcount_java\\\\test.txt";
		for(int i=0;i<10000;i++)
			strTest+=str;
		
		FileOutputStream fileOutputStream=new FileOutputStream(outPath);
        OutputStreamWriter outputStreamWriter=new OutputStreamWriter(fileOutputStream,"UTF-8");
        BufferedWriter bufferedWriter=new BufferedWriter(outputStreamWriter);
        bufferedWriter.write(strTest);
		System.out.print(Lib.linesNumberCount("D:\\\\eclipse\\\\wordcount_java\\\\src\\\\wordcount_java\\\\test.txt")+"\n");
		assertEquals(19115,Lib.linesNumberCount(outPath));
		
	}

此处输入图片的描述

此处输入图片的描述

异常处理

1.使用了FileNotFountExpection文件不存在
2.输入输出异常IOExpection。

心路历程

这次作业是我们第二次寒假作业,相对第一次作业这次我碰到更多的麻烦,也学了更多东西,github和git的使用单元测试junit的使用,接触到了PSP,更好的规划自己的时间。看了邹欣老师的《构建之法》这本书,对于软件工程,程序员又有了更深入的了解。对于软件的开发也更加清晰。

posted @ 2021-03-05 15:58  zlllfy  阅读(80)  评论(2编辑  收藏  举报