首页 > 技术文章 > 第一次个人编程作业

mhq-mhq 2019-09-29 17:26 原文

第一次个人编程作业

1.Github项目地址:https://github.com/mhqmhy/021700125

2.PSP表格

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

3.计算模块接口的设计与实现过程

3.1解题思路

题目的本质:字符串处理与匹配
1.针对第1级难度,删除感叹号和句号,利用正则表达式匹配11位数字,把11位电话单独取出保存,然后划分五级地址
2.剥去之后,剩下的就是地址了,匹配直辖市/省"、"直辖市/市"、"区/县/县级市"’、"街道/镇/乡"、"详细地址"五级,(自己手动打表,列了一个所有省,市,县(区)的列表),遍历搜索到表中存在的元素,
3.针对第2级难度,就在无极地址划分的基础上,在详细地址上划分七级,把详细地址划分成"路名"、"门牌号"、"详细地址"等
4.针对第3级难度,本来一开始没有什么思路,难道需要我把所有七级地址库的数剧全部爬下来么,尚且不问自己会不会爬虫,就想问能不能爬到,这是一个问题,爬到了怎么建立关系去索引匹配也是一个问题.
5.后来查找资料,以及询问隔壁班的大佬,知道了高德地图api这个东西。
6.简单介绍一下如何请求高德地图api爬取数剧:高德的Web服务api具有地理/逆地理编码功能,先将输入的地址编码成经纬度坐标,再用经纬度坐标逆编码出准确地址,把之前缺失的等级划分用调用api返回的相应等级地址补全;没想到竟然有这样神奇的东西,真的感叹科技的强大

3.2计算模块接口的实现

函数 功能
find_5_address 查找关键字匹对,五级地址划分
find_7_address 在五级地址划分的基础上,对地址七级划分
get_formatted_address 在find_7_address划分七级地址后查找出为空字符串的缺失地址,再使用它通过调用api获取地址详细地址json对象的返回值,实现补全的功能
  • 程序流程图

3.3独到之处

  • 可读性比较强,逻辑简单,只有一个py文件,没有其它json,数据库等等的依赖文件,方便大家阅读,也方便同学们评测
  • 代码里只有3个函数,每一级难度对应一个函数,有上而下,基本做到了高内聚,低耦合
  • 代码直接暴力打表,直接查询一、二、三、四级地址,直接索引,比较直观形象

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

4.1代码质量分析

本来是准备在Pycharm上下一个插件Pylint检查代码的质量,后来听大佬说codacy很好用,所以就尝试了一下。但是也很不容易,自己平时是一个编程习惯很不好的人,果然各种Warning,Refactor就来了,然后开始一系列的删空格,数空格,填空格,开始了一系列的驼峰命名法。以后的真的要注意代码格式和规范的问题,很不容易

4.2代码性能测试

  • 从上面可以看出,程序大多数时间是花在了输入上后来仔细分析了一下,为了去除等待输入的时间,这里直接赋初值,

  • 于是发现时间不会集中在等待输入方面,但是依然get_formatted_address(address)函数请求url的时间比较多虽然直接调用高德地图api的效果很好,补全地址效果也不错,但是该方法还是存在一定瓶颈或者说隐患,即高德地图的个人开发者的地理正/逆编码服务每日调用量是有限制的。

  • 如果说改进也是有可以改进的地方,可以预先通过高德api爬好数据,然后打造一个五级,七级地址庞大的数据库,然后通过索引一个一个地查询匹配,这样性能会更加均衡点。但爬虫,数据库啥地我还不怎么太会,所以这次怎么简单怎么来吧。

  def get_formatted_address(address):
       #根据百度地图api接口获取正地址编码也就是经纬度
      url1='https://restapi.amap.com/v3/geocode/geo?                          address='+address+'&output=JSON&key=a22337e1181873a
      96bc9701887d1c349'

     #获取经纬度
     resp1=requests.get(url1)
     #resp1_str=resp1.text
     #resp1_str=resp1_str.replace('showLocation&&showLocation','')
     #resp1_str=resp1_str[1:-1]
     resp1_json=resp1.json()
     location=resp1_json['geocodes'][0]['location']

     #根据经纬度获取结构化地址
     #lng=location.get('lng')
     #lat=location.get('lat')
     url2='https://restapi.amap.com/v3/geocode/regeo?output=JSON&location='+location+'&key=a22337e1181873a96bc9701887d1c349&radius=5&extensions=all'
     resp2=requests.get(url2)
    
     resp2_json=resp2.json()
     #提取结构化地址
     formattted_address=resp2_json['regeocode']['addressComponent']
     return formattted_address

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

选取10个测试用例,1级难度,2级难度,3级难度均衡分布。

1!鲁胞,上海长宁区周18951233466家桥街道长宁路999号春天花园.
1!臧街经,北京市东城区北新桥街道东直门内大街民15679601503安小区8号楼.
1!双韵,安徽黄山市歙县雄村镇006县道与G56杭瑞高速歙县雄村乡防保站13575634949.
2!澹台拄云,浙江省杭州市丁兰街道环丁路10号明珠15244068259.
2!蒯刑浦,吉林省白城市洮南市团结街道兴安南街5566号安泰社区公共事务13949401891服务中心.
2!汲痰廊,13585841307浙江舟山市普陀区六横镇台兴路202号台门中学.
2!皇甫宁,浙江省温州市文成县南田镇朱宅路20号南田15217337889镇人民政府.
3!艾堤,北京市海淀区阜成15938433933路八宝庄小区8号楼.
3!柯彰,浙江省西湖区蒋村街道晴川街2号蒋村13675029411花园83幢.
END

最后的代码覆盖率有点低,可能是自己太懒了,没有想太多的测试用例

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

  • 没输入题目等级,应直接中断程序并提示“没有等级,请输入题目等级号”

!韩梅梅,广东省珠海金湾区三灶1234567镇乐康街一巷11号三灶镇海澄村委会.

  • 手机号位数出错,提示“没有手机号码,请确认手机号码”

1!韩梅梅,广东省珠海金湾区三灶1234567镇乐康街一巷11号三灶镇海澄村委会.

  • 姓名后缺少逗号,处理完姓名应返回空串并提示“没有逗号,请检查输入的姓名后是否缺少逗号”

1!韩梅梅广东省珠海金湾区三灶1234567镇乐康街一巷11号三灶镇海澄村委会.

  • 没有输入姓名,应直接中断程序并提示“没有姓名,检查输入的姓名是否错误”

1!,广东省珠海金湾区三灶1234567镇乐康街一巷11号三灶镇海澄村委会.

grade,all = sub_grade(all)      
name,all = sub_name(all)
tel,all= sub_tel(all)
address = sub_address(all)

except ValueError:
print("ValueError !")
except KeyError:
print("KeyError !")
except IndexError:
print("IndexError !")
except Exception:
print("OtherError !")
else:
province,city,district,town,street =find_5_address(address)


##7.项目感悟
这次损失的地址薄也算是自己的第一次项目,从什么都不会到开始询问大佬,查找作业,同学间相互讨论,也算是一次难忘的学习体验。python语言还是蛮强大的,爬取高德地图API的数剧,然后补全,我觉得这个是项目的核心,也是自己需要学习的最关键地方。接下来软工的日子加油!

推荐阅读