1.Github项目地址
2.PSP表格
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 30 | 35 |
· Estimate | · 估计这个任务需要多少时间 | 30 | 35 |
Development | 开发 | 1000 | 1710 |
· Analysis | · 需求分析 (包括学习新技术) | 240 | 360 |
· Design Spec | · 生成设计文档 | 20 | 30 |
· Design Review | · 设计复审 | 10 | 10 |
· Coding Standard | · 代码规范 (为目前的开发制定或选择合适的规范) | 20 | 30 |
· Design | · 具体设计 | 260 | 280 |
· Coding | · 具体编码 | 240 | 700 |
· Code Review | · 代码复审 | 90 | 150 |
· Test | · 测试(自我测试,修改代码,提交修改) | 120 | 150 |
Test Report | 报告 | 105 | 120 |
· Test Report | · 测试报告 | 60 | 60 |
· Size Measurement | ·计算工作量 | 20 | 25 |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出改进计划 | 25 | 35 |
合计 | 1135 | 1765 |
3.解题思路描述
①看到题目后,首先想弄清楚什么是json文件,百度了一下发现JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。再经过仔细观察题目后,可以看出数据主要分为姓名、电话和地址三个划分,其中地址格式比较复杂,又分为了几级,一级是省,二级是市,三级是县/区,四级是街道/镇,五级是详细地址。也就是题中所说的["直辖市/省","直辖市/市","区/县/县级市","街道/镇/乡","详细地址"]。
②接着发现可以用正则表达式把手机号从地址中提取出来,于是去搜索了相关函数用法;同时也发现姓名后都跟着一个“,”,因此可以使用逗号作为标志将姓名也划分出来。
③最后是地址,首先考虑有省市区关键字的情况,同样也可以用正则表达式,通过匹配省市区将地址划分为五级;但是也存在没有省市区的情况的划分,这时就想到可以通过传入包含全国省市区划分的文件来与字符串进行扫描匹配,从而划分出省市区。
4.计算模块接口的设计与实现过程
设计包括代码如何组织,比如会有几个类,几个函数,他们之间关系如何,关键函数是否需要画出流程图?单元测试是怎么设计的?
- 总共设计了三个类,一个是放主函数的类,一个是用来提取出手机号码的类,另一个是对地址进行分类的类。
- 在最主要的类中,我放了一个主函数,主要实现的功能是读取文件。接着把文件中内容赋值给一个字符串并调用传入getFile()函数。在getFile()函数中,我先判断文件是否存在,如果存在则把字符串的其中字符转为UTF-8的格式;然后建立一个缓存并把传入的字符串存入一个新的字符串中,循环读取每一行,运用substring()函数先将姓名提取并输出;最后把姓名和姓名逗号后的字符串传入了CheckIfIsPhoneNumber类,也就是我主要实现用来提取手机号码功能的类,同时调用了其中的getPhoneNumFromStrIntoSet()函数。
- 在这个新的类的函数中,我用了正则表达式来判断手机号码,以此来寻找与该模式匹配的输入序列的下一个子序列。接着我利用循环获取到之前匹配成功的代表手机号的字符串,然后用replace()函数把手机号也去除掉,最后转向了用来分割地址的CheckAddress类。在CheckAddress类中,我设立了一个addressResolution()函数,也是利用正则函数匹配以省市区等为关键词的字符串并进行划分输出。
5.计算模块接口部分的性能改进
记录在改进程序性能上所花费的时间,描述你改进的思路,并展示一张性能分析图(由VS 2017的性能分析工具自动生成),并展示你程序中消耗最大的函数。
在改进程序性能的过程中,因为主要程序并不完善,所以所花的改进时间主要使代码正确,大概用了120分钟。
主要观察了如何才能更好的匹配并划分地址。
- 性能分析图
6.代码说明
展示出项目关键代码,并解释思路与注释说明。
- 在用来提取出手机号码的类中,使用正则表达式来判断手机号码的关键代码为
String regexp = "1\\d{10}";
因为手机号必然为1开头,而且手机号是连续的11位数字,而题目中有说不会出现地址中的数字与手机号相连的情况,因此只要先匹配到开头的数字1后如果后面跟着10位数字则可以找出手机号。
- 在对地址进行分类的类中,使用正则表达式来判断省市区的关键代码为
String regex = "(?<province>[^省]+自治区|.*?省|.*?行政区|.*?市)?(?<city>[^市]+自治州|.*?地区|.*?行政单位|.+盟|市辖区|.*?市|.*?县)(?<dist>[^县]+县|.+区|.+市|.+旗|.+海域|.+岛)?(?<distttt>[^区]+区|.+镇|.+街道)?(?<village>.*)";
划分省市区我是依照关键字进行,所以用了正则表达式,虽然也有把全国省市区划分文件读入然后遍历进行匹配字符串的想法,但是没有实现成功,因此采用了这种方法匹配出地址中的省市区关键字,匹配后成功后进行输出。
7.计算模块部分单元测试展示
展示出项目部分单元测试代码,并说明测试的函数,构造测试数据的思路。并将单元测试得到的测试覆盖率截图,发表在博客中。
测试是使用eclemma来执行。
- 通过单元测试得到的覆盖率:
8.计算模块部分异常处理说明
在博客中详细介绍每种异常的设计目标。每种异常都要选择一个单元测试样例发布在博客中,并指明错误对应的场景。
错误样例:
[{"���":"C���","���":"13756899511","���":["���","���","���","����","����110�����"]}
- 异常:出现了乱码
- 原因:输入文件未把把编码改成UTF-8
9.结合在构建之法中学习到的相关内容与个人项目的实践经历,撰写解决项目的心路历程与收获。
通过不断的搜索学习,我知道了在解决一个题目的时候要学会坚持,有时候当一个地方想不出来的时候,要有刻苦专研的精神,不轻易放弃,很可能就能终于想出方法;但同时也要学会灵活应对,面对一种方法无论如何也无法取得进展时,可以换种思路,变换思维方式,说不定柳暗花明又一村,找到了更快捷更合适的解决方案。
一开始学习的时候,我感到很困难,虽然有些想要放弃,但还是从最基本的开始学习,慢慢了解到如何使用函数,如何对字符串进行分割,终于一点一点地打出了代码。但是代码还有很多不完善的地方,仍需大量的时间去学习和改善,在这个过程中虽然很辛苦,但是也学到了不少的知识。在学习构建之法的过程中,我学到了一些基础知识和概念,了解了如何分析和测试,知道了当实现一个项目时不应该仅仅只是打代码,而是应该先分析用户使用功能的需求,接着列出相关设计和说明来进行开发。
另外构建之法也让我们我们了解到一些基本技术,比如单元测试和效能分析工具等,感觉仍有很多地方需要去学习。同时我也学会了在打代码前可以先填PSP表格,先规划好个人开发的流程,在实际操作中才更有条理。