欢迎来到无祂的博客

寒假作业(2/2)

寒假作业(2/2)

这个作业属于哪个课程 2021春软件工程实践|W班(福州大学)
这个作业要求在哪里 寒假作业
其他参考文献 CSDN、JAVA教程

任务一 阅读并提出问题

问题一

问题一、书中2.3节介绍了PSP模型,该模型用于估计和对比开发各个时期内的时间,我看完该节后,结合此次进行的作业,我有一个疑问:我们如何在拿到需求之后,快速估计自己各个时期的时间?我个人在此次作业之中感受最大的就是几乎和预定的时间长度完全不一样,其次在预估的时候,如何快速判断一个项目的主要核心时间在于哪一块?是在具体设计还是在测试?

问题二

问题二、书中的6章向我们讲述了敏捷流程的相关知识,其中重点提到了“每日立会”这一问题,在我之前的项目合作经历中发现,如果没有每日立会的话我无法了解到其他人的项目具体进度,如果每天强制进行每日立会的话就会出现“为了开会而开会”的无话可说的境地,我们也尝试过进行不定期随时的立会进行交流,但是同样在交流方面有些问题,我想知道如何合理的进行“每日例会”这一进程?他真的对项目流程有帮助么?

问题三

问题三、书中的第17章提到了微软的“救生艇练习”这一方式,而在我的视角看来,虽然将项目组成员分为三六九等有助于区分各个人员的贡献,提升上层人员的积极性,但是同时,会不会同步打压了下层人员的积极性?导致团队出现“能干的人所做的事越来越多”这种情况?这种情况对于一个项目组来说是健康的么?

问题四

问题四、书中的第17章还提到一个问题,一个团队在合作期间的不同状态,在我之前的经历之中,大部分团队会卡死在“磨合阶段”,而我之前经历的项目大多是游戏相关开发,大部分项目成员是秉持着“热爱”的心态去进行开发,但是作为一个项目我个人提出的需求并不能够使每一个人满意,大家会在这个阶段进行大量无意义的变更需求和辩论,最终导致时间白白浪费项目不了了之,而我采用过里面“独裁”的方式进行管理,又产生了一个新的问题————开发者从一个“创造者”变成一个写代码的“机器”,这样对于开发者和管理者之间是否会产生裂隙?如果会,是否有更好的方法?

问题五

问题五、书中的第12章提到了用户体验这个问题,作为开发者,我们应该如何界定自己的软件风格,是否是需要针对自己的目标人群进行开发处理?简单的一个例子,作为聊天软件,QQ和微信相比,微信的界面更加简洁,但是相对的,功能也不够丰富,QQ虽然功能丰富,但是界面显得略微繁琐,而Tim这款qq的衍生产品又将简洁做到了更进一步,给予用户更好的体验,那么为什么不用tim一类的软件取代QQ的风格呢?

任务二 WordCount编程项目

github项目地址(https://github.com/luogugu/PersonalProject-Java)

PSP表格

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

分析需求

1、使用命令行进行读入读出;
2、需要进行多次文件读写;
3、检测文件的具体内容并输出;

解题思路

首先,本题需要使用命令行传递文件地址,因此考虑使用args[]读入两个参数;其次,需要进行文件读写,因此使用FileReader/FileWriter(后经同学指导更改为缓冲流BufferReader/BufferWriter);

编码规范(https://github.com/luogugu/PersonalProject-Java/blob/main/221801320/codestyle.md)

计算模块接口的设计与实现

本次共有两个类,分别为主运行类WordCount和函数接口类Lib;
其中函数接口类中实现以下接口;

        Lib.charactersCount(inputFile,outputFile);//统计文件字符数量
        Lib.wordsCount(inputFile,outputFile);//统计文件单词数
        Lib.linesCount(inputFile,outputFile);//统计文件有效行数
        Lib.wordNum(inputFile,outputFile);//统计文件的单词数

运行结果
"

主要函数设计

1、检查字符数,使用Reader.read函数,逐个读入数据,遍历整个文件;

while( reader.read() != -1) {
  numCount++;
}

2、检查是否为空行,同样考虑使用read函数,将其强制转化为char类型与制表符和换行符对比(更新:现已加入\r);

while((temp = reader.read()) != -1) {
  while(temp != -1 &&(char) temp != '\n') {
    if((char)temp != ' '&&(char)temp != '\n' && (char)temp != '\t' && (char) temp != '\r') {
        line += (char)temp;
        }
    temp = reader.read();
    }
   if(line != "") {
        numCount++;
}

3、检查并统计使用频率最多的单词,开始时考虑使用简单的二维数组,但是当数据数量大幅度增加时或者当个高频词汇变得更多是时,占用的内存空间会大幅度增加,因此在参考比对其他人的代码后,选择使用带键值的Map进行统计

                    if (isValidChars(chars)) {
	                if (words.get(word) == null) {
	                    words.put(word, Integer.valueOf(1));
	                } else {
	                    words.put(word, Integer.valueOf(words.get(word).intValue() + 1));
	                }
	            }
	            if (temp >= 65 && temp <= 90) {
	                temp += 32;
	            }
	            word = "" + (char) temp;
	        }
	        Map<String, Integer> result = words.entrySet().stream()
	                .sorted(new Comparator<Map.Entry<String, Integer>>() {

	                    @Override
	                    public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) {
	                        if (o1.getValue().equals(o2.getValue())) {
	                            return o1.getKey().compareTo(o2.getKey());
	                        } else {
	                            return o2.getValue().compareTo(o1.getValue());
	                        }
	                    }
	                })

优化改进思路

由于时间的原因没有办法进行更进一步的优化,但是有了一定思路,在我的代码中,每一个函数都需要进行一次io的处理,打开一次文件关闭一次文件,在本次作业中自然不是特别要紧,但是如果需要输出的条目增加,那么是否可以将所有的读取记录和写入记录在同一个文件之中,使用StringBuffer似乎可以实现。

单元测试

测试部份主要是将每个函数单独提取进行独立测试
测试函数

    @org.junit.jupiter.api.Test
    void wordsCount() throws IOException {
        String inputFile = "F:\\coding\\java\\wordcount\\1.txt";
        String outputFile = "F:\\coding\\java\\wordcount\\1.txt";
        Lib.wordsCount(inputFile, outputFile);
    }

charactersCount函数

wordsCount函数

linesCount函数

wordNum函数

异常

由于时间安排不当,目前仅有检测当文件路径不存在时抛出异常

		try {
			reader = new InputStreamReader(new FileInputStream(file));
		}
		catch(FileNotFoundException e) {
			e.printStackTrace();
			System.out.println(ERROR_MESSAGE);//当没有找到该路径的文件时,抛出错误信息
		}

心路体验

总结来说,这次编程作业几乎暴露了自己绝大多数短板
1、错误估计自己的能力:预估3天左右能够完成,一直拖延,导致最终很多功能来不及优化
2、编程能力偏弱:对于代码和算法的敏感程度不高,几乎没有自己的思路,都是靠着其他来源的代码思路进行编写
3、忽视细节:比如在检测空行行数中的“\r”到几乎最后才发现没有检测
4、实践能力不足:比如对git的使用以及对于网络引擎的使用不够到位
综上所述:我真的太菜了,后续还需要好好努力.....

posted @ 2021-03-05 22:42  无祂  阅读(123)  评论(3编辑  收藏  举报