第一次个人编程作业

第一次个人编程作业

一、Github链接

个人仓库

二、PSP表格

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

三、计算模块接口的设计与实现过程

看到题目的时候,因为要实现地址匹配,正好python中有正则的模块,便决定用python来做(反正用哪种语言都是要重新学习,觉得python可能比较简单吧,也顺便学习一下python...),于是开始了漫漫学习python之路,先是看了正则那一块(各种规则搭在一起就好难啊),然后开始实现简单的姓名和手机号匹配,在要匹配地址的时候发现某些省市会有缺省的情况,于是准备导入省市区三级地址xml文件来解析,好不容易似乎看起来可以匹配出来了,得知python测试不能用其他文件(哭),开始了暴力打表......终于在中午打完一份粗糙的代码

  • 基本实现过程
    • 先用正则表达式将姓名,手机提取出来,去掉多余的字符,留下一串地址
    • 用正则表达式匹配省,市前二级地址(后缀完整的情况)
    • 将全国省市二级地址保存为字典,按照省市区级别逐一对地址进行匹配(后缀缺失情况)
    • 用正则表达式匹配乡镇街道,实现五级地址划分
    • 接着用正则表达式匹配出道路名,门牌号等内容,实现七级地址划分内容
    • 若有缺失的地址则返回空字符串,缺失的地址可利用高德api的地址查询来进行补全
函数 功能
getname函数 匹配姓名
getphone函数 匹配手机号码
getaddress函数 将姓名,手机号码和多余符号切去,得到原始地址字符串
addr函数 匹配地址进行分割,将结果规范输出为json格式(包含前两级难度情况)
autoCorrAll函数 利用高德api对残缺地址进行补全(第三级难度)

代码关键是匹配出省市二级地址部分,因为这两部分存在缺少后缀的情况,解决思路:先用正则表达式匹配地址完整的情况,如果匹配出错,利用字典中的二级地址进行匹配
img

四.计算模块接口部分的性能改进

程序中消耗最大的函数是addr函数,我的改进思路是因为在前两级难度中只有前两级地址会缺省后缀,因此在后三级地址匹配中只要利用正则表达式就可以直接匹配
img
img

五.计算模块部分单元测试展示

测试代码

    def autoCorrAll(result,line):
        line = re.sub('#', '', line)
        parameters = { 'address' : line,  'key' :  '05438f699af4c1902c8230559a920a0d' }
        base =  'https://restapi.amap.com/v3/geocode/geo'
        data = requests.get(base,parameters)
        result_json = data.json()
        j_w = result_json["geocodes"][0]["location"]
        data = requests.get(
        "http://restapi.amap.com/v3/geocode/regeo?output=JSON&location="+j_w+"&key=05438f699af4c1902c8230559a920a0d&radius=0&extensions=base")
        result_json = data.json()
        info = result_json["regeocode"]["addressComponent"]
        province = info["province"]
        city = info["city"]
        region = info["district"]
        country = info["township"]
        street = info["streetNumber"]["street"]
        number = info["streetNumber"]["number"]
        detail = []
        detail.append(province)
        detail.append(city)
        detail.append(region)
        detail.append(country)
        detail.append(street)
        detail.append(number)
        for i in range(4):
            if result["地址"][i] == "" and detail[i]!=[]:
                result["地址"][i] = detail[i]
        return result
    

这段代码是第三级难度的补全,测试这段代码为了试试能否满足大多数缺失地址补全的功能

测试结果

3!小陈,广东省东莞市凤岗13965231525镇凤平路13号.
{"姓名": "小陈", "手机": "13965231525", "地址": ["广东省", "东莞市", "", "凤岗镇", "凤平路", "13号", ""]}
3!李四,福建省福州137568995112楼区鼓西街道湖滨路110号湖滨大厦一层.
{"姓名": "李四", "手机": "13756899511", "地址": ["福建省", "福州市", "鼓楼区", "楼区鼓西街道", "湖滨路", "110号", "湖滨大厦一层"]}
3!王五,福建省福州市鼓楼18960221533区五一北路123号福州鼓楼医院.
{"姓名": "王五", "手机": "18960221533", "地址": ["福建省", "福州市", "鼓楼区", "温泉街道", "五一北路", "123号", "福州鼓楼医院"]}
3!小美,北京市东15822153326城区交道口东大街1号北京市东城区人民法院.
{"姓名": "小美", "手机": "15822153326", "地址": ["北京", "北京市", "东城区", "交道口街道", "交道口东大街", "1号", "北京市东城区人民法院"]}
3!张三,福建福州闽13599622362侯县上街镇福州大学10#111.
{"姓名": "张三", "手机": "13599622362", "地址": ["福建省", "福州市", "闽侯县", "上街镇", "", "", "福州大学10#111"]}
3!杨忠燎,福建三明市沙县区13599622362上街镇
{"姓名": "杨忠燎", "手机": "13599622362", "地址": ["福建省", "三明市", "沙县区", "上街镇", "", "", ""]}
3!杨忠燎,广东佛山市沙县区13599622362上街镇
{"姓名": "杨忠燎", "手机": "13599622362", "地址": ["广东省", "佛山市", "沙县区", "上街镇", "", "", ""]}
3!杨忠燎,12345678911广东佛山中山大学
{"姓名": "杨忠燎", "手机": "12345678911", "地址": ["广东省", "中山市", "顺德区", "大良街道", "", "", "大学"]}
3!杨忠燎,12345678911福建厦门集美大学
{"姓名": "杨忠燎", "手机": "12345678911", "地址": ["福建省", "厦门市", "集美区", "集美街道", "", "", "集美大学"]}
3!杨忠燎,12345678911福建福州大学
{"姓名": "杨忠燎", "手机": "12345678911", "地址": ["福建省", "福州市", "闽侯县", "上街镇", "", "", "大学"]}

大部分地址可以匹配, 少部分无法补全

覆盖率截图

img

六.计算模块部分异常处理说明

1、手机号码只能匹配11位数,若是其它位数则匹配不出来。

2、部分地址未给出完整的地址,在进行地址匹配的时候如果正则和三级地址都出现匹配不到的情况,则保留空字符串。

3、部分缺失的地址经过高德api的地址查询却无法补全。

七.个人总结

从开始打个人编程第一天起,就莫名进入了一种紧张的状态,首先是对自己的严重怀疑和不自信,其次是ddl好赶啊啊啊,但是大家都是这样没办法,给自己灌满鸡汤后开始学习,由于自己对什么语言都掌握的不熟,学习的过程还是蛮艰辛的,但是又痛并快乐着,获得一点点小进展就觉得好开心啊,可能这就是软工这门课的意义吧,同时也看到了自己欠缺的知识技能真是太多了,以前欠下来的总归是要还的,我以后一定会好好学习努力打代码的www
最后还是要感谢一下周华同志还有不嫌弃我烦的大佬们(就不一一说啦)的帮助,让我第一次自己写出这么长的代码,收获了很多,我会继续努力向大佬看齐的!

posted @ 2019-09-27 23:04  -CTH  阅读(172)  评论(7编辑  收藏  举报