软件工程寒假作业(2/2)

软件工程寒假作业(2/2)

这个作业属于哪个课程 2021春软件工程实践|S班
这个作业要求在哪里 这里
这个作业的目标 1. 构建之法学习
2.完成词频统计
3.博客撰写
作业正文 在这里
其他参考文献 廖雪峰的git教程
fork&pull最佳实践
单元回归测试

构建之法阅读及提问

  • 阅读第三章的时候讲re-work表示软件质量,用了一个例子是艺术家涂改作画的例子

    思考:我完全同意书中说的re-work并不能代表代码的质量。但是后面说到在一个很简单的代码上花费很多时间re-work我是存有疑惑的。艺术家经过很多遍的涂涂改改出来的一幅作品我认为是一件很好的事,因为每一次更改都代表着对上一次的否定。我认为小的代码的re-work也是必要的,不应该否定他的价值

  • 阅读第六章敏捷流程流水例会

    思考:流水例会的确是一件可耻的行为,但却让我想到了流水例会产生的原因,无非就是无事可做的时候例会还要照常召开。在团队当中的确有这样的事情发生,无事可做,每天例会,那我们要用怎样的心情去对待。其次就是我看到冲刺阶段每次报告都要一个完整的图标之类的汇总,这些图表制作不需要时间的支撑吗?如何协调时间不足的情况下还仍然要做有效的报告呢

  • 阅读第十二章有关于几个案例

    思考:不论是飞机上的阅读灯,紧急跳舱,亦或是静音是否需要关闭闹钟,都存在有两面性。想要按钮统一,又想要避免按错,有时想要不关闹钟,有时又想要把闹钟开启。功能的需求总时有两面性,且多少还无法衡量,有的时候照顾了用户的需求反而加重了自己的程序员的负担

  • 阅读十六章IT行业的创新,成功的团队更能创新

    思考:我不记得在哪里看过这样的话,说,有一段时间掀起了青年创业的高潮,很多年轻人纷纷涌入创业,但最后有的平步青云,有的锒铛入狱。成功的团队更能创新,因为能力已经有很好的基础,所以可以创新。但是对于那些能力基础还不存在的,是否要冒着风险去创新呢,同时,创新究竟意味着什么,是前所未有还是优化改良。

  • 阅读第十七章有关猪,鸡,鹦鹉的故事

    思考:这个故事其实还蛮有意思的,但是后续的描述的确道出现实,也不免让我惊讶。猪在故事里就是要奉献一切的那一种,而鸡就是可以贡献但不是全部,鹦鹉是语言上的掌管者,交际圈。我个人觉得我和鹦鹉很像,但故事有一个问题就是没有给出结果的衡量。猪的确是奉献一切了,但是猪的回报是多少,高回报的确值得这么做。但是事实生活中的确也有人奉献了一切,牺牲了家人,朋友(这边不是说Jolin),但是可能他们的贡献还没有一些鹦鹉或者鸡随便一下贡献大,他们真的不值得用自己获得的白菜的钱,操着卖白玉的心吗

词频统计

Github项目地址

点击这里

Github项目全追踪commit

由于刚开始没有fork仓库,我自己在写代码的时候用的自己的仓库,导致后续进行了仓库转移。

多次完整的commit查看,点击这里

实际上只是放到项目中的另一个分支

PSP

PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
Planning 计划 20 10
• Estimate • 估计这个任务需要多少时间 5 10
Development 开发 200 300
• Analysis • 需求分析 (包括学习新技术) 280 180
• Design Spec • 生成设计文档 10 20
• Design Review • 设计复审 10 15
• Coding Standard • 代码规范 (为目前的开发制定合适的规范) 20 30
• Design • 具体设计 30 20
• Coding • 具体编码 420 600
• Code Review • 代码复审 120 150
• Test • 测试(自我测试,修改代码,提交修改) 300 400
Reporting 报告 30 60
• Test Repor • 测试报告 40 40
• Size Measurement • 计算工作量 10 10
• Postmortem & Process Improvement Plan • 事后总结, 并提出过程改进计划 10 10
合计 1505 1855

解题思路

  1. 逐行读入文件,每行先将空白字符去掉,将多个空格转换为一个空格
  2. split分开空格,返回一个字符串数组,通过检测数组中的每一个元素来判断是否是单词
  3. 用TreeMap存储单词情况,key值是单词,value值是单词的数目。用treemap存储时,就已经按照key值的ascii存储了
  4. 再将map存在ArrayList中,用Collection的sort进行排序

代码风格

点击这里打开git

设计与实现

关键代码

  • 字符数包括每一行单词外,每一行还有换行符
	//用于返回字符数
	public static int countCh(String str){
		return str.length();
	}
	public static int allCh(int a,int n){
		return a+2*n;
	}
  • 有效行数统计要将空行去掉
	//统计行数
	public static void countR(String[] s1){
		if(s1.length>0){
			if(basic.haveEnter(s1))
				working_set.sumR++;
			working_set.numN++;
		}
	}
  • 去除空白字符
  	public static String removeSpaces(String str){
  		str = str.replaceAll(" +", " ");
  		str = str.replaceAll("\t+"," ");
  		str = str.replaceAll("\0+","");
  		str = str.replaceAll("\b+","");
  		str = str.replaceAll("\f+","");
  		return str;
  	}

性能改进

  • map存储排序

    起初使用的是普通Map,但是在使用过程中需要对key和value都排序,索性直接换成treemap,直接就能对键值对排序,将map存入ArrayList中再使用Collections的sort方法,对其进行排序

public static ArrayList<Map.Entry<String, Integer>> sortMap(){
		//创建一个list用于存储map当中的内容
		ArrayList<Map.Entry<String, Integer>> infoIds = new ArrayList<Map.Entry<String, Integer>>(working_set.wordSet.entrySet());
		//创建比较器
		Collections.sort(infoIds, new Comparator<Map.Entry<String, Integer>>() {   
			public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) {      
				return (o2.getValue() - o1.getValue()); 
			}
		}); 	
		return infoIds;
	}

  • 检测最后一行是否有换行
	//检测最后一行是否有换行
	public static boolean hasEnterLastLine(){
		Path logPath = Paths.get(working_set.inPath);
        ByteBuffer buffer = ByteBuffer.allocate(1024);
        try {
            // 创建FileChannel并打开文件通道以进行读取访问。
            //读文件中的最后一个字符
            char[] c = a.toCharArray();
            if(c[0] == '\n'||c[0]=='\r')
            	return true;
            return false;
        } catch (IOException e) {
            return false;
        }
	}

单元测试

测试内容是我自己编码的一段模糊内容,包括一些空白字符,已经不必要的回车换行等

java2                        java1                     java   java java    word1 word apple apple windows98 windows98 windows2000 windows2000 windows98
	java3 java1 java1
java2   java3      java2 hello    word
java3 java5 java5 java5
java4 java4 java4
window2000
windows1000
windows10
windows10 windows10 windows1000 windows1000
h1 h2 h3 h4
nananan2
\n













\s
WinDows2000
apple2
bitch hi
wow slut
你好 我爱你
李安琪把 爱心哎
C:\Users\Lenovo\Desktop\1.txt




















结果输出

characters: 507
words: 31
lines: 22
java1: 3
java2: 3
java3: 3
java4: 3
java5: 3
windows10: 3
windows1000: 3
windows2000: 3
windows98: 3
apple2: 1

测试结果

test1是整体主函数

test2是文件读入函数,读入时,包含字符串处理,map导入

test4是文件输出函数,输出时,包含map排序

image-20210305125137076

image-20210305135443759

测试覆盖率不达到100%的是

  • basic当中的scanIn输入函数被取消,因为要直接读取文件位置,不手动输入

    image-20210305140201959

  • IOF不占100%因为没有异常抛出try...catch函数不被覆盖

  • judgeF不占100%因为存在单词,有些判断单词无法满足,所以直接跳过判断,导致无法覆盖

    image-20210305140437991

异常处理

文件查找不到时候

try{
}catch (Exception e){
    working_set.openFileFalse = true;
    System.out.println("文件可能不存在哦,请检查后重试");
}

后续代码将不再处理

if(working_set.openFileFalse){
    ...
}

心路历程与收获

读清题目提前规划真的很重要!!!前期因为没有规划,在写代码时修改了很多内容。从刚开始的按数组存取,到后面的map存取,再到后面用treeMap排序,在规划的时候就应该很清楚的通过几分钟就可以比较出来,但在实践当中边规划边实践导致这件事情战线拉长,花了很久不必要的时间。git也是由于刚开始没有fork,后续仓库转移花了很久的时间。

不得不承认这一次git出现的很多问题让我可以快速的获取git知识。之前在西二考核的时候,项目写完了,因为git不上仓库导致我被刷掉。这一次发现了上一次的问题,增加了SSH的key就可以了,而且git的语法也不是想象中那么难。

posted @ 2021-03-04 17:49  丫比是丫比  阅读(94)  评论(2编辑  收藏  举报