项目 | 内容 |
---|---|
班级博客 | 2022年春软件工程课程班 |
作业要求 | 实验三 软件工程结对项目 |
学习目标 | (1)体验软件项目开发中的两人合作,练习结对编程(Pair programming);(2)掌握Github协作开发软件的操作方法。 |
目标实现 | 对结对编程进行实践;对git的多人协作操作更加熟练;对Django框架有了初步了解 |
结对方学号姓名 | 201971010140-魏瑾川 |
结对方博客链接 | https://www.cnblogs.com/hezhoubuchizao/ |
项目地址 | DP_EX3 |
项目/任务有多大?
说明项目的大小,一般用代码行数( Line Of Code,LOC)来表示;也可以用功能点( Function Point)来表示。
花了多少时间?
可以用小时、天、月、年来表示。一组人所花费的时间可以用(人数×时间)来表示,例如某项目花费了10个人×月。
质量如何?
交付的代码中有多少缺陷?交付有两个定义:
在代码完成( Code Complete)时,交付给测试人员
在软件最终发布时,交付给顾客
是否按时交付?
原则为:简明,易读,无二义性
函数:只做一件事,并且要做好
goto:函数最好有单一的出口,为了达到这一目的,可以使用goto。只要有助于程序逻辑的清晰体现,什么方法都可以使用。
错误处理:
类:
定义:看代码是否在代码规范的框架内正确地解决了问题。
代码复审的目的:
找出代码的错误
发现逻辑错误,程序可以编译通过,但是代码的逻辑是错的
发现算法错误,比如使用的算法不够优化,边界条件没有处理好等
发现潜在的错误和回归性错误——当前的修改导致以前修复的缺陷又重新出现
发现可能需要改进的地方
教育(互相教育)开发人员,传授经验,让更多的成员熟悉项目各部分的代码,同时熟悉和应用领域相关的实际知识
评论链接 | 魏瑾川 实验二 |
---|---|
博文结构 | 简单大方,十分清爽,让人阅读起来很容易找到想要阅读的内容 |
博文内容 | 将本次实验的所有任务均以简明的语言陈述,没有任何的拖沓 |
结构和PSP的对应 | 博文结构与PSP的任务内容基本对应,可见博主认真按照PSP流程进行开发 |
差异化分析 | 根据PSP表,发现博主的主要时间差异在需求分析和具体编码及测试这三个环节,可能与博主在开发过程中遇到了意想不到的bug有关 |
概要部分
概要部分 | 实现情况 |
---|---|
代码符合需求和规格说明么? | 基本符合,但部分功能完成度较差。 |
代码设计是否考虑周全? | 考虑周全 |
代码可读性如何? | 采用模块化编程,代码可读性好。 |
代码容易维护么? | 对于不同的功能模块,分别存储在不同的函数中,维护较为容易。 |
代码的每一行都执行并检查过了吗? | 是的 |
设计规范部分
设计规范 | 实现情况 |
---|---|
设计是否遵从已知的设计模式或项目中常用的模式? | 遵从 |
有没有硬编码或字符串/数字等存在 | 没有 |
代码有没有依赖于某一平台,是否会影响将来的移植(如Win32到Win64)? | 不会影响移植 |
在本项目中是否存在类似的功能可以调用而不用全部重新实现? | 没有 |
有没有无用的代码可以清除? | 没有 |
代码规范部分
代码规范部分 | 实现情况 |
---|---|
修改的部分符合代码标准和风格吗? | 符合规范 |
具体代码部分
具体代码部分 | 实现情况 |
---|---|
有没有对错误进行处理?对于调用的外部函数,是否检查了返回值或处理了异常? | 没有处理异常值 |
参数传递有无错误,字符串的长度是字节的长度还是字符(可能是单/双字节)的长度是以0开始计数还是以1开始计数? | 没有 |
switch语句的default分支是如何处理的?循环有没有可能出现死循环? | 没有使用switch语句;循环不会出现死循环。 |
有没有使用断言( Assert)来保证我们认为不变的条件真的得到满足? | 程序较为简单,没有使用断言。 |
数据结构中有没有用不到的元素? | 有 |
效能
效能 | 实现情况 |
---|---|
代码的效能(Performance)如何? | 运行效率高。 |
代码中,特别是循环中是否有明显可优化的部分(? | 无 |
对于系统和网络的调用是否会超时?如何处理? | 没有对网络的调用 |
可读性
可读性 | 实现情况 |
---|---|
代码可读性如何?有没有足够的注释? | 关键语句都有注释,可读性高,注释详细 |
可测试性
可测试性 | 实现情况 |
---|---|
代码是否需要更新或创建新的单元测试? | 不需要 |
框架:Django
前端:Html、CSS、JQuery、Bootstrap
后端:Django
数据库:sqlite
姓名 & 学号 | 工作任务 |
---|---|
魏瑾川_201971010140 | 后端设计实现 |
郭清华_201971020107 | 前端设计实现 |
前端使用 后端代码: 此次项目的附加功能是登录注册,用户进入平台后首先需要完成登录,才可以进入平台。 具体逻辑为,在前端设计对象的数据接受接口,当用户输入数据后进入数据库进行查询或者增加,完成后跳转到使用界面。前端逻辑如下: 后端逻辑如下: 登陆界面 用户注册 散点图绘制 数据排序 数据输入 问题求解 日志记录 通过本次结对编程实践,两个人合作确实能带来1+1>2的效果,从需求分析到总体设计再到编码,两个人合作会激发许多奇思妙想,例如:我之前从未使用Django框架,我的同伴告诉我它的好处,我们便在此次开发过程中使用,发现这确实是一个十分方便的框架。此外,两人合作可以取长补短,我们各有精通的地方,也各有短板,在此次开发中,我们相互帮助,共同进步。
{% csrf_token %}
代码实现
##初始化,N为种群规模,n为染色体长度
def init(self,N,n):
C = []
for i in range(N):
c = []
for j in range(n):
a = np.random.randint(0,2)
c.append(a)
C.append(c)
return C
##评估函数
# x(i)取值为1表示被选中,取值为0表示未被选中
# w(i)表示各个分量的重量,v(i)表示各个分量的价值,w表示最大承受重量
def fitness(self,C,N,n,W,V,w):
S = []##用于存储被选中的下标
F = []## 用于存放当前该个体的最大价值
for i in range(N):
s = []
h = 0 # 重量
f = 0 # 价值
for j in range(n):
if C[i][j]==1:
if h+W[j]<=w:
h=h+W[j]
f = f+V[j]
s.append(j)
S.append(s)
F.append(f)
return S,F
## 适应值函数,B位返回的种族的基因下标,y为返回的最大值
def best_x(self,F,S,N):
y = 0
x = 0
B = [0]*N
for i in range(N):
if y
y = F[x]
B = S[x]
return B,y
## 计算比率
def rate(self,x):
p = [0] * len(x)
s = 0
for i in x:
s += i
for i in range(len(x)):
p[i] = x[i] / s
return p
## 选择
def chose(self,p, X, m, n):
X1 = X
r = np.random.rand(m)
for i in range(m):
k = 0
for j in range(n):
k = k + p[j]
if r[i] <= k:
X1[i] = X[j]
break
return X1
## 交配
def match(self,X, m, n, p):
r = np.random.rand(m)
k = [0] * m
for i in range(m):
if r[i]
u = v = 0
k[0] = k[0] = 0
for i in range(m):
if k[i]:
if k[u] == 0:
u = i
elif k[v] == 0:
v = i
if k[u] and k[v]:
# print(u,v)
q = np.random.randint(n - 1)
# print(q)
for i in range(q + 1, n):
X[u][i], X[v][i] = X[v][i], X[u][i]
k[u] = 0
k[v] = 0
return X
## 变异
def vari(self,X, m, n, p):
for i in range(m):
for j in range(n):
q = np.random.rand()
if q
return X前后端数据交互
ajax
作为接口,后端在views
写好后端逻辑,在urls
里面配置好路由,项目运行后,后端的数据就可以与前端进行交互。以动态规划算法为例,前端接口举例代码如下:$(document).ready(function(){
$.ajax({
url:"http://127.0.0.1:8000/getinfo/",
type:"GET",
success: function (resp){
if(resp.result == "success"){
alert(resp.maxvalue)
}
}
})
});from django.http import JsonResponse
from DP_Project.models.knapsack import Knapsack
def Dynamic(request):
knapsacks = Knapsack.objects.filter(number='1')
v_list = [] # 体积列表
w_list = [] # 价值列表
v_list.append(0) # 体积列表初始化
w_list.append(0) # 价值列表初始化
for knapsack in knapsacks:
v_list.append(int(knapsack.volume))
w_list.append(int(knapsack.worth))
V = 200
N = len(v_list)
f = [0] * (V + 1)
for i in range(1, N):
for j in range(V, v_list[i] - 1, -1):
f[j] = max(f[j], f[j - v_list[i]] + w_list[i])
maxvalue = f[V]
return JsonResponse({
'result':'success',
'maxvalue':maxvalue,
})附加功能——登陆注册
const inputs = document.querySelectorAll(".input");
function focusFunction(){
let parentNode = this.parentNode.parentNode;
parentNode.classList.add('focus');
}
function blurFunction(){
let parentNode = this.parentNode.parentNode;
if(this.value == ''){
parentNode.classList.remove('focus');
}
}
inputs.forEach(input=>{
input.addEventListener('focus',focusFunction);
input.addEventListener('blur',blurFunction);
});from django.contrib import auth
from django.contrib.auth import authenticate
from django.http import HttpResponseRedirect
from django.shortcuts import render
# 用户登录
def login(request):
if request.method == "GET":
cOntext= {'previous_page': request.GET.get('from_page', '/index')}
return render(request, 'login.html', context)
else:
username = request.POST['username']
password = request.POST['password']
try:
user = authenticate(request, username=username, password=password)
auth.login(request, user)
return HttpResponseRedirect(request.GET.get('from_page', '/index'))
except:
cOntext= {'login_info': True, 'previous_page': request.GET.get('from_page', '/index')}
return render(request, 'login.html', context)软件实现及功能展示
commit记录
结对照片
PSP
PSP2.1 任务内容 计划共完成需要的时间(min) 实际完成需要的时间(min) Planning 计划 20 20 Estimate 估计这个任务需要多少时间,并规划大致工作步骤 20 20 Development 开发 1090 1200 Analysis 需求分析 (包括学习新技术) 120 155 Design Spec 生成设计文档 30 20 Design Review 设计复审 (和同事审核设计文档) 20 20 Coding Standard 代码规范 (为目前的开发制定合适的规范) 30 35 Design 具体设计 60 50 Coding 具体编码 600 650 Code Review 代码复审 30 30 Test 测试(自我测试,修改代码,提交修改) 200 240 Reporting 报告 100 100 Test Report 测试报告 30 40 Size Measurement 计算工作量 40 30 Postmortem & Process Improvement Plan 事后总结 ,并提出过程改进计划 30 30 总结
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有