第一次个人编程作业
第一次个人编程作业
PSP表格
PSP2.1 | Personal Software Process Stages |
预估耗时 (分钟) |
实际耗时 (分钟) |
---|---|---|---|
Planning | 计划 | 30 | 60 |
· Estimate | · 估计这个任务 需要多少时间 |
1440 | 1800 |
Development | 开发 | 1320 | 1630 |
· Analysis | · 需求分析 (包括学习新技术) |
300 | 360 |
· Design Spec | · 生成设计文档 | 45 | 60 |
· Design Review | · 设计复审 | 10 | 15 |
· Coding Standard | · 代码规范 (为目前的开发 制定合适的规范) |
15 | 15 |
· Design | · 具体设计 | 120 | 120 |
· Coding | · 具体编码 | 450 | 540 |
· Code Review | · 代码复审 | 30 | 40 |
· Test | · 测试(自我测试, 修改代码,提交修改) |
380 | 480 |
Reporting | 报告 | 120 | 170 |
· Test Repor | · 测试报告 | 90 | 100 |
· Size Measurement | · 计算工作量 | 30 | 40 |
· Postmortem & Process Improvement Plan |
· 事后总结, 并提出过程改进计划 |
30 | 30 |
· 合计 | 1440 | 1800 |
解题思路
刚开始拿到题目的时候,我内心是拒绝的,题目太长,要求太多,看得头晕晕的,差点人没了。后来静下心来,仔细看完题目后,第一感觉就是上网找个全国地址的文件载入一下,一级级匹配就好了,剩下的不管附加题的前提下我觉得本质上这就是一道字符串处理的问题,只是以往处理的字符串只有数字、字母、符号,现在多出了中文了。
这时候我心中还是想用C++ 写的,自己对C、C++ 也比较熟悉,认为弄明白了C++ 怎么处理中文就好了。于是我憨憨地开始了学习之路,那天晚上我一直学到了凌晨4点。淦!怎么和我想的不一样啊,C++ 处理中文也太麻烦了吧,占三个字节也就算了,还不能直接对中文转码,学了一晚上啥都没学会,我也太菜了吧,我哭了……然后我就上床睡觉了。
第二天早上醒来,我坐在电脑面前发了会呆,然后默默的删掉了C++ 的文件,新建了py文件,并打开浏览器开始学习Python。边学边做,啥不会就查,摸摸索索了一天才终于完成个人模狗样,唉,生活所迫。
使用Python的思路:
- 先将姓名和电话(正则表达式)提取出来。
- 从省份开始一级级匹配下去,四个直辖市特殊处理。
- 省市至少要前两个字相同即可匹配,区、街道得完全一样才可匹配。
- 省市不会缺失,那么只要处理如果区(即第三级字典)缺失后遍历下级字典的问题,双重循环一下即可解决。(补充:后面发现永福大佬说明如果有“县”,市可能会缺,遂修改了一下,仍然是双重循环解决。)
- 对于第二级别难度,再详细分析剩下的字符串,根据查找的路名级别的各种可能后缀进行匹配,区分出路名和门牌号。
- 附加题随缘,能学会调api就做。
重点是调api好像也有可能补不全地址,我累了
接口设计及实现过程
一开始写C++ 的时候写了addressbook类,然后按照省、市、区、街道、路、门牌处理字符串的函数void Get_province()、void Get_city()、void Get_area()、void Get_street()、void Get_road()、void Get_door()
后来换成Python之后,半吊子现学现卖的我,对于Python的类、函数的掌握不够,或者说是对整个Python的掌握太差,使用类、函数和字典遍历一结合就会出现一些目前我无法解决的bug,很难受,所以目前没有完全把各个功能拆开为类、函数,只实现了一些没出现bug的函数。但实现过程中还是和C++ 当时的思想一样,流程图如下:
关键及独到之处
各级地址通过字符串和字典匹配,没有用正则表达式,因为每级地址的后缀名都有很多很多种,如果没有完全考虑到的话很容易在某些测试点出错,字符串比较正则表达式虽然代码长了点,但用得安稳,哎嘿!
性能改进
性能分析图如下(使用VS自带的Python分析器得到):
改进程序性能可太难了,改了老半天还没改进多少,其实主要是太菜了,不懂怎么改进,能写出一个能运行、能出结果的,我已经笑得很开心了。一开始的改进思路就是json文件的问题,本来是载入文件转成字典了,后来评测工具不会从GitHub上下载json文件,只下载py文件,就只能复制粘贴进去了,一下子代码从170+行变成了5W+行,人傻了。本来琢磨怎么不复制粘贴不用额外文件,看群里ymz巨佬说的资源文件,愣是没搞明白。算了,5W就5W吧,所以这性能就很差劲。后续就是改进一些细节,比如繁琐的步骤缩减或者改进函数。消耗最大的函数竟然是input,我是真的菜哭了
单元测试:
2!李四,福建省福州13756899511市鼓楼区鼓西街道湖滨路110号湖滨大厦一层.
{'姓名': '李四', '手机': '13756899511', '地址': ['福建省', '福州市', '鼓楼区', '鼓西街道', '湖滨路', '110号', '湖滨大厦一层']}
1!张三,福建福州闽13599622362侯县上街镇福州大学10#111.
{'姓名': '张三', '手机': '13599622362', '地址': ['福建省', '福州市', '闽侯县', '上街镇', '福州大学10#111']}
2!王五,福建省福州市鼓楼18960221533区五一北路123号福州鼓楼医院.
{'姓名': '王五', '手机': '18960221533', '地址': ['福建省', '福州市', '鼓楼区', '', '五一北路', '123号', '福州鼓楼医院']}
3!小美,北京市东15822153326城区交道口东大街1号北京市东城区人民法院.
{"姓名": "小美", "手机": "15822153326", "地址": ["北京", "北京市", "东城区", "", "交道口东大街", "1号", "北京市东城区人 民法院"]}
1!小陈,广东省东莞市凤岗13965231525镇凤平路13号.
{'姓名': '小陈', '手机': '13965231525', '地址': ['广东省', '东莞市', '', '凤岗镇', '凤平路13号']}
1!李逵,福建省泉州市洛江15260894532区双阳街道新阳社区卫生所.
{"姓名": "李逵", "手机": "15260894532", "地址": ["福建省", "泉州市", "洛江区", "双阳街道", "新阳社区卫生所"]}
2!吴迪,广东省广州市13224689157海珠区逸景路333号人民法院.
{"姓名": "吴迪", "手机": "13224689157", "地址": ["广东省", "广州市", "海珠区", "", "逸景路", "333号", "人民法院"]}
2!拉克丝,新疆维吾尔自治区阿克12345678954苏地区阿克苏市金土地农哈哈大世界交通路25号金土地大厦.
{"姓名": "拉克丝", "手机": "12345678954", "地址": ["新疆维吾尔自治区", "阿克苏地区", "阿克苏市", "", "金土地农哈哈大世界交通路", "25号", "金土地大厦"]}
覆盖率
通过向大佬学习,使用了Python的coverage模块来进行检测,预期中会是惨不忍睹的,毕竟是面向数据编程,对各种样例情况进行了特殊分析(小声
一测完,淦!自己果然是垃圾,竟然只有52%,太菜了太菜了,怎么改进呢,emmmmm,不改了,不能做不自量力的事。
异常处理
-
如果遇到输入当中没有手机号或者不是11位数字的手机号便会报错。将手机号记为NULL.
-
遍历字典的时候如果键值不存在也会报错,KeyError,针对这类情况进行了特殊处理,用多重循环解决。
-
构建字典转成json对象输出时,如果构建字典后面多加了一个“,”,不会报错但是输出的格式便不对,会变成str字符串,去掉“,”即可。
-
针对第三级别难度可能出现前四级地址缺失的情况(毕竟我没做好第三级别),做了异常处理。避免出错直接爆0了,我太难了。
心路历程与收获
我真的佛了 一堆事情堆在这一周,我已经连续熬了五天夜,只有一天因为第二天早上有课只熬到两点,其他4点起步,现在早上起来明显感觉胸闷,我人真的要没了,第一次博客作业就问愿不愿意熬夜,我现在明白为啥问这个问题了,这就是充实的大三生活吗。我太难了。
最大的心路历程就是从C++转到Python,熬夜自学看日出的体验;以及同学之间互相帮助的过程,在此特别感谢曾世缘、潘海东两位同学,没有他们的帮忙和建议,我是真的要逝世了。这次也已经开始体会到了组团熬夜的温暖了,就是身体确实难顶,希望以后作业别这么难了,要自学、要做的东西太多了,不仅代码方面,博客撰写这边也要求贼多,难顶难顶。
有一个不成熟的小意见:技术助教和同学之间交流的问题,作业发布后技术助教才能接触到题目着手做测试工具,但技术助教们也忙,不能一整周都在做这工具,做出的工具一开始肯定也有许多问题,还有一些文件、编码七阿八的约束,同学们用起来也很麻烦,甚至用不了。同学们也忙,这样子提出一个问题解决一个问题,积压在最后几天,肯定不太彳亍。我认为可以让助教们提早就去做,时间多助教们也不会太累,比如我听说往年暑假就开始布置软工前期工作了,像这样就挺好的。
收获肯定还是颇丰的,虽然为此付出的代价也很大。这第一次个人编程作业,逼着我重拾了Python,感受到了Python的好!之前只有选修课接触过Python,考完试后也没有坚持学下去,现在想起来是有点可惜,不过现在重新开始以后肯定不会再荒废了!果然还是要不断学习,多学些语言,多锻炼锻炼自己!