2020软工实践第一次个人编程作业

这个作业属于哪个课程
https://edu.cnblogs.com/campus/fzu/SE2020/
这个作业要求在哪里
https://edu.cnblogs.com/campus/fzu/SE2020/homework/11167
这个作业的目标
使用GitHub完成一系列操作,懂得json文件处理方式,学会多线程的控制
使用语言
Python
学号
031802302

一、PSP表格

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

二、解题思路描述

★题目的要求简要概括为处理json文件,能够做到查询题目要求的数据并返回结果。类似于从字符串中提取特定子串并存储与新文件中便于查询。

★刚拿到题目时,对于题目中一大堆的陌生词汇一脸懵(虽然学到今天还是有点懵但是大致意思懂了QAQ),然后开始学习Python的json库相关操作(在CSDN等网站以及舍友的帮助下艰难学习),但在实际操作时仅仅是看懂部分代码改了部分参数而已。

三、设计过程实现及流程图

★所完成的代码仅仅是单线程,多线程还未完成。

★单线程的代码较多线程简单,包括一个outputFile函数跟RunFirst类。outputFile函数内处理文件的初始化工作,用于生成后续的Users.json、Repos.json、UsersAndRepos.json三个文件,生成三个初始化完的文件后进行对原json文件的处理,将各个数据存入上述三个文件中,后写三个查询函数内嵌在outputFile中用于满足查询相关操作。

★流程图

四、代码说明

1.outputFile函数

def outputFile(dict_address):
	Users = {}
	Repos = {}
	UsersAndRepos = {}
	json_list = []
	for root, dic, files in os.walk(dict_address):
		for f in files:
			if(f[-5:] == '.json'):
				x = open(dict_address + '\\' + f, 'r', encoding = 'utf-8').read()
				for str in x.split('\n'):
					if(len(str)>0):
						try:
							json_list.append(json.loads(str))
						except:
							pass
	
	for i in json_list:
		EventType = i.get('type',0)
		EventUser = i.get('actor',0).get('login',0)
		EventRepo = i.get('repo',0).get('name',0)

		if(not Users.get(EventUser)):
			Users.update({EventUser: {}})
		if(not Users[EventUser].get(EventType)):
			Users[EventUser].update({EventType: 0})
		Users[EventUser][EventType] += 1

		if(not Repos.get(EventRepo)):
			Repos.update({EventRepo: {}})
		if(not Repos[EventRepo].get(EventType)):
			Repos[EventRepo].update({EventType: 0})
		Repos[EventRepo][EventType] += 1

		if(not UsersAndRepos.get(EventUser)):
			UsersAndRepos.update({EventUser: {}})
		if(not UsersAndRepos[EventUser].get(EventRepo)):
			UsersAndRepos[EventUser].update({EventRepo: {}})
		if(not UsersAndRepos[EventUser][EventRepo].get(EventType)):
			UsersAndRepos[EventUser][EventRepo].update({EventType: 0})
		UsersAndRepos[EventUser][EventRepo][EventType] += 1

	with open('Users.json', 'w', encoding='utf-8') as f:
		json.dump(Users,f)
	with open('Repos.json', 'w', encoding='utf-8') as f:
		json.dump(Repos,f)
	with open('UsersAndRepos.json', 'w', encoding='utf-8') as f:
		json.dump(UsersAndRepos,f)

2.getEventsRepos函数

def getEventsRepos(repo, event):
	x = open('Repos.json', 'r', encoding='utf-8').read()
	file = json.loads(x)
	if(not file.get(repo,0)):
		print("0")
	else:
		print(file[repo].get(event,0))

3.getEventsUsers函数

def getEventsUsers(user, event):
	x = open('Users.json', 'r', encoding='utf-8').read()
	file = json.loads(x)
	if(not file.get(user,0)):
		print("0")
	else:
		print(file[user].get(event,0))

4.getEventsUsersAndRepos函数

def getEventsUsersAndRepos(user, repo, event):
	x = open('UsersAndRepos.json', 'r', encoding='utf-8').read()
	file = json.loads(x)
	if(not file.get(user,0)):
		print("0")
	elif(not file[user].get(repo)):
		print("0")
	else:
		print(file[user][repo].get(event,0))

outputFile函数参数为文件路径,函数主要功能为生成三个所需json文件,在生成前进行初始化工作,生成完后对已有json文件进行处理并将相关结果导入新生成的三个json文件中,后编写三个函数用于查询返回结果。在实现该代码时得到了舍友大佬的极力帮助。

5.RunFirst类

class RunFirst:
	def __init__(self):
		self.parser = argparse.ArgumentParser()
		self.argInit()
		self.analyse()

	def argInit(self):
		self.parser.add_argument('-i', '--init')
		self.parser.add_argument('-u', '--user')
		self.parser.add_argument('-r', '--repo')
		self.parser.add_argument('-e', '--event')

	def analyse(self):
		if(self.parser.parse_args().init):
			outputFile(self.parser.parse_args().init)
			return 0
		else:
			if(self.parser.parse_args().event):
				if(self.parser.parse_args().user):
					if(self.parser.parse_args().repo):
						getEventsUsersAndRepos(
							self.parser.parse_args().user, self.parser.parse_args().repo, self.parser.parse_args().event)
					else:
						getEventsUsers(
							self.parser.parse_args().user, self.parser.parse_args().event)
				elif (self.parser.parse_args().repo):
					getEventsRepos(
						self.parser.parse_args().reop, self.parser.parse_args().event)
				else:
					raise RuntimeError('error: argument -l or -c are required')
					return 0
			else:
				raise RuntimeError('error: argument -e is required')
				return 0

if __name__ == '__main__':
	Run = RunFirst()

该类仅仅基于样例代码给出的类进行一些参数的修改便于处理。

五、单元测试

六、单元测试覆盖率优化和性能测试,性能优化截图和描述





七、代码规范链接

https://github.com/FzuLitBro/2020-personal-python/blob/ckq-branch/codestyle.md

八、总结

★此次作业对于我个人而言难度偏大,由于还未真正接触过json文件的处理,在学习初期一无所措,而在真正了解后的学习速度慢也导致了没有很好的完成作业,对于多线程的处理掌握的并不是很清楚,而python的多线程特性也让代码执行起来很鸡肋,做了好久的多线程却一直报了Memory error但找不出原因,在后续有机会的话会继续完善代码。

posted @ 2020-09-16 18:28  Lit_Bro  阅读(237)  评论(1编辑  收藏  举报