Github链接
第一次个人编程作业
PSP表格
PSP2.1 | Personal Software Process Stages |
预估耗时(min) | 实际耗时(min) |
---|---|---|---|
Planning | 计划 | 50 | 40 |
Estimate | 估计这个任务需要多少时间 | 50 | 40 |
Development | 开发 | 750 | 780 |
Analysis | 需求分析 (包括学习新技术) |
60 | 70 |
Design Spec | 生成设计文档 | 60 | 50 |
Design Review | 设计复审 | 60 | 50 |
Coding Standard | 代码规范 (为开发制定合适的规范) |
30 | 30 |
Design | 具体设计 | 100 | 90 |
Coding | 具体编码 | 180 | 220 |
Code Review | 代码复审 | 80 | 70 |
Test | 测试 (自我测试,修改,提交修改) |
180 | 200 |
Reporting | 报告 | 60 | 60 |
Test Report | 测试报告 | 20 | 20 |
Size Measurement | 计算工作量 | 10 | 10 |
Postmortem & Process Improvement Plan |
事后总结 并提出过程改进计划 |
30 | 30 |
合计 | 860 | 880 |
解题
解题步骤
- 将输入数据的(数字)!先提取出来
- 讲姓名和手机号提取出来,留下一段地址字符串
- 通过正则表达式解析各级地址
- 有些地方通过正则表达式无法解析出来,通过导入网上找的列表序列
- 将结果保存为json格式输出
设计实现过程
代码内容
我是用python来编写这个程序的,不得不说真比java省掉了好多事情,对我这种菜鸡来说真的是太开心了(然而还是不懂做)。步入正题,这个代码有一个主函数,然后分别调用不同的函数实现不同的功能,主函数主要是把各个调用函数返回的字段删除,最后留下的nows即为切到只剩下最后一级的地址。好像没必要画流程图,这个程序写的就有点太简单了(原谅我只能写出这样思路最土的程序)。最后各个函数具体如下:
函数名 | 说明 |
---|---|
def main() | 主函数 |
def getTelNum(s) | 返回电话号码 |
getProvince(s) | 返回省份 |
def getCity(s) | 返回城市 |
def getCounty(s) | 返回县级 |
def getTown(s) | 返回街道、镇… |
def getRoad(s) | 返回路、巷… |
def getDoornum(s) | 返回门牌号 |
代码规范
不得不说这一块我做的特别的差,开始写代码没有注意这些,而且保留有其他语言一些习惯,导致写出来的代码特别的乱,上两个前后分数对比图,我已经尽力了,反正所有警告确实已经消失了……以后写自己多注意这些方面吧。
关键代码
由于我用的主要是正则表达式,对每一级分别用一个函数来实现,所以每个函数差不了很多,除了正则表达式的内容,还有对省、市、县这些字的缺失的处理,给出一小段获取城市段代码,其他类似。
def getcity(s): #获得城市
res = re.search("(.*?自治州)|(.*?[市])", s)
if res != None:
l = len(res.group(0))
if res == None or l > 7:
for i in CITIES:
if s[0:2] in i:
return i
return ""
return res.group(0)
CITY = getcity(NOWS)
if CITY != "":
NOWS = NOWS.replace(CITY, "", 1)
if (CITY[-1] != "市") and (CITY[-3:-1] != "自治"):
CITY = CITY+"市"
性能分析
通过pycharm专业版的Profile Run进行性能分析,得到部分数据如下,好像并没有看懂这些乱七八糟的东西是怎么回事,应该是遍历给出的cities和areas的时候浪费了大部分的时间吧,有想到引入json的包,也有同学发出来这个包,但是刚开始做的时候就死死每一层都往正则表达式钻,所以打出来bug就比较多,后来知道这个办法已经太晚了,在改方法我估计今天就交不了了…不过现在这个办法也是有点好处的,就是对那些完整的测试数据,比如说“福建省”而不是“福建”这种的时候,速度就会快得多……但是遇到不完整数据的时候就慢了。。。
单元测试
使用pycharm的unittest模块来构建单元测试,测试数据放在test这个py文件中,将原来的源代码做稍微修改,让他返回一个字典数据,然后在test中直接比较字典,(因为不会比json数据,如果数据错误就会报错,以下给出部分的代码:
class MyTestCase(unittest.TestCase):
def test_something(self):
self.assertEqual(a031702419.chuli(s1), dict1)
self.assertEqual(a031702419.chuli(s2), dict2)
self.assertEqual(a031702419.chuli(s3), dict3)
self.assertEqual(a031702419.chuli(s4), dict4)
self.assertEqual(a031702419.chuli(s5), dict5)
self.assertEqual(a031702419.chuli(s6), dict6)
self.assertEqual(a031702419.chuli(s7), dict7)
self.assertEqual(a031702419.chuli(s8), dict8)
self.assertEqual(a031702419.chuli(s9), dict9)
self.assertEqual(a031702419.chuli(s10), dict10)
部分的测试数据如下
2!李四,福建省福州13756899511市鼓楼区鼓西街道湖滨路110号湖滨大厦一层.
1!张三,福建福州闽13599622362侯县上街镇福州大学10#111.
1!黎剖奕,广东珠海市金湾区三灶镇乐康街13614572468一巷11号三灶镇海澄村委会.
2!小张,福建泉州市省新市18150632336霞美街海西楼
1!小陈,北京朝阳13965231525天安门广场
1!黎剖奕,广东珠海市金湾区三灶镇乐康街13614572468一巷11号三灶镇海澄村委会.
测试覆盖率是通过Pycharm的Run with Coverage实现的,结果如下:
异常处理
在测试代码的时候经常碰到报错,有时没有复制名字,或者缺少省份呢,都会报错。我测试了以下的几条数据:
1!福建省福州13756899511市鼓楼区鼓西街道湖滨路110号湖滨大厦一层.
1!福州13756899511市鼓楼区鼓西街道湖滨路110号湖滨大厦一层.
虽然知道给的测试数据是正常的……其他异常我就找不到了
小结
软工实践不熬夜是不可能不熬夜的,对于我这种vegetable bird来说也太难了吧,不仅代码敲的要死要活,好不容易敲出可能能对几个点的水平,测试工具一堆的又搞得头大,中秋假期是什么我已经不懂了,不过至少这一星期学到了挺多,至少对python熟悉了一点,对一些评测,代码分析的东西也是有点了解。不过对比大一大二,现在确实才是学到更接近计算机的东西,代码也不是敲出来就是可以的,还要考虑好多的东西,包括开发前的问题分析、需求分析等等,也有开发后的一些性能优化、Debug等等,所以接下去还有 long way to go…