软件工程02—第一次个人编程作业

1、GitHub仓库地址


2、在PSP表格记录估计将在程序的各个模块开发上耗费的时间和实际耗费的时间

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

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

  • 思路

输入的每一条信息形如2!李四,福建省福州13756899511市鼓楼区鼓西街道湖滨路110号湖滨大厦一层.

  • 将字符串中含有11位数字的字段提取出来,即为手机号。
  • 通过","将姓名和地址分离。
  • 解析地址

  • 省级:包括直辖市(北京、上海、天津、重庆)、自治区(如内蒙古自治区)、特别行政区(港、澳)、后缀为“省”的一般省份。首先通过字符串前两个字符与四个直辖市作对比,如果匹配成功,进入处理。否则查询字符串中是否含有“自治区”和“特别行政区”,若查询失败则进入普通省的处理。之后将省级部分从字符串中分离出去。
  • 调用高德行政区域查询API获取该省份下属行政区域信息的列表。
  • 市级:如果省级为直辖市,直接添加在地址列表中。通过字符串前两个字符与列表中市级信息比对,匹配成功则进入处理,否则即视为该等级缺失。将市级部分从字符串中分离出去。
  • 县、乡级:同市级。
  • 第五级:解析字符串是否含有“路”、“巷”、“街”等字符。
  • 第六级:解析“号”。
  • 第七级:将字符串剩余部分添加至地址列表。
  • “省”、“市”字缺失:直接使用API导出的列表中完整的地址名添加至地址列表。
  • 3!难度:在之前匹配时遇到地址缺失,在下一级行政区匹配成功时添加标记,用以存储上一级行政区名字。
  • 代码设计与实现

创建一个类SolveAddress用以解析输入的字符串信息。

  • 算法关键

API:

    url = "https://restapi.amap.com/v3/config/district?key=<?>&keywords=<?>&subdistrict=3&extensions=base"
    map = requests.get(url).json()["districts"]

    地址解析:以市级为例:

    s = self.str[:2] #str = "福州市鼓楼区五一北路123号福州鼓楼医院", s = "福州"
        for i in map: #查询
            if re.match( s,i["name"] ) != None: #查询成功
                self.addr["地址"].append( i["name"] ) #添加至地址列表
                #str切割市级部分 str --->  "鼓楼区五一北路123号福州鼓楼医院"
                if i["name"][-1] == "市":
                    self.str = self.str[ len(i["name"])-1: ]
                    if self.str[0] == "市": #'市'字缺失
                        self.str = self.str[1:]
                else:
                    self.str = self.str[ len(i["name"]): ]
                break
        if re.match( s,i["name"] ) == None: #整个市缺失
            self.addr["地址"].append("")
        else: #API列表往下移一级
            map = i["districts"]
  • 独到之处

  • 函数的复用。函数sov_Add_3()调用sov_Add_2()解析七级地址,函数sov_Add_2()调用sov_Add_1()解析前四级地址。
  • 地址的解析和API所查询的列表同步。API列表是一个分级列表,每一级的列表中的每一元素对应该列表所对应地区所下辖的某一个下级地区的列表。字符串每解析出一级地址后,在将要开始下一级地址的解析之前,API列表也往下移一级,达到同步。

4、计算模块接口部分性能

  • 性能分析图:单个样例,由pycharm的profile生成(局部)。
    程序的时间消耗主要在输入部分???(看不太懂)
    可能是由于每次都要调用API,代码测评运行似乎相比其他人慢。

          

  • 存在的不足/问题/BUG:
  • sov_Add_1()方法解析五级地址时就已执行了难度3的查找缺失地址功能,整个程序的耗时可能会比较长。
  • API每日限额,一天仅能使用2000次,因而使用py的代码测试软件测试时使用次数有限(评测时请勾选Mode Slow)别把API打爆了
  • 由于API导入的列表从省级至下最多只有四级,所以当第四级地址缺失时无法通过第五级地址补全第四级地址。
  • 一些地址的前两个字如果相同,可能会识别错误。
  • 四级之后的地址纯依靠关键字分离,或有缺漏。
  • …………
  • 改进思路:
  • 前四级地址的解析可以使用cpca库(听说挺好用的),到第三难度时才使用API,或者预先存储好地址表,减少API使用次数。
  • 地址依靠前两个字识别查找成功后将查找到的地址与源字符串中的地址再做一次比对,降低出错率。
  • …………

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

  • 输入:
    1!羽高,福建福州闽13599622362侯县上街镇福州大学10#111.
    1!王穆,广东省东莞市凤岗13965231525镇凤平路13号.
    1!汪汪,新疆维吾尔自治区博尔塔拉蒙古自治州12345678901阿拉山口市艾比湖镇好人路321号7#.
    2!陆伍,福建省福州市鼓楼18960221533区五一北路123号福州鼓楼医院.
    2!泉奈,福建省福州13756899511市鼓楼区鼓西街道湖滨路110号湖滨大厦一层.
    2!小嘤,甘肃省武威98765432105市凉州区东大街街道北观众路3号3楼.
    2!白卜,上海市黄浦区外滩街57896542014道人民路55号克里比亚小区.
    3!萧瑟,黑龙江省兴山区沟78521154549南街道大方路483号汇添富小区.
    3!费奕,四川绵阳市玉河15978534620镇常林寺村管风路387号33#
    3!阿顿,福建省福州鼓西街22222122222哈哈路4号的撒.
  • 输出:
    {"姓名": "羽高", "手机": "13599622362", "地址": ["福建省", "福州市", "闽侯县", "上街镇", "福州大学10#111"]}
    {"姓名": "王穆", "手机": "13965231525", "地址": ["广东省", "东莞市", "凤岗镇", "", "凤平路13号"]}
    {"姓名": "汪汪", "手机": "12345678901", "地址": ["新疆维吾尔自治区", "博尔塔拉蒙古自治州", "阿拉山口市", "艾比湖镇", "好人路321号7#"]}
    {"姓名": "陆伍", "手机": "18960221533", "地址": ["福建省", "福州市", "鼓楼区", "", "五一北路", "123号", "福州鼓楼医院"]}
    {"姓名": "泉奈", "手机": "13756899511", "地址": ["福建省", "福州市", "鼓楼区", "鼓西街道", "湖滨路", "110号", "湖滨大厦一层"]}
    {"姓名": "小嘤", "手机": "98765432105", "地址": ["甘肃省", "武威市", "凉州区", "东大街街道", "北观众路", "3号", "3楼"]}
    {"姓名": "白卜", "手机": "57896542014", "地址": ["上海", "上海市", "黄浦区", "外滩街道", "人民路", "55号", "克里比亚小区"]}
    {"姓名": "萧瑟", "手机": "78521154549", "地址": ["黑龙江省", "鹤岗市", "兴山区", "沟南街道", "大方路", "483号", "汇添富小区"]}
    {"姓名": "费奕", "手机": "15978534620", "地址": ["四川省", "绵阳市", "游仙区", "玉河镇", "常林寺村", "管风路387号", "33"]}
    {"姓名": "阿顿", "手机": "22222122222", "地址": ["福建省", "福州市", "鼓楼区", "鼓西街道", "哈哈路", "4号", "的撒"]}
  • 代码覆盖:由于函数的复用,覆盖率呈递增趋势,但测试样例似乎还不够全面。。。
  • 难度1!:
  • 难度2!:
  • 难度3!:
  • 测评结果:

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

输入的字符串格式不符合要求的问题。

  • 难度:1! / 2! / 3! 缺失。如:
    周化,福建省福州市闽侯12569874560县上街镇福州大学23#506.
  • 手机号:缺失或位数异常。如:
    3!月初,甘肃省武威98765市凉州区东大街街道北格林路3号3楼. #手机号位数不为11
    1!王孟希,北京市东城区景山前街4号. #手机号缺失
  • 姓名:缺失或无逗号或逗号为中文逗号。如:
    2!,新疆维吾尔自治区博尔塔拉蒙古自治45896541237州阿拉山口市艾比湖镇好人路321号7楼123. #姓名缺失
    1!李哲陕西省西安长安区西长安街558号. #姓名与地址之间无“,”
    3!因又,江苏南京市玄武区中山东路321号附近. #逗号为中文逗号

7、一些废话

  • 吹一波Python!!!Py的强大在于其简洁的语言、可读性强、各种各样的库……
  • ~~这题目做得脑壳疼好累好烦好困我好菜~
原文地址:https://www.cnblogs.com/honger125/p/11562071.html