概述

这里将记录, 学习 Learn Go with tests 的学习心得, 通过这个项目的学习了解如何利用测试用例的形式对代码进行重构, 要经常对你的已有代码进行重构.

学习的参考
https://studygolang.gitbook.io/learn-go-with-tests/
https://quii.gitbook.io/learn-go-with-tests/go-fundamentals/hello-world
中文版本的网站已经有好久没有更新了, 学习以英文网站为主.

我的练习代码库:https://gitee.com/kmyss/learn-go-with-tests.git

安装go

摘录自原文

本书的重心在于重构的重要性。 好的工具可以帮你放心地进行大型的重构。 你应该足够熟悉你的编辑器,以便使用简单的组合键执行以下操作:

  • 提取/内联变量。能够找出魔法值(magic value)并给他们一个名字可以让你快速简化你的代码。
  • 提取方法/功能。能够获取一段代码并提取函数/方法至关重要。
  • 改名。你应该能够自信地对多个文件内的符号批量重命名。
  • 格式化。Go 有一个名为 go fmt 的专有格式化程序。你的编辑器应该在每次保存文件时都运行它。
  • 运行测试。毫无疑问,你应该能够做到以上任何一点,然后快速重新运行你的测试,以确保你的重构没有破坏任何东西。

另外,为了对你处理代码更有帮助,你应该能够:

  • 查看函数签名 - 在 Go 中调用某个函数时,你应该了解并熟悉它。你的 IDE 应根据其文档,参数以及返回的内容描述一个函数。
  • 查看函数定义 - 如果仍不清楚函数的功能,你应该能够跳转到源代码并尝试自己弄清楚。
  • 查找符号的用法 - 能够查看被调用函数的上下文可以在重构时帮你做出决定。

运用好你的工具将帮助你专注于代码并减少上下文切换。

Hello World

  • 为了测试的必要性我们将 hello world 的字符串设计到一个函数中.
  • 将重复的代码提取成函数
  • 将字面量提取为常量
  • 重构要在任何时候进行
  • TDD 的基本流程熟悉:
    • 编写一个测试
    • 让编译通过
    • 运行测试,查看失败原因并检查错误消息是很有意义的
    • 编写足够的代码以使测试通过
    • 重构
  • 保证函数功能的单一性, 将生成前缀和生成 你好xx 的功能划分为两个函数处理

小结:

  • 写一个错误的测试用例, 运行看它的错误
  • 编写最少量的代码使用例通过,以获得可以运行的程序
  • 然后 重构代码,基于我们测试的安全性,以确保我们拥有易于使用的精心编写的代码

将代码的编写转换为编写小的测试用例, 在确保用例正确的情况下, 修改和重构你的重复代码.

Integers

  • 编写函数时可以编写一个 example 用于说明函数的使用方式
  • 再次熟悉 TDD 的编程工作流程

    • 编写测试用例
    • 让编译器通过
    • 让用例通过
    • 重构现有的代码, 更加精美

      Iteration

  • 这里自己按照上述要求进行编写代码

  • 测试用例如下: ```basic func TestRepeat(t *testing.T) { repeat := Repeat(“a”) expected := “aaaaa”

    if repeat != expected {

    1. t.Errorf("expected %q but got %q ", expected, repeat)

    } }

  1. - 完成函数的编写:
  2. ```basic
  3. func Repeat(s string) string {
  4. out := s
  5. out += s
  6. out += s
  7. out += s
  8. out += s
  9. return out
  10. }
  • 重构函数:

    • 第一版

      1. func Repeat(s string) string {
      2. out := ""
      3. for i := 0; i < 5; i++ {
      4. out += s
      5. }
      6. return out
      7. }
    • 第二版 ```basic const repeatCount = 5

func Repeat(character string) string { repeated := “”

  1. for i := 0; i < repeatCount; i++ {
  2. repeated += character
  3. }
  4. return repeated

} ```

  • 练习题 全部完成

代码直接查看 git 中相关提交

Arrays and slices

  • 这里学习了 从 sum -> sumall -> SumAllTails 这样一个由小功能实现大功能的例子.
  • 利用测试用例去修复了一个异常情况

    Structs, methods & interfaces

  • 使用了测试表

  • 使用接口进行测