这个作业属于哪个课程 | 构建之法-2021年秋-福州大学软件工程 |
---|---|
这个作业要求在哪里 | 2021秋软工实践第二次结对编程作业 |
个人学号 | 031902217 |
结对成员学号 | 031902204 |
结对小伙伴的作业博客链接 | 博客 |
GitHub 仓库地址 | 前端;后端 |
视频演示链接 | 博饼小程序 |
PSP
PSP Stages | 估计时间/h | 完成时间/h |
---|---|---|
计划 | 2 | 3 |
时间预估 | 0.1 | 0.3 |
开发 | - | - |
需求分析 | 2 | 3 |
生成设计文档 | 4 | 4 |
设计复审 | - | - |
代码规范 | - | - |
具体设计 | 4 | 10 |
具体编码 | 20 | 30 |
代码复审 | - | - |
test | 5 | 7 |
报告 | 2 | 1 |
测试报告 | - | - |
计算工作量 | 0.1 | 0.1 |
总结与提高 | 2 | 3 |
总计 | 41.2 | 58.4 |
个人学习进度条(每周累计)
第N周 | 新增代码量(行) | 累计代码量(行) | 本周学习时长(h) | 累计学习时长(h) |
---|---|---|---|---|
1 | 300 | 300 | 5 | 5 |
2 | 1500 | 1800 | 30 | 35 |
功能实现情况
- 六个骰子随机出结果
- 允许多人在微信小程序平台进行游戏
合作流程
-
本次作业采用前后端分离模式,而且小程序框架不能嵌入go的模板引擎中,只能采用前端 - 接口 - 后端的方式。所以此次作业,实际采用了两个git仓库来进行合作,以此避免污染项目的文件结构。
-
由于后端同学刚接触这方面的工作,所以大部分调试都由我来进行,实际上也写了不少后端代码。
提交记录
重点记录
虽然我写的是前端代码,但我倒是在实践中总结了更多go语言的内容
-
游戏进行的双向沟通 – websocket编程
前端websocket有HTML5原生js支持,而微信小程序也提供了开放接口,实践起来没什么困难。
// 建立连接 var SocketTask = wx.connectSocket({ url : "ws://host:port/" }) // 监听连接成功事件 SocketTask.onOpen = () => { // do something ... /* * 这里用箭头函数使函数内部this * 指针指向微信小程序内置对象, * 避免无法调用page或app对象的 * 成员函数或值 */ } // 监听服务器发送消息 SocketTask.onMessage = () => { // do something } // 发送消息 SocketTask.send(data) // data最好是json字符串
go 实现websocket,我采用的是
github.com/gorilla/websocket
库来实现http
协议到ws
协议的“升级”。// 允许跨域 func checkOrigin(r *http.Request) bool { return true } // 设置upgrader var upGrader = websocket.Upgrader{ ReadBufferSize: 1024, WriteBufferSize: 1024, CheckOrigin: checkOrigin, } // 升级一个gin的连接实例 func cmdWebSocket(c *gin.Context) { wsConn, _ := upGrader.Upgrade(c.Writer, c.Request, nil) defer wsConn.Close() // 循环读取保持连接 for { _, msg, _ := wsConn.ReadMessage() fmt.Printf("%s\n", msg) } }
详见链接
-
go channel的阻塞问题
每个用户通过客户端和服务器建立一个ws连接,保持长连接的监听和各个连接之间的传值与控制,就不得不用到go语言的通道类型。
在实际编码中,通道的操作需要开启go线程来避免通道阻塞
myChan <- 'A' // 阻塞,主进程不向下进行 str := <- myChan
myChan <- 'A' go str := <-myChan // 同步读取
详见链接
-
微信小程序全局变量
在页面生存初期,globalDate中的数据取默认值,而不是更改后的值。所以要以以下方式
// in page ... data:{ myData : getApp().globalData.myData } ...
为页面数据赋初值,得到的是默认值。此时data没有真正意义上进入app实例的生命周期,
getApp()
方法获取的是静态js文件中的值。正确的做法应是:... onload(){ this.setData({ myData : getApp().globalData.myData }) }, ...
结对编程体验
-
很糟糕
-
原型设计的功能过于复杂,以至于在实现阶段给予了极大的学习阻力。最终不得不删减很多功能。
环节中比较有启发的事件
- 合作团队成员一定要水平相当,或者各自做能力范围内的事情。
- 原型设计不要搞得那么自信
- git合作一定要有个代理。