2021秋软工实践第二次结对编程作业

本文详细记录了一次使用微信小程序和Go语言进行前后端分离开发的经验,涉及WebSocket的实现、Go语言中channel的使用以及在结对编程中遇到的问题与解决方案。作者探讨了游戏功能的实现,包括随机骰子结果和多人游戏,并分享了WebSocket在小程序和Go中的应用。此外,还提到了微信小程序全局变量的正确使用方法以及结对编程的体会,强调了合作中团队成员能力的匹配和原型设计的重要性。
摘要由CSDN通过智能技术生成
这个作业属于哪个课程构建之法-2021年秋-福州大学软件工程
这个作业要求在哪里2021秋软工实践第二次结对编程作业
个人学号031902217
结对成员学号031902204
结对小伙伴的作业博客链接博客
GitHub 仓库地址前端;后端
视频演示链接博饼小程序

PSP

PSP Stages估计时间/h完成时间/h
计划23
时间预估0.10.3
开发--
需求分析23
生成设计文档44
设计复审--
代码规范--
具体设计410
具体编码2030
代码复审--
test57
报告21
测试报告--
计算工作量0.10.1
总结与提高23
总计41.258.4

个人学习进度条(每周累计)

第N周新增代码量(行)累计代码量(行)本周学习时长(h)累计学习时长(h)
130030055
2150018003035

功能实现情况

  • 六个骰子随机出结果
  • 允许多人在微信小程序平台进行游戏

合作流程

  • 本次作业采用前后端分离模式,而且小程序框架不能嵌入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合作一定要有个代理。

合作照片

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值