一.GitHub地址
https://github.com/lylinyi/041702108
二.PSP表格
PSP2.1 | Personal SoftwareProcess Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 60 | 90 |
·Estimate | ·估计这个任务需要多少时间 | 30 | 40 |
Development | 开发 | 820 | 1000 |
· Analysis | · 需求分析(包括学习新技术) | 120 | 240 |
· Design Spec | · 生成设计文档 | 30 | 10 |
· Design Review | · 设计复审 | 30 | 20 |
· Coding Standard | · 代码规范(为目前的开发制定合适的规范) | 30 | 30 |
· Design | · 具体设计 | 30 | 60 |
· Coding | · 具体编码 | 400 | 360 |
· Code Review | · 代码复审 | 30 | 40 |
· Test | · 测试(自我测试,修改代码,提交修改) | 180 | 240 |
Reporting | 报告 | 90 | 100 |
· Test Repor | · 测试报告 | 40 | 30 |
· Size Measurement | · 计算工作量 | 20 | 30 |
· Postmortem & Process Improvement Plan | · 事后总结,并提出过程改进计划 | 30 | 40 |
合计 | 970 | 1190 |
三.代码设计与实现
1.解题思路
- 先用正则表达式和字符串处理提取出名称,电话,和难度级别,得到地址.
- 每次提取字符串的前两个字符,根据引入的pcas.json文件逐级匹配,得到前四级的地址.
- 用正则表达式继续匹配得到后三级地址.
- 若为第一级难度,将后三级地址合并,若为第三级难度,则调用高德api得到前四级地址,再回到步骤三.
2.代码结构
在main()函数里创建Address类实例,再调用show_info()打印出json数据.在parse()函数里通过调用get_XX()或call_api()完成对地址的解析,get_XX()里调用了cut_string()用来去掉字符串的某一级地址得到新字符串.
四.性能改进
可以看出parse()里的call_api()函数占用时间最多,改进方法就是尽量少调用api,采用更优秀的查表算法实现地址的补全功能,由于水平太菜未能实现.
五.单元测试
部分函数的覆盖率
样例测试
- 输入
1!何东,北京东城13297814858区朝阳门街道南小街59号竹杆胡同小区.
2!柳吻,辽宁省大连市中山区青泥13013864707洼桥街道上海路45号宏孚大厦苏宁易购.
3!汝舟孙,贵州省修文县龙岗社区15766780930服务中心阳明西路196号龙岗居委会.
3!柏雅蚜,长宁区周家桥街道武夷路718号武夷13757741271花园722号楼.
- 输出
{"姓名": "何东", "手机": "13297814858", "地址": ["北京", "北京市", "东城区", "朝阳门街道", "南小街59号竹杆胡同小区"]},
{"姓名": "柳吻", "手机": "13013864707", "地址": ["辽宁省", "大连市", "中山区", "青泥洼桥街道", "上海路", "45号", "宏孚大厦苏宁易购"]},
{"姓名": "汝舟孙", "手机": "15766780930", "地址": ["贵州省", "贵阳市", "修文县", "龙岗社区服务中心", "阳明西路", "196号", "龙岗居委会"]},
{"姓名": "柏雅蚜", "手机": "13757741271", "地址": ["上海", "上海市", "长宁区", "周家桥街道", "武夷路", "718号", "武夷花园722号楼"]}
,
评测结果
六.异常处理
- 输入手机号位数不是11位
- 难度后没有感叹号
- 名字后没有逗号
- 没有连接网络或调用次数用尽
解决方法示例:
# 每个函数套上try except,例如:
try:
call_api()
except:
print("请连接网络再运行")
try:
get_phoneNum()
except:
print("手机号格式错误")
try:
get_level()
except:
print("难度等级格式错误")
try:
get_name()
except:
print("名字格式错误")