软工实践寒假作业(2/2)

这个作业属于哪个课程 2021春软件工程实践|W班 (福州大学)
这个作业要求在哪里 软工实践寒假作业(2/2)
这个作业的目标 学习PSP,阅读《构建之法》
完成WordCount编程
其他参考文献 CSDN、博客园、简书、
.gitignore配置语法、关于单元测试和回归测试

阅读《构建之法》

问题一:如果能力差距大,结对编程效率会高吗?

书中提到的结对编程过程中,双方需要互相磨合和学习,即采用“驾驶/领航”模式。考虑到想要使得结对编程的效率需要投入一定的时间成本。若二人所长不同,编程能力不同,单纯采取交替执行“驾驶/领航”的工作方式是否影响效率。

问题二:如何记录PSP?

第二章中提到,PSP依赖于数据。但是数据需要自己记录和考察,因此不准确性因素有很多。以本次实践来说,在准备工作期间无法预估到底需要多少时间。在执行的过程中,对于时间的计算也没有特别注意,而且特地关注时间反而降低了工作效率。那么关于PSP的记录到底如何进行操作。

问题三:如何平衡“同理心”与不同客户需求

书中提到“我们都用过各种电视/DVD播放器的遥控器,功能很强,按钮很多吧?你有没有注意到老人家使用遥控器时的困难?我们常说做产品要从用户的角度考虑问题,这需要有“同理心”。”,但由于一个项目的受众很多,有很多不同的需求。以我个人对微信的使用感受来说,对于经常推送的广告不胜其烦,甚至想要取消该弹窗,但我的家人,特别的年长的人却“沉溺其中”。由此看来,虽需“同理心”
但用户的感受不一,最后的设计到底该如何决定。

问题四:关于工程师的能力评估

书中提到了通过数据的形式评估衡量工程师的能力,但我认为编程思路、学习能力、合作能力等能力确实无法用数据进行评估的,虽然数据可以足够客观,但单纯的采用数据的形式是否太过片面,或者说如何界定衡量的标准与尺度?考虑到一些无法考量的实力,怎么设计公平的标准呢?

问题五:关于BUG的问题

第一章提到“软件的行为和用户的期望值不一样,就叫BUG。是否是BUG,取决于用户、开发者的不同角度。”,在我寒假玩的一款游戏中,地图常出现BUG,但这些BUG常常大幅度提高了我玩游戏的效率与体验,但突然有一天BUG被逐一修复,玩家们也都怨声载道。那么面临已经出现的BUG,用户的评价褒贬不一,程序员到底是修复还是不修复呢?

冷知识

在程序中bug一词用于技术错误。这一术语最初由爱迪生在1878年提出的,但当时并没有流行起来。在这的几年之后,美国上将Grace Hopper在她的日志本中,写下了她在Mark II电脑上发现的一项bug。不过实际上,她说的真的是“虫子”问题,因为一只蛾子被困在电脑的继电器中,导致电脑的操作无法正常运行。如图片所见,她写道“这是我在电脑上发现的第一个bug”。

WordCount编程

Github项目地址:点击这里

PSP表格

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

解题思路


利用BufferedReader,从字符输入流中读取文本,然后对文件进行处理,先统一将所有的字母都转换为小写再进行统计。
利用split切割单词,再利用for循环找出以字母开头的单词,作为key放入map。
统计单词的词频利用map,把单词当做key的时候先进行存放,最后输出top10的时候在进行判断。
统计总的字符数,直接调用BufferedReader中的readline()方法,对每一行的字符数进行累加,最后加上行数就是文本中总的字符数。

代码规范制定 :点击这里

设计与实现过程

1.处理文本大小写

do {
    	if(i!=-1) {
			tempStream.write(i);
		}    	
    	i = myBufferedReader.read();
    	if(i >= 65 && i <= 90) {
    		i += 32;
    	}
    	}
		while(i != -1);

2. 进行单词的处理

public static int CountWordNum(String line, List<String> lists) {
        int wordcount = 0;
        String[] wordsArr1 = line.split("[^a-zA-Z0-9]");  //切割筛选单词

        for (String newword : wordsArr1) {  
            if(newword.length() != 0) {               	
                if((newword.length() >= 4) && (Character.isLetter(newword.charAt(0))
                    && Character.isLetter(newword.charAt(1)) && Character.isLetter(newword.charAt(2))
                    && Character.isLetter(newword.charAt(3)))) {               		
                    wordcount++;
                    lists.add(newword);  
                }
            }  
        }

        return wordcount;
    }

3.词频统计并存入输出文本

for (String li : lists) {  //单词出现个数统计
            if(wordsCount.get(li) != null) { 
                wordsCount.put(li,wordsCount.get(li) + 1);  
            }
            else {  
                wordsCount.put(li,1);  
            }  
  
        }  
Print p = new Print(args[1]);
p.SortMap(wordsCount,wordline,wordcount,characterscount+wordline);  //排序并输出

单元测试

public void testCharacter() {
        int result = Lib.CountEachLineCharacter(s);
        assertTrue(result == length);
    }
public void testWordNum() {
        int result = Lib.CountWordNum(s,list);
        assertTrue(result == num);
    }

异常处理说明

1.命令行参数错误

catch(ArrayIndexOutOfBoundsException ee) {
    System.out.println("Error");
}

2.输入文件不存在

catch(FileSystemAlreadyExistsException f) {
    System.out.println("Not find this file");
}

3.其他错误

catch(Exception e) {
    System.out.println(e);
}

心路历程与收获

1.复习了java相关知识
2.学会了git和GitHub的应用
3.学会了单元测试相关知识
4.学会了编写异常处理代码
5.对PSP应用有部分了解

posted @ 2021-03-05 22:26  小皮碎大石⚡️  阅读(100)  评论(3编辑  收藏  举报