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什么没有驼峰很不规范,但是最后还是要球球

posted @ 2020-09-17 00:21  021800527施颖辉  阅读(179)  评论(2编辑  收藏  举报