高质量编程 | 青训营笔记

34 阅读2分钟

高质量编程

目标

  • 编写更简洁清晰的代码:便于阅读与合作,用清晰的代码写出思路
  • 常用的Go语言程序优化手段
  • 熟悉Go程序性能分析工具
  • 了解工程中性能优化的原则和流程

什么是高质量编程

  • 编写的代码正确可靠、简洁清晰

  • 目标:

    • 边界条件完备
    • 异常处理
    • 易读易维护
  • 原则

    • 简单性:以简单清晰的逻辑编写代码(易于修复改进)
    • 可读性:确保代码可读以编写可维护的代码(让人看得懂)
    • 生产力:团队整体工作效率非常重要(代码风格、规范、质量等)

编码规范

  • 代码格式:gofmt是Go语言官方提供的工具,能自动格式化Go语言代码为官方统一风格

    注释(提供额外的上下文信息)

    • 解释代码作用

    • 解释代码如何做的(大致的逻辑)

    • 解释代码实现的原因

    • 解释代码什么情况会出错

    • 什么地方需要注释:

      • 包中声明的每个公共的符号:变量、常量、函数以及结构都需要添加注释
      • 任何既不明显也不简短的公共功能必须予以注释
      • 无论长度或复杂程度如何对库中的任何函数都必须进行注释
      • 实现接口的方法不需要注释

    命名规范

    • 简洁胜于冗长

    • 缩略词全大写,但当其位于变量开头且不需要道出时使用全小写

      • 例如ServeHTTP而不是ServeHttp
      • 使用XMLHTTPRequest 或 xmlHTTPRequest
    • 变量距离其被使用的地方越远则需要携带更多的上下文信息

      • 距离被使用的地方很近时可以很短(例如for i:=0 ...)
      • 全局变量需要最多的上下文信息

    控制流程(让代码更简洁)

    • 避免分支嵌套
    • 优先处理错误或特殊情况,尽早返回或继续循环来减少嵌套
    • 线性原理,处理逻辑尽量走直线,避免复杂的嵌套分支(正常流程代码沿着屏幕向下移动)

    错误和异常处理

    • 简单错误:

      • 解释:只出现一次且在其他地方不需要捕获的错误

      • 处理:直接用 errors.New 创建匿名变量表示错误

        if(b==0){ return error.New("b=0") }
        
    • 错误链

      • Wrap提供一个error嵌套另一个error的能力以生成一个error的跟踪链
      • 在fmt.Errorf中使用 %w 关键字来将一个错误关联至错误链中
      • list, _, err := c.GetBytes(10)
        if err!= nil{
            return fmt.Errorf("error: %w", err)
        }
        
    • panic 和 recover 用于真正异常的情况,但是业务代码不建议使用