软件工程第二次作业
这个作业属于哪个课程 | https://edu.cnblogs.com/campus/fzu/SE2020/ |
---|---|
这个作业要求在哪里 | https://edu.cnblogs.com/campus/fzu/SE2020/homework/11167 |
这个作业的目标 | <制作一个程序统计和分析 GitHub 的用户行为数据。> |
学号 | <021800317> |
PSP
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 10 | 30 |
Estimate | 估计这个任务需要多少时间 | 300 | |
Development | 开发 | 120 | 150 |
Analysis | 需求分析 (包括学习新技术) | 180 | 300 |
Design Spec | 生成设计文档 | 15 | 40 |
Design Review | 设计复审 | 5 | 20 |
Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 5 | 15 |
Design | 具体设计 | 10 | 30 |
Coding | 具体编码 | 120 | 180 |
Code Review | 代码复审 | 20 | 30 |
Test | 测试(自我测试,修改代码,提交修改) | 30 | 60 |
Reporting | 报告 | 10 | 30 |
Test Report | 测试报告 | 10 | 30 |
Size Measurement | 计算工作量 | 10 | 10 |
Postmortem & Process Improvement Plan | 事后总结, 并提出过程改进计划 | 20 | 60 |
合计 | 575 | 985 |
解题思路
最开始拿到题目是完全没有头绪,因为我不会python和Java,据了解用C plus不好解决,更关键的是我对于python,Java等编程语言的开发工具完全不了解,更别说git操作,命令行操作等等。最近靠着在CSDN,博客园等网站论坛学习,找思路才勉强有了点思路。一开始打算试着搞懂助教的代码,但是太繁杂了,就转而向舍友同学求助顿时明白不少。
git使用截图
参考代码cmd运行截图
尝试命令行按行读取json文件
commit
实现过程
代码
初始化
def init(path):
os.getcwd()
filelist = os.listdir(path)
f2=open('2020-01-01-15.json','w',encoding='utf-8')
for file in filelist:
pathname=path+'\\'+file
try:
f=open(pathname,encoding='utf-8')
for line in f:
f2.write(line)
finally:
if f:
f.clone()
return 0
- 思路: os.listdir返回指定的文件夹包含的文件或文件夹的名字的列表,通过open函数打开json文件,write()函数向f2写入字符串,for in遍历读取文件写入数据,
统计
def one(data,repo,event):
ans=0
for da in data:
if repo!=da['repo']['name']:
continue
if da['type'] == event:
ans=ans+1
return ans
def two(data,username,event):
ans=0
for da in data:
if username!=da['actor']['login']:
continue
if da['type'] == event:
ans=ans+1
return ans
def three(data,username,repo,event):
ans=0
for da in data:
if username!=da['actor']['login']:
continue
if repo!=da['repo']['name']:
continue
if da['type'] == event:
ans=ans+1
return ans
- 思路:按照题目要求设计三个函数统计不同信息。根据json文件里所提供的信息和助教给的window批处理文件,event信息保存在'type'中,user保存在'actor''login',repo保存在'repo''name',在data中查找信息是否对应即可。
main函数
if __name__ == '__main__':
data=[]
username='0'
repo='0'
event='0'
try:
f=open("2020-01-01-15.json", encoding='utf-8')
for line in f:
data.append(json.loads(line))
finally:
if f:
f.close()
opt,arg= getopt.getopt(sys.argv[1:],'i:u:r:e:',['init=','user=','repo=','event='])
if opt in ("-i" , "--init"):
init(opt[0][1])
exit()
for opt,arg in opt:
if opt in ("-u","--user"):
username = arg
elif opt in("-r","--repo"):
repo = arg
elif opt in ("-e","--event"):
event = arg
if username=='0':
print(one(data,repo,event))
elif repo=='0':
print(two(data,username,event))
else:
print(three(data , username , repo , event))
思路:在python文件中用if name == 'main':作为程序入口,即C语言中的main函数。设置初始变量,创建列表data,用open函数打开json文件,loads()函数用于读取字符型数据,append() 函数给列表添加新的对象。使用getopt模块获取命令行选项和参数,利用sys模块将命令行参数保存在opt, arg中。opts为分析出的格式信息,args为不符合长短选项字符的格式信息的命令行参数。先用if语句判断命令行指令是否要求初始化,下一步用for循环迭代判断命令行指令的要求统计的内容,再根据命令行提供的数据在data列表中迭代查找相应信息。
单元测试截图
- 助教给的测试程序中那个叫run的window批处理文件我有稍微改动,多加自己编的几行命令。
性能测试
单元测试覆盖率
代码规范
https://github.com/PCWJSW/2020-personal-python/blob/master/codestyle.md
总结
这次作业的完成过程中我开始接触python3.8,git的使用,对于python编程也有所掌握,尤其是命令行指令,sys,getopt,os模块的了解和使用。明白了要多在CSDN等的网站学习。不过在作业花费的时间太多,遇到不会的点没有及时问同学导致浪费了时间,以后应当注意。