https://github.com/SkateCloud/wcProjava
PSP2.1 | PSP阶段 | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 30 | 60 |
Estimate | 估计任务须要多少时间 | 30 | 60 |
Development | 开发 | 120 | 180 |
Analysis | 需求分析 | 20 | 30 |
Design Spec | 生成设计文档 | 20 | 30 |
Design Review | 设计复审 | 20 | 30 |
Coding Standard | 代码规范 | 30 | 10 |
Design | 具体设计 | 30 | 50 |
Coding | 具体编码 | 30 | 40 |
Code Review | 代码复审 | 30 | 40 |
Test | 测试 | 50 | 10 |
Reporting | 报告 | 70 | 240 |
Test Report | 测试报告 | 30 | 100 |
Size Measurement | 计算工做量 | 20 | 60 |
Postmortem | 总结 | 20 | 80 |
合计 | 280 | 480 |
本人负责的是核心模块,即对输入的文件读取后的结果进行单词排序并存入List
结构中准备输出git
对从输入模块获取的数据存入hashMap
中,再将Map
结构转变成List
结构进行单词排序,为输出模块准备接口github
先使用Map<String, Integer>
结构对输入模块传来的数据进行存储.编程
HashMap<String,Integer> words = new HashMap<>(); String str = readFile(args[0]); { int state = 0; int beginIndex = -1; for (int i = 0; i <= str.length(); ++i) { char ch = i == str.length() ? ' ' : str.charAt(i); boolean isWordChar = ('a' <= ch && ch <= 'z') || ('A' <= ch && ch <= 'Z') || ch == '-'; if (state == 0 && isWordChar && ch != '-') { beginIndex = i; state = 1; } else if (state == 1 && !isWordChar) { String word = str.substring(beginIndex, i).toLowerCase(); words.put(word, words.getOrDefault(word, 0) + 1); state = 0; } } }
因为外部存储机构使用的是Map.Entry<String, Integer>
,不便于排序等操做,因此将map转化为List结构,进行排序数组
List<Map.Entry<String, Integer>> list = new ArrayList<>(); list.addAll(words.entrySet()); list.sort((lhs, rhs) -> { int cmp = -lhs.getValue().compareTo(rhs.getValue()); if (cmp != 0) return cmp; else return lhs.getKey().compareTo(rhs.getKey()); });
保证设计的测试用例应至少覆盖函数中全部的可执行语句,同时主要空数组、最差状况、词频排序、字母排序、二者混合等各类状况设计测试用例。多线程
使用测试脚本进行单元测试,过程以下模块化
单元测试效果良好,没有报错函数
咱们小组齐心合力, 攻克难关,积极讨论,指出问题,我认为个人小组贡献分是0.4工具
我选择了代码风格规范中:断行与空白的{}行、分行、命名、下划线、大小写;性能
代码设计规范中:函数、错误处理、new和delete、类型继承,模块化
个人编程习惯与以上附录中所述规范大体相同。而在其余如代码审查等重要规范上有待提升。
我分析了本身的代码,缩进、断行风格整洁,命名简单明了,逻辑清晰易读,但在代码设计规范上,模块化不足,不易于进行团队的coding工做,常常在git操做上发生冲突.
最后决定将团队代码进行整合重构,重构任务由我完成,故最终贴出组长的重构代码
public class wordcount { public static void main(String[] args) { long t1 = System.currentTimeMillis(); new wordcount().start(args); long t2 = System.currentTimeMillis(); long dt = t2 - t1; System.out.println(("Elapsed " + dt + "ms")); } private void start(String[] args) { HashMap<String,Integer> words = new HashMap<>(); String str = readFile(args[0]); { int state = 0; int beginIndex = -1; for (int i = 0; i <= str.length(); ++i) { char ch = i == str.length() ? ' ' : str.charAt(i); boolean isWordChar = ('a' <= ch && ch <= 'z') || ('A' <= ch && ch <= 'Z') || ch == '-'; if (state == 0 && isWordChar && ch != '-') { beginIndex = i; state = 1; } else if (state == 1 && !isWordChar) { String word = str.substring(beginIndex, i).toLowerCase(); words.put(word, words.getOrDefault(word, 0) + 1); state = 0; } } } List<Map.Entry<String, Integer>> list = new ArrayList<>(); list.addAll(words.entrySet()); list.sort((lhs, rhs) -> { int cmp = -lhs.getValue().compareTo(rhs.getValue()); if (cmp != 0) return cmp; else return lhs.getKey().compareTo(rhs.getKey()); }); try (FileWriter fout = new FileWriter("result.txt")) { int maxsz = Math.min(list.size(), 100); for (int i = 0 ; i < maxsz; ++ i) { Map.Entry<String, Integer> item = list.get(i); fout.write(item.getKey()); fout.write(' '); fout.write(item.getValue().toString()); if (i != maxsz - 1) fout.write('\n'); } } catch (IOException ex) { throw new RuntimeException(ex); } } private String readFile(String path) { // 读文件 try { byte[] encoded = Files.readAllBytes(Paths.get(path)); return new String(encoded, "UTF-8"); } catch (IOException ex) { throw new RuntimeException(ex); } } }
使用的是IDEA的插件Ant Build中的检错功能
Ant Build是一个Java自动化生成工具,其检错功能用来检查类或者jar文件,用来发现可能的问题。检测完成以后会生成一份详细的报告,借助这份报告能够找到潜在的bug.
检测范围
检测结果在右上角,能够看出仅有少许警告,根据IDEA红线标注可发现大可能是声明方式不是按照目前使用的java标准,没有发生内存泄露等问题.
设计,评审,优化
选择10kb,50kb,182kb大小的txt文件进行测试,程序处理时长以下:
输入输出:1ms,1ms,2ms
单词统计:20ms,150ms,540ms
词频排序:6ms,8ms,10ms
单词统计时间与文件大小呈线性相关,其余两个模块占比较小,故程序性能主要受到文件大小影响。组内共同对代码结构和细节进行详细审查并与其余组程序对比,整理获得以下观点:
1.整合重构是正确的,不只增长了代码的可读性和规范性,还大幅增长了程序的性能
2.将大部分功能模块汇集在一个类方法中,虽然会致使代码耦合度增高,不易于团队维护和再开发,可是减小了模块间相互调用的开销和随之产生的内存开销
经过基本任务、扩展任务、到高级任务的完成以及中间遇到的许多困难,体现出了软件测试对于软件开发的重要性。在开发过程当中,使用静态测试工具实时地检测本身的代码,能够改正本身不良的编程习惯,更能防患于未然,减小出现bug的可能;对本身的模块进行单元测试,能够保障本身代码的正确性,更是对其余开发成员和整个任务的负责,使软件开发可以一步一个脚印地稳定开展;对性能的分析与测试,能使软件的质量进一步提升,同事能总结开发经验,使本身设计的模块更加高效。