2020软件工程第一次个人编程作业
这个作业属于哪个课程 | 软件工程 https://edu.cnblogs.com/campus/fzu/SE2020 |
---|---|
这个作业要求在哪里 | https://edu.cnblogs.com/campus/fzu/SE2020/homework/11167 |
这个作业的目标 | 挑战人类极限,激发人体潜能 大佬的独角戏 混子的照妖镜 |
学号 | 021800527 |
一、PSP表格
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 60 | 120 |
Estimate | 估计这个任务需要多少时间 | 1440 | 2880 |
Development | 开发 | 720 | 1440 |
Analysis | 需求分析 (包括学习新技术) | 240 | 360 |
Design Spec | 生成设计文档 | 60 | 90 |
Design Review | 设计复审 | 60 | 90 |
Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 60 | 90 |
Design | 具体设计 | 60 | 90 |
Coding | 具体编码 | 60 | 90 |
Code Review | 代码复审 | 60 | 90 |
Test | 测试(自我测试,修改代码,提交修改) | 60 | 90 |
Reporting | 报告 | 60 | 90 |
Test Report | 测试报告 | 60 | 60 |
Size Measurement | 计算工作量 | 60 | 90 |
Postmortem & Process Improvement Plan | 事后总结, 并提出过程改进计划 | 30 | 180 |
合计 | 1440 | 2880 |
二、解题思路
我作为老师和助教的颜值粉,在作业发布的第一时间我就点开了作业,拜读完之后我空空如也的脑袋充满了大大的疑问。通读全文三遍后,还是疑惑不解。当时的情形闻者落泪,听着伤心,下图完美的复现了当时的惨痛经历。
言归正传,在面向百度编程数天之后,在放弃看懂助教高水平的代码的想法之后,(希望有个机会能交流一下,我太馋这种各种函数飞来飞去的格式了)我大致理清楚了思路
1、按行读取json代码
2、json代码很像python里的字典
3、可以将每行的json代码转换成字典,可以,但是没有必要。因为本题关注的是“PushEvent”“IssueCommentEvent”“IssuesEvent”“PullRequestEvent”四个元素,所以不需要统统关注到,只要搜寻到需要的信息即可,下图是图解我的字典结构。
三. 设计实现过程
四. 代码说明
1、main()函数
if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument("-u", "--user")
parser.add_argument("-e", "--event")
parser.add_argument("-i", "--address")
parser.add_argument("-r", "--repo")
args = parser.parse_args()
# 如果是输入的是地址 则地址不为空
if args.address is not None:
initialization( args.address)
if args.address is None and not os.path.exists('1.json') and not os.path.exists('2.json') and not os.path.exists('3.json'):
print("初始化失败,本地文件不可写入")
else:
print("初始化成功")
# 如果用户和时间不空,但是地址空了 说明查询的是用户的事件个数
if args.user is not None and args.event is not None and args.repo is None:
inquire_user_event(args.user,args.event)
# 如果项目和时间不空,但是偏偏用户和地址空了,说明查询的是各个项目的时间个数
if args.repo is not None and args.event is not None and args.user is None:
inquire_repo_event(args.repo, args.event)
# 如果项目和用户和事件不空,则是查询各个用户在各个事件中的
if args.user is not None and args.repo is not None and args.event is not None:
inquire_user_repo_event(args.user, args.repo, args.event)
通过输入的值来确定到底查询的项目,如果user和event则是查询用户事件,如果repo和event则是项目操作,如果三者皆有,必须否定前两种查询,而是查询一个用户在一个项目中的操作个数
2、initialization(path)函数
# 代码规范化之我不会用__init__
def initialization(path):
json_list = []
dict_address = path
user_4event_num = {}
repo_4event_num = {}
user_repo_4event_num = {}
for root, dic, files in os.walk(dict_address):
for f in files:
if f[-5:] == '.json' and f[-6] != '0' and f[-6] != '1' and f[-6] != '2':
json_path = f
x = open(dict_address+'\\'+json_path, 'r', encoding='utf-8').read()
str_list = [_x for _x in x.split('\n') if len(_x) > 0]
for i, _str in enumerate(str_list):
# 个人用户的四个事件
json_list.append(json.loads(_str))
str_key = json_list[i]['actor']['login']
# 初始化 如果非空就继续往下
if user_4event_num.get(str_key) is None:
user_4event_num[str_key] = {}
# 初始化 不存在就创建,存在在后面处理
if user_4event_num[str_key].get('IssuesEvent') is None:
user_4event_num[str_key].update({'IssuesEvent': 0})
if user_4event_num[str_key].get('PushEvent') is None:
user_4event_num[str_key].update({'PushEvent': 0})
if user_4event_num[str_key].get('IssueCommentEvent') is None:
user_4event_num[str_key].update({'IssueCommentEvent': 0})
if user_4event_num[str_key].get('PullRequestEvent') is None:
user_4event_num[str_key].update({'PullRequestEvent': 0})
if json_list[i]['type'] in user_4event_num[str_key].keys():
user_4event_num[str_key][json_list[i]['type']] = user_4event_num[str_key][json_list[i]['type']] + 1
# 项目的四种事件
str_key = json_list[i]['repo']['name']
# 初始化 如果非空就继续往下
if repo_4event_num.get(str_key) is None:
repo_4event_num[str_key] = {}
# 初始化 不存在就创建,存在在后面处理
if repo_4event_num[str_key].get('IssuesEvent') is None:
repo_4event_num[str_key].update({'IssuesEvent': 0})
if repo_4event_num[str_key].get('PushEvent') is None:
repo_4event_num[str_key].update({'PushEvent': 0})
if repo_4event_num[str_key].get('IssueCommentEvent') is None:
repo_4event_num[str_key].update({'IssueCommentEvent': 0})
if repo_4event_num[str_key].get('PullRequestEvent') is None:
repo_4event_num[str_key].update({'PullRequestEvent': 0})
if json_list[i]['type'] in repo_4event_num[str_key].keys():
repo_4event_num[str_key][json_list[i]['type']] = repo_4event_num[str_key][json_list[i]['type']] + 1
# 每一个人在每一个项目的 4 种事件的数量
new_str_key = json_list[i]['repo']['name']
str_key = json_list[i]['actor']['login']
# 初始化 如果非空就继续往下
if user_repo_4event_num.get(str_key) is None:
user_repo_4event_num[str_key] = {}
# 套娃第二步,先把项目名放进去
if user_repo_4event_num[str_key].get(new_str_key) is None:
user_repo_4event_num[str_key][new_str_key] = {}
if user_repo_4event_num[str_key][new_str_key].get('IssuesEvent') is None:
user_repo_4event_num[str_key][new_str_key].update({'IssuesEvent': 0})
if user_repo_4event_num[str_key][new_str_key].get('PushEvent') is None:
user_repo_4event_num[str_key][new_str_key].update({'PushEvent': 0})
if user_repo_4event_num[str_key][new_str_key].get('IssueCommentEvent') is None:
user_repo_4event_num[str_key][new_str_key].update({'IssueCommentEvent': 0})
if user_repo_4event_num[str_key][new_str_key].get('PullRequestEvent') is None:
user_repo_4event_num[str_key][new_str_key].update({'PullRequestEvent': 0})
if json_list[i]['type'] in user_repo_4event_num[str_key][new_str_key].keys():
user_repo_4event_num[str_key][new_str_key][json_list[i]['type']] = user_repo_4event_num[str_key][new_str_key][json_list[i]['type']] + 1
with open('0.json', 'w', encoding='utf-8') as f:
json.dump(user_4event_num, f)
with open('1.json', 'w', encoding='utf-8') as f:
json.dump(repo_4event_num, f)
with open('2.json', 'w', encoding='utf-8') as f:
json.dump(user_repo_4event_num, f)
作为本次作业的核心灵魂,这个代码还是很精髓的,按照注释的流程,将数据整理成三个本地的json文件。
五. 单元测试
因为主要的分析数据过程都在initialization()函数中,所以程序运行的时间大概都在其中,所以我们主要测试的就是这个函数的耗时,6s多,还是蛮久的。
六、性能优化及性能测试
这方面可能得考虑多线程进行优化,由于ddl逼近,在写这篇博客的时候还没有写完,如果在截止时间前还没有更新,那只能希望助教大哥的电脑没事。
七、代码规范链接
https://github.com/021800527/2020-personal-python/blob/master/codestyle.md
八、遇到的困难与收获
虽然助教老师可以直接公布样例答案让我们自行检测代码的正误,但是他们还是坚持让我使用GitHub的fork pr等从来没有用过的操作,不仅熟悉了GitHub,也更熟悉了如何利用GitHub
虽然看到的题目的时候真的啥都不会,但是在一周多高强度的学习下,python的理解更进一步,python也用上了工程和虚拟环境,不会只是会做数学题的python选手了。虽然知道我的函数没有self什么没有驼峰很不规范,但是最后还是要球球