福州大学软件工程实践个人编程作业
这个作业属于哪个课程 | http://dwz.date/cts4 |
---|---|
这个作业要求在哪里 | https://edu.cnblogs.com/campus/fzu/SE2020/homework/11167 |
这个作业的目标 | 初步学习软件开发过程,自学对json文件的解析 |
学号 | 031802404 |
PSP表格
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | ||
Estimate | 估计这个任务需要多少时间 | 30 | 45 |
Development | 开发 | ||
Analysis | 需求分析 (包括学习新技术) | 720 | 1000 |
Design Spec | 生成设计文档 | 30 | 0 |
Design Review | 设计复审 | 30 | 0 |
Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 30 | 0 |
Design | 具体设计 | 30 | 40 |
Coding | 具体编码 | 240 | 300 |
Code Review | 代码复审 | 60 | 0 |
Test | 测试(自我测试,修改代码,提交修改) | 20 | |
Reporting | 报告 | 60 | |
Test Report | 测试报告 | 60 | |
Size Measurement | 计算工作量 | 15 | |
Postmortem & Process Improvement Plan | 事后总结, 并提出过程改进计划 | 30 | 45 |
合计 |
解题思路
读题
看到题目的第一反应就是从来没做过的,示例数据看不懂,格式要求看不懂,fork又是啥意思,我只知道叉子
repo,pr,啥的都是在加密通话,10次的commit是啥意思也不懂
以往的做过的题目大多数都是要求自己手动输入数据,然后输出要求的数据这种类型
尝试看参考程序,发现自己完全看不懂参考代码,最首先的事情只能是先学python以便能看懂参考代码了
初步学习后的解题步骤:
- 想办法读取json里面的内容
- 处理读取到的内容作为输入部分
初步工作
- 给出的参考代码为python,想着先做到能读懂参考程序,前期先花费两天时间过了下python基本的语法,以前只是粗略的学了,基本上等于重新学习
- 学习完尝试研究参考代码,发现python的类我看的十分蒙圈,时间限制的情况下暂时先放着
困难及解决方案
在完成读取json的过程中,在对json库了解了一下之后,有如下思路
- 前提:假设所有的json文件都放在同一文件夹(path)下
- 获取步骤:
- 首先,通过os.listdir(path)获取路径path下的所有文件的名称
- 其次,通过j=open(json_name)来打开json文件
- 最后,通过info=json.load(j)来读取json文件内的内容,可以通过info['type']来获取json中type对应项的值。
获取步骤实现如下
def get_json_info(path):
filelist = os.listdir(path)
# 获得所有的文件名
for json_name in filelist:
j = open(path+'\\'+json_name, 'r', encoding = 'utf-8' )
# 依次打开文件
for x in j:
info = json.loads(x)
print(info['type'])
但是当我在本地试图运行的时候,发现怎样都找不到键值,后来看到群里有人说需要逐行输入,尝试用readlins(),结果就是从KeyError变为TypeError
卡了差不多快五六个小时,参考别人的博客后,放弃了这种写法,(因为太菜真不会调格式,一度崩溃),转成将读到内容写到一个新的js_data.json里面,实现如下
def get_json_info(path):
filelist = os.listdir(path)
file = open('js_data.json', 'w', encoding = 'utf-8')
for json_name in filelist:
with open(path+'\\'+json_name, 'r', encoding = 'utf-8' ) as file
for line in file:
flie.write(line)
接下来实现命令行参数的初始化,这一部分也只是参考别人的代码,半懵半懂
parser = argparse.ArgumentParser()
parser.add_argument('-i', '--init')
parser.add_argument('-u', '--user')
parser.add_argument('-r', '--repo')
parser.add_argument('-e', '--event')
数据处理函数
def cal_result(js_data,username,repo,event):
result = 0
for cnt in js_data:
if len(username) == 0:
if len(repo) != 0:
if repo == cnt['repo']['name'] and cnt['type'] == event:
result += 1
else:
pass
elif len(username) != 0:
if len(repo) == 0:
username == cnt['actor']['login'] and cnt['type'] == event
else:
if repo == cnt['repo']['name'] and cnt['type'] == event and username == cnt['actor']['login']:
result += 1
else:
pass
print(result)
本地测试运行结果
单元测试运行
覆盖率低的问题我的猜测是条件判断太多了合在一块时运行不会被执行
githubt提交
代码规范链接
https://github.com/936043895/2020-personal-python/blob/master/codestyle.md
总结这次作业
目前来看截止时间到的时候,我估计也不能完成所有的模块,但是这些天自我感觉确实是最认真为了完成作业自主学习的一次,也许这次分很低
,但是这已经是我目前能做到最好的了,给自己定个目标,就算作业截止了,在以后也要抽时间完整的完成这份随笔
这几天也算是有所收获。感觉code对心理挑战也好大,花了很多时间出来就只有几行代码,但是依然bug不断,干坐一个下午没有解决办法真的太痛苦了
安慰一下自己有收获就行了吧
写在截止日期之前
似乎是完成了博客要求的每个模块,至于优化看其他人的博客说要使用多线程,时间受限,这个作业截止的时候应该是出不来我自己的优化方案了
百度了argparse的基本用法,感觉对argparse的理解程度比之前加深了,写的时候就纯粹照猫画虎。
在我第一次交的时候,我以为我还得花很久研究单元测试覆盖啥的,结果发现比想象中的快,果然有些事得去做做才知道怎样。
一次作业感受下来,痛苦与快乐并存,自己确实在这次作业里面学到了很多新东西,反而开始期待下次的作业了(不是)