From 8be913d5f1a205f47486c5715e6ac50840d8c172 Mon Sep 17 00:00:00 2001 From: wnanbei Date: Sun, 13 Jun 2021 10:53:11 +0800 Subject: [PATCH 1/8] =?UTF-8?q?docs:=20=E5=AE=8C=E6=88=90=E4=B8=A4?= =?UTF-8?q?=E4=B8=AA=E7=AB=A0=E8=8A=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../chap-40-Design-Recommendations.md | 240 ++++++++++++++++++ .../imgs/advice_sources.5e438d63.png | Bin 0 -> 51939 bytes 2 files changed, 240 insertions(+) create mode 100644 chap-40-Design-Recommendations/chap-40-Design-Recommendations.md create mode 100644 chap-40-Design-Recommendations/imgs/advice_sources.5e438d63.png diff --git a/chap-40-Design-Recommendations/chap-40-Design-Recommendations.md b/chap-40-Design-Recommendations/chap-40-Design-Recommendations.md new file mode 100644 index 0000000..0fbc1ee --- /dev/null +++ b/chap-40-Design-Recommendations/chap-40-Design-Recommendations.md @@ -0,0 +1,240 @@ +# chap-40-Design-Recommendations + +## 1 本章中能学到的内容 + +- 我们将详细介绍一些实用的设计建议来改进你的代码。 + +## 2 本章中提及的技术概念 + +- 包 +- 接口 +- 方法 +- 接收者 +- cyclomatic complexity +- Halstead metrics + +## 介绍 + +This chapter will try to answer the question “how do I design my Go code?”. As a new Go developer from other languages, I asked myself this question during my beginnings. When you write software for your only use, this question is not important. When you work in a team, you have to follow conventions and best practices. + +I have read popular blog posts written by Go developers to write this chapter. My objective in this chapter is to compile those bits of advice. Do not follow them religiously. Keep in mind that each project is different. + +## 3 包名 + +Packages names are exposed to package users. Therefore they must be chosen with attention by developers. What does it means when I say exposed to users ? It means that when somebody wants to use the function Bar of your package, he has to write : + +## 4 使用接口 + +## 5 源文件 + +一个包可以由单个文件组成。这是完全合法的,但是如果您的文件超过 600 行,则会变得难以阅读。这里有一些实用的建议,可以提高源代码的可读性。 + +**建议:** + +- 将一个文件的名称命名为包名 +- 每个文件不超过 600 行 +- 一个文件 = 一份责任 + +**源文件的建议:** + +![](./imgs/advice_sources.5e438d63.png) + +- **将单文件的名称命名为包名**:如果您的包中有多个文件,最好将一个文件命名为包的名称。例如,在图 2 中,您可以看到我们有两个包:fruit 和 bike。在 fruit 包中,我们有一个 fruit.go,在 bike 包中,我们有一个 bike.go 源文件。这些文件可以存放所有水果(或自行车)共有的共享类型、接口和常量。 +- **每个文件不超过 600 行**:此建议将提高您的程序或包的可读性。文件应该很短(但不能太短);这将使维护者的生活更轻松一点(滚动长文件会很无聊)。请注意,此限制是随意的,您可以根据自己的标准进行调整。 +- **一个文件 = 一份责任**:想象一下,你是 Go 开发团队的一员,你被分配去修复一个讨厌的 bug。在 GitHub issue 上,用户正在抱怨 HTTP 客户端处理 cookie 的方式。您需要找到管理 cookie 的位置。毫无疑问,cookie 是在文件 `net/http/cookie.go` 中管理的。这种命名约定让开发人员可以轻松定位源代码责任。 + +## 6 错误处理 + +错误和问题是编程的一部分。你的程序必须处理可能发生的所有错误。作为程序员,你必须考虑最坏的情况。问问自己这行代码可能会出什么问题?有什么技术可以雇佣一个恶意用户来使你的程序崩溃? + +**建议**: + +- 始终给错误添加上下文信息 + +- 从不忽略错误 + +- 谨慎使用 fatal 错误 + +- 编写可以容错的程序 + +**错误处理的建议:** + +- **始终给错误添加上下文信息**:当创建错误时,给用户(也适用于维护你程序的团队)提供足够的信息。没有上下文信息的错误是非常难以理解的,在源代码中要找到它们的出处也非常困难。 + + ```go + func main() { + err := foo("test") + if err != nil { + fmt.Println(err) + } + } + + func foo(bar string) error { + err := baz() + if err != nil { + return err + } + return nil + } + + func baz() error { + return corge() + } + + func corge() error { + _, err := ioutil.ReadFile("/my/imagination.go") + if err != nil { + return err + } + return nil + } + + func looping() ([]byte, error) { + return ioutil.ReadFile("/my/imagination.go") + } + ``` + + 在这个小例子中,我们创建了三个函数 `foo`, `baz`, `corge` 和 `looping`。在 main 函数中,我们调用了 `foo`。这个函数将会调用 `baz`,`baz` 会调用 `corge`,`corge` 最终会尝试打开一个文件(此文件不存在)。 + + 当我们执行程序时,得到以下输出: + + ``` + open /my/imagination.go: no such file or directory + ``` + + 错误从何而来?它来自函数 `corge` 吗?它来自函数 `looping` 吗?如果你想知道,你必须完全按照执行路径去找,最终发现 `looping` 从未被调用,因此错误来自于 `corge`。 + + 在这个例子中这个练习很难,对于包中包含数百个文件的更大程序来说,它可能变成一场噩梦。 + + 解决方案?使用 Dave Cheney 原生开发的包 `errors`: + + ```go + // recommendation/errors/main.go + package main + + import ( + "fmt" + "io/ioutil" + + "github.com/pkg/errors" + ) + + func main() { + err := foo("test") + if err != nil { + fmt.Println(err) + } + } + + func foo(bar string) error { + err := baz() + if err != nil { + return errors.Wrap(err, "fail to do baz") + } + return nil + } + + func baz() error { + err := corge() + if err != nil { + return errors.Wrap(err, "fail to do corge") + } + return nil + } + + func corge() error { + _, err := ioutil.ReadFile("/my/imagination.go") + if err != nil { + return errors.Wrap(err, "fail to open imaginary file") + } + return nil + } + + func looping() ([]byte, error) { + return ioutil.ReadFile("/my/imagination.go") + } + ``` + + 我们简单地用 `Wrap` 将错误作为第一个参数并一条消息。通过这个简单的添加,我们程序的输出现在是: + + ``` + fail to do baz: fail to do corge: fail to open imaginary file: open /my/imagination.go: no such file or directory + ``` + + 可以看到错误更清晰,故障定位也立竿见影。 + + `errors` 包还有另一个功能,可以使用格式化指令 `%+v` 打印有关错误的更多信息。使用这种格式将详细打印错误堆栈跟踪的每个帧。 + +- **从不忽略错误**。这也许很显而易见,但许多开发人员仍然犯了这个错误。出现的错误应该这样处理: + + - 返回给调用者 + - 或者处理掉(你的程序实现了某种自动校正机制) + +- **谨慎使用 fatal 错误**。当你调用 `log.Fatal` 时,意味着你在强制你的程序突然退出(使用 `os.Exit(1)`)。程序会立即中止,defer 的函数将不会运行。defer 的函数通常用于清理逻辑(例如关闭文件描述符)。因此,不运行它们并不是最佳选择。 + + ```go + // standard log package. + // Fatal is equivalent to Print() followed by a call to os.Exit(1). + func Fatal(v ...interface{}) { + std.Output(2, fmt.Sprint(v...)) + os.Exit(1) + } + ``` + +- **编写可以容错的程序**。硬件工程师经常使用“容错”一词。大多数硬件组件旨在优雅地处理故障并从中恢复。软件工程师也应该在构建他们的程序时容忍错误。尽管执行失败(可能是暂时的或永久性的),但程序仍应该达到其目的。 + +### 6.1 发生错误时,检查它并确定它是否可以被回复 + +例如,你正在构建一个调用 Web 服务的程序。在你的程序执行期间,调用失败。失败的原因是网络(你的服务器已与互联网断开连接)。这个错误是可以恢复的,意味着你可以从错误中恢复,因为网络将在某个时候再次可用。 + +如果对你 Web 服务的调用成功通过网络,但返回了 http 301 错误(“资源永久移动”),则该错误不可恢复。你在定义 Web 服务的 URL 时犯了错,或者您的 Web 服务提供商在没有警告您的情况下更改了某些内容。这种情况下人为干预将是必要的。 + +- **实现备用选项** + +备用选项是“如果首选选项不可用,则是一种应急选项”(维基百科)。例如,在我们的程序中,网络调用是不可用的或返回了错误。我们应该考虑多种选项。 + +根据错误是否可恢复,选项将不相同。 + +如果遇到网络故障,你可以实现一个重试机制,而不是直接返回错误。重试机制可以让你按可配置的次数重连 Web 服务。 + +## 7 函数和方法 + +## 8 要点 + +- 包名 + + - Short: no more than one word + - No plural + - Lower case + - Informative about the service it gives + - Avoid utilities/models packages + +- 接口 + + - Use interfaces as function/method arguments & as field types + - Small interfaces are better + +- 源文件 + + - 将一个文件的名称命名为包名 + - 每个文件不超过 600 行 + - 一个文件 = 一份责任 + +- 错误处理 + + - 始终给错误添加上下文信息 + + - 从不忽略错误 + + - 谨慎使用 fatal 错误 + + - 编写可以容错的程序 + +- 函数和方法 + + - One function has one goal + - Simple names + - Limited length (100 lines maximum) + - Reduce cyclomatic complexity + - Reduce the number of nesting levels + diff --git a/chap-40-Design-Recommendations/imgs/advice_sources.5e438d63.png b/chap-40-Design-Recommendations/imgs/advice_sources.5e438d63.png new file mode 100644 index 0000000000000000000000000000000000000000..b7e76238bbdcad0c71a5fab78d86e7c14e0cf29a GIT binary patch literal 51939 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 tQBM(4v002rn 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 literal 0 HcmV?d00001 -- Gitee From 1f616bc0bde3ca1b85dd942e9f104ec67b82821f Mon Sep 17 00:00:00 2001 From: wnanbei Date: Sun, 13 Jun 2021 19:08:07 +0800 Subject: [PATCH 2/8] docs: translate 3 chapter --- .../chap-40-Design-Recommendations.md | 138 +++++++++++++++--- .../interface_implementation.41c91f23.png | Bin 0 -> 45524 bytes 2 files changed, 121 insertions(+), 17 deletions(-) create mode 100644 chap-40-Design-Recommendations/imgs/interface_implementation.41c91f23.png diff --git a/chap-40-Design-Recommendations/chap-40-Design-Recommendations.md b/chap-40-Design-Recommendations/chap-40-Design-Recommendations.md index 0fbc1ee..a76ec38 100644 --- a/chap-40-Design-Recommendations/chap-40-Design-Recommendations.md +++ b/chap-40-Design-Recommendations/chap-40-Design-Recommendations.md @@ -15,19 +15,123 @@ ## 介绍 -This chapter will try to answer the question “how do I design my Go code?”. As a new Go developer from other languages, I asked myself this question during my beginnings. When you write software for your only use, this question is not important. When you work in a team, you have to follow conventions and best practices. +本章将尝试回答“如何设计我的 Go 代码?”这个问题。作为来自其他语言的 Go 新开发者,我在一开始时问了自己这个问题。当您编写仅供自己使用的软件时,这个问题并不重要。当您在团队中工作时,您必须遵循惯例和最佳实践。 -I have read popular blog posts written by Go developers to write this chapter. My objective in this chapter is to compile those bits of advice. Do not follow them religiously. Keep in mind that each project is different. +我阅读了 Go 开发者写的热门博客文章来编写本章。我在本章中的目标是汇总这些建议。不要虔诚地遵循他们。请记住,每个项目都是不同的。 ## 3 包名 -Packages names are exposed to package users. Therefore they must be chosen with attention by developers. What does it means when I say exposed to users ? It means that when somebody wants to use the function Bar of your package, he has to write : +包名称向包的用户公开。因此,开发人员必须谨慎地选择包名。当我说向包的用户公开时是什么意思?这意味着当有人想使用你包的函数 `Bar` 时,他必须写: -## 4 使用接口 +```go +pkgName.Bar() +``` + +以下是我们可以遵循的一些标准规则。 + +**建议:** + +- 简短: 不超过一个单词 +- 不使用复数 +- 小写 +- 包提供的服务的信息 +- 不使用公共工具包 + +**包名的建议:** + +- 例子 + - **net** 很短,没有复数,全部小写,我们立刻就知道这个包包含网络功能。 + - **os** +- 反例 + - **models**:表示此处有定义数据模型的类型结构的包。包提供的服务并不清楚(除了它会收集数据模型)。例如,我们可以用一个 user 包来保存与用户相关的用户模型和函数。 + - **userManagement**: 这不是单个单词。我们会使用它来管理程序的用户,但在我看来,这些功能应该存在于 user 包中(带有指向用户类型的指针的方法作为接收器)。 + - **utils**: 这个包通常保存其他包中使用的函数。因此建议将函数直接移动到使用它们的包中。 +- **关于工具包**:对于来自其他语言的开发人员来说,拥有一个 utils 包似乎是合法的,但对于 Go 语言开发者来说,这没有意义,因为它将必须混合可以被直接插入到使用位置的函数。这是我们在项目开始时把在其他地方有用的函数放入此类型包的某种反射。但工具包并未被禁止。Go 标准库提供了工具类的函数,但倾向于按类型对它们进行分组。例如 strings 或 bytes。 + +## 4 使用 Interfaces + +接口用于定义行为。基于这个行为的定义,你可以定义多个行为的实现。你的包的用户对你的实现不感兴趣。他们只关心你为他们提供的服务。接口定义了使用公共 API 的约定。实现可能会改变。例如,你可以提高你实现的方法性能。即使你彻底改变了包的工作方式,调用它的方式也将保持稳定。 + +![interface_implementation.41c91f23](./imgs/interface_implementation.41c91f23.png) + +在 Go 中,interface 是一种特殊的类型。你可以将其用作函数或方法的参数。 + +**建议:** + +- 使用 interface 作为函数或方法的参数和字段类型 +- 小接口更好 + +**接口使用的建议:** + +- **使用 interface 作为函数或方法的参数和字段类型**(请记住,它们也是类型)。通过接受 interface 作为参数,你可以突出这样一个事实,即在你的函数内部,你将只使用 interface 定义的行为。 + + 为了更好地理解,让我们举个例子。想象一下构建一个新的花哨的加密算法来与朋友秘密交换消息。 + + 你会需要开发一个函数来解密消息(也加密它们)。在下一个清单中,你会看到你的第一次尝试 (`Decrypt1`): + + ```go + func Decrypt1(b []byte) ([]byte, error) { + //... + } + ``` + + 它接受一个字节切片作为参数并返回一个字节切片和一个错误。这个函数并没有什么不好,除了我们使用它时只能用一个字节切片作为输入。想象一下,你想用这种方法解密整个文件而不是一个字节切片?你需要从文件中读取所有字节并将其传递给 `Decrypt1` 函数。 + + 我们必须找到一种类型,使我们的 `Decrypt1` 函数更通用。用于此目的的 interface 是 `io.Reader`。标准库中的许多类型都实现了这个接口: + + - `os.File` + - `net.TCPConn` + - `net.UDPConn` + - `net.UnixConn` + + 如果你接收 `io.Reader` 作为参数,则既可以解密文件,也可以将其用于通过 TCP 或 UDP 传输的数据。这是该函数的第二个版本: + + ```go + func Decrypt2(r io.Reader) ([]byte, error) { + //... + } + ``` + + `io.Reader` 接口定义了一种行为,即 `Read`。实现了接口 `io.Reader` 中定义的 `Read` 函数的类型就是一个 `io.Reader`。 + + 这意味着我们的 `Decrypt2` 函数可以采用任何实现了 io.Reader 接口的类型。 + +- **小接口更好** + + 如果我们以标准 Go 库的接口为例,你会注意到它们通常非常小。行为的数量定义了接口的大小(换句话说,指定的方法签名的数量)。 + + 在 Go 中,你不需要指明类型实现一个接口。因此,当你的接口由许多行为组成时,很难看出哪些类型实现了这个接口。这就是为什么小接口在程序员的日常中更容易处理的原因。 + + 你可以注意到,Go 标准库中的许多接口是由 2-3 个方法组成的。我们以两个著名的 io.Reader 和 io.Writer 为例: + + ```go + type Reader interface { + Read(p []byte) (n int, err error) + } + type Writer interface { + Write(p []byte) (n int, err error) + } + ``` + + 这是一个反例: + + ```go + type Bad interface { + Foo(string) error + Bar(string) error + Baz([]byte) error + Bal(string, io.Closer) error + Cux() + Corge() + Corege3() + } + ``` + + `Bad` 接口很难实现。想要实现它的人需要开发七个方法!如果你打算构建一个广泛使用的包,你会让新手很难使用你的抽象方式。 ## 5 源文件 -一个包可以由单个文件组成。这是完全合法的,但是如果您的文件超过 600 行,则会变得难以阅读。这里有一些实用的建议,可以提高源代码的可读性。 +一个包可以由单个文件组成。这是完全合法的,但是如果你的文件超过 600 行,则会变得难以阅读。这里有一些实用的建议,可以提高源代码的可读性。 **建议:** @@ -39,9 +143,9 @@ Packages names are exposed to package users. Therefore they must be chosen with ![](./imgs/advice_sources.5e438d63.png) -- **将单文件的名称命名为包名**:如果您的包中有多个文件,最好将一个文件命名为包的名称。例如,在图 2 中,您可以看到我们有两个包:fruit 和 bike。在 fruit 包中,我们有一个 fruit.go,在 bike 包中,我们有一个 bike.go 源文件。这些文件可以存放所有水果(或自行车)共有的共享类型、接口和常量。 -- **每个文件不超过 600 行**:此建议将提高您的程序或包的可读性。文件应该很短(但不能太短);这将使维护者的生活更轻松一点(滚动长文件会很无聊)。请注意,此限制是随意的,您可以根据自己的标准进行调整。 -- **一个文件 = 一份责任**:想象一下,你是 Go 开发团队的一员,你被分配去修复一个讨厌的 bug。在 GitHub issue 上,用户正在抱怨 HTTP 客户端处理 cookie 的方式。您需要找到管理 cookie 的位置。毫无疑问,cookie 是在文件 `net/http/cookie.go` 中管理的。这种命名约定让开发人员可以轻松定位源代码责任。 +- **将单文件的名称命名为包名**:如果你的包中有多个文件,最好将一个文件命名为包的名称。例如,在图 2 中,你可以看到我们有两个包:fruit 和 bike。在 fruit 包中,我们有一个 fruit.go,在 bike 包中,我们有一个 bike.go 源文件。这些文件可以存放所有水果(或自行车)共有的共享类型、接口和常量。 +- **每个文件不超过 600 行**:此建议将提高你的程序或包的可读性。文件应该很短(但不能太短);这将使维护者的生活更轻松一点(滚动长文件会很无聊)。请注意,此限制是随意的,你可以根据自己的标准进行调整。 +- **一个文件 = 一份责任**:想象一下,你是 Go 开发团队的一员,你被分配去修复一个讨厌的 bug。在 GitHub issue 上,用户正在抱怨 HTTP 客户端处理 cookie 的方式。你需要找到管理 cookie 的位置。毫无疑问,cookie 是在文件 `net/http/cookie.go` 中管理的。这种命名约定让开发人员可以轻松定位源代码责任。 ## 6 错误处理 @@ -183,11 +287,11 @@ Packages names are exposed to package users. Therefore they must be chosen with - **编写可以容错的程序**。硬件工程师经常使用“容错”一词。大多数硬件组件旨在优雅地处理故障并从中恢复。软件工程师也应该在构建他们的程序时容忍错误。尽管执行失败(可能是暂时的或永久性的),但程序仍应该达到其目的。 -### 6.1 发生错误时,检查它并确定它是否可以被回复 +### 6.1 发生错误时,检查它并确定它是否可以被恢复 例如,你正在构建一个调用 Web 服务的程序。在你的程序执行期间,调用失败。失败的原因是网络(你的服务器已与互联网断开连接)。这个错误是可以恢复的,意味着你可以从错误中恢复,因为网络将在某个时候再次可用。 -如果对你 Web 服务的调用成功通过网络,但返回了 http 301 错误(“资源永久移动”),则该错误不可恢复。你在定义 Web 服务的 URL 时犯了错,或者您的 Web 服务提供商在没有警告您的情况下更改了某些内容。这种情况下人为干预将是必要的。 +如果对你 Web 服务的调用成功通过网络,但返回了 http 301 错误(“资源永久移动”),则该错误不可恢复。你在定义 Web 服务的 URL 时犯了错,或者你的 Web 服务提供商在没有警告你的情况下更改了某些内容。这种情况下人为干预将是必要的。 - **实现备用选项** @@ -203,16 +307,16 @@ Packages names are exposed to package users. Therefore they must be chosen with - 包名 - - Short: no more than one word - - No plural - - Lower case - - Informative about the service it gives - - Avoid utilities/models packages + - 简短: 不超过一个单词 + - 不使用复数 + - 小写 + - 包提供的服务的信息 + - 不使用公共工具包 - 接口 - - Use interfaces as function/method arguments & as field types - - Small interfaces are better + - 使用 interface 作为函数或方法的参数和字段类型 + - 小接口更好 - 源文件 diff --git a/chap-40-Design-Recommendations/imgs/interface_implementation.41c91f23.png b/chap-40-Design-Recommendations/imgs/interface_implementation.41c91f23.png new file mode 100644 index 0000000000000000000000000000000000000000..087376030d45cff4b3458251b3b4289e98eaf20c GIT binary patch literal 45524 zcmd43cUV;0w%I zh8W;t7}SXaE}bM{WZ)9Y@rn;zUYNgk02kr0|L{dmS-0D31ibMwFFQMX#0LU-je1P1 ze?UM$U|_w?^7sGoJ9W0VZ$oSEK|EXklZO}?8cJ&4g$NUX&t90HfC2p{Hx2dRK;*$- zJqu7jz4#BKW))-Rg9xL>Un&lM^861I>BMUQ6Gu&{lLYnCf0)|~CDf}&{^vowP-<^) z|Mcn8n>TM13GYHeWA5nIqwHwguKr&v3Hb28uVtU)7P$9UnF7^wq0js;jfqB8`eSBzAot@})iokh3zwuX579j!mdpFR{<-&d4eXAlH`C z#$-#Z(>@;&cDG7sOy_?}yZ9NeHmO$6nhKr(Nh!$OiBWWGy{x}5mi>n|x>DJCRqNpB zbzkg>@igJe-xZf1`?EjCG}I1U4?G zc0BEdxUn-?Gv)CFOD<>o_6_6dJBHtZ-Go;&`~xoatgGL061@5_QcAvS5^GDZf81_A zE!yl|jN4qVbo=|6_FRdDMcl%KC*@vnpVG>=)eMwA5en&Y<==DfK5a7W~~w4R;~Voy6@ zt@4|;mN@p_`8vMk1K{ z^2UmEtcTz?-^#`1(s#Ep!*KDR6S>cFBdJG~uTz3EG}qs`Pd6YIN&;e$-Ta1P)O^{g zl=sgpjPs6_RkQ{lyBLhXT{H^0+W9yMq@L8VJ?7o<@8n;5Q@BeuM=m(hSh5$lMPYT2 zr0o*?UAHDSrXszLpbx*W(B*`5rYXdTO�vwKXv?qo@oHZ0NjaZ-uPLottHbZ(o6L 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

TeFd=B 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 Date: Sun, 13 Jun 2021 19:31:12 +0800 Subject: [PATCH 3/8] docs: some modify --- .../chap-40-Design-Recommendations.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/chap-40-Design-Recommendations/chap-40-Design-Recommendations.md b/chap-40-Design-Recommendations/chap-40-Design-Recommendations.md index a76ec38..72721bf 100644 --- a/chap-40-Design-Recommendations/chap-40-Design-Recommendations.md +++ b/chap-40-Design-Recommendations/chap-40-Design-Recommendations.md @@ -21,7 +21,7 @@ ## 3 包名 -包名称向包的用户公开。因此,开发人员必须谨慎地选择包名。当我说向包的用户公开时是什么意思?这意味着当有人想使用你包的函数 `Bar` 时,他必须写: +包名称向包的用户公开。因此,开发人员必须谨慎地选择包名。当我说向包的用户公开是什么意思?这意味着当有人想使用你包的函数 `Bar` 时,他必须写: ```go pkgName.Bar() @@ -143,13 +143,13 @@ pkgName.Bar() ![](./imgs/advice_sources.5e438d63.png) -- **将单文件的名称命名为包名**:如果你的包中有多个文件,最好将一个文件命名为包的名称。例如,在图 2 中,你可以看到我们有两个包:fruit 和 bike。在 fruit 包中,我们有一个 fruit.go,在 bike 包中,我们有一个 bike.go 源文件。这些文件可以存放所有水果(或自行车)共有的共享类型、接口和常量。 -- **每个文件不超过 600 行**:此建议将提高你的程序或包的可读性。文件应该很短(但不能太短);这将使维护者的生活更轻松一点(滚动长文件会很无聊)。请注意,此限制是随意的,你可以根据自己的标准进行调整。 +- **将单文件的名称命名为包名**:如果你的包中有多个文件,最好将一个文件命名为包的名称。例如,在图 2 中,你可以看到我们有两个包:fruit 和 bike。在 fruit 包中,我们有一个 fruit.go,在 bike 包中,我们有一个 bike.go 源文件。这些文件可以存放所有 fruit(或 bike)共有的共享类型、接口和常量。 +- **每个文件不超过 600 行**:此建议将提高你的程序或包的可读性。文件应该很短(但不能太短);这会让维护者的生活更轻松一点(滚动长文件会很无聊)。请注意,此限制是随意的,你可以根据自己的标准进行调整。 - **一个文件 = 一份责任**:想象一下,你是 Go 开发团队的一员,你被分配去修复一个讨厌的 bug。在 GitHub issue 上,用户正在抱怨 HTTP 客户端处理 cookie 的方式。你需要找到管理 cookie 的位置。毫无疑问,cookie 是在文件 `net/http/cookie.go` 中管理的。这种命名约定让开发人员可以轻松定位源代码责任。 ## 6 错误处理 -错误和问题是编程的一部分。你的程序必须处理可能发生的所有错误。作为程序员,你必须考虑最坏的情况。问问自己这行代码可能会出什么问题?有什么技术可以雇佣一个恶意用户来使你的程序崩溃? +错误和问题是编程的一部分。你的程序必须处理可能发生的所有错误。作为程序员,你必须考虑最坏的情况。问问自己这行代码可能会出什么问题?恶意用户可能使用什么技术来让你的程序崩溃? **建议**: @@ -259,7 +259,7 @@ pkgName.Bar() } ``` - 我们简单地用 `Wrap` 将错误作为第一个参数并一条消息。通过这个简单的添加,我们程序的输出现在是: + 我们简单地调用 `Wrap` 方法,将错误和一条信息作为参数。通过这个简单的添加,我们程序现在的输出是: ``` fail to do baz: fail to do corge: fail to open imaginary file: open /my/imagination.go: no such file or directory @@ -289,9 +289,9 @@ pkgName.Bar() ### 6.1 发生错误时,检查它并确定它是否可以被恢复 -例如,你正在构建一个调用 Web 服务的程序。在你的程序执行期间,调用失败。失败的原因是网络(你的服务器已与互联网断开连接)。这个错误是可以恢复的,意味着你可以从错误中恢复,因为网络将在某个时候再次可用。 +例如,你正在构建一个调用 Web 服务的程序。在你的程序执行期间,调用失败。失败的原因是网络(你的服务器已与互联网断开连接)。这个错误是可以恢复的,因为网络将在某个时候再次可用。 -如果对你 Web 服务的调用成功通过网络,但返回了 http 301 错误(“资源永久移动”),则该错误不可恢复。你在定义 Web 服务的 URL 时犯了错,或者你的 Web 服务提供商在没有警告你的情况下更改了某些内容。这种情况下人为干预将是必要的。 +如果对你 Web 服务的调用成功通过网络,但返回了 http 301 错误(“资源永久移动”),则该错误不可以恢复。因为你定义了错误的 Web 服务的 URL,或者你的 Web 服务提供商在没有警告你的情况下更改了某些内容。这种情况下人为干预将是必要的。 - **实现备用选项** -- Gitee From 072414211d36e25a6c69b8dab1c65fc88dbdc496 Mon Sep 17 00:00:00 2001 From: wnanbei Date: Sun, 13 Jun 2021 21:41:39 +0800 Subject: [PATCH 4/8] =?UTF-8?q?docs:=20=E6=96=B0=E5=A2=9E=E7=AB=A0?= =?UTF-8?q?=E8=8A=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../chap-40-Design-Recommendations.md | 386 ++++++++++++++++++ .../imgs/cyclo_complexity.a4f7ffbc.png | Bin 0 -> 75198 bytes .../imgs/edge_nodes.a895b46e.png | Bin 0 -> 23004 bytes 3 files changed, 386 insertions(+) create mode 100644 chap-40-Design-Recommendations/imgs/cyclo_complexity.a4f7ffbc.png create mode 100644 chap-40-Design-Recommendations/imgs/edge_nodes.a895b46e.png diff --git a/chap-40-Design-Recommendations/chap-40-Design-Recommendations.md b/chap-40-Design-Recommendations/chap-40-Design-Recommendations.md index 72721bf..d38f7a1 100644 --- a/chap-40-Design-Recommendations/chap-40-Design-Recommendations.md +++ b/chap-40-Design-Recommendations/chap-40-Design-Recommendations.md @@ -303,6 +303,392 @@ pkgName.Bar() ## 7 函数和方法 +函数和方法在程序中无处不在。一个语法正确的函数(即通过程序编译)可能在代码风格上并不正确。我们想在这里介绍一些与函数编写相关的建议。总之,如何写出风格正确的函数。 + +**建议:** + +- 一个函数一个目的 +- 名称简单 +- 限制长度(最大 100 行) +- Reduce cyclomatic complexity +- 减少嵌套层数 + +### 7.1 一个函数一个目标 + +函数是一个执行**特定**任务的有名称的过程(或例程)。它可以有输入参数,也可以有输出参数。这里的重要术语是“特定”。函数(或方法)执行单个任务,而不是多个。它只有一个目的。 + +一个好的的函数只做一件事,并且做得非常好。例如,在 `math` 包中,指数函数将为每个 x 实数值计算 `exp(x)` 的值。 + +这个函数应该只有一个目旳,这很容易理解。该函数不会同时计算 x 的指数和对数值。相反,我们有两个函数,指数函数和对数函数。 + +这是一个反例: + +```go +type User struct { + //... +} + +func (u *User) saveAndAuthorize error { + //... + return nil +} +``` + +这个 `saveAndAuthorize` 方法会执行 2 个任务: + +- 保存这个用户 +- **并**授权它 + +两个不同的任务需要不同的能力(写入数据库、读取数据库、检查访问令牌有效性...)。这个程序可以通过编译,但很难进行测试。返回的错误可以由数据层的故障引起,也可以由应用程序的安全层引起。 + +A solution could be to split the function into two different ones : `create` and `authorize`. + +一种解决方案是将函数拆分为两个不同的函数:`create` 和 `authorize`。 + +```go +func (u *User) create error { + //.. + return nil +} + +func (user *User) authorize error { + //... + return nil +} +``` + +### 7.2 名称简单 + +- 不要在方法名称中重复接收器的名称 + +例如: + +```go +func (u *User) saveUser() error { + + return nil +} + +func (u *User) authorizeUser() error { + + return nil +} +``` + +我们可以重命名这两个函数: + +```go +func (u *User) save() error { + + return nil +} + +func (u *User) authorize() error { + + return nil +} +``` + +我们通过删除类型名称 user 来减短函数名称的长度。记住要始终**站在包调用者的角度**思考。让我们来比较这两个代码片段: + +```go +user := user.NewUser() +err := user.saveUser() +if err != nil { + //.. +} + +user := user.New() +err := user.save() +if err != nil { + //.. +} +``` + +第二个比第一个简洁得多。第一个由 65 个字符组成,而第二个由 57 个字符组成(包括空格)。 + +### 7.3 限制代码行数 + +一个函数应该只有一个目的(见上一节),而且应该很小。当您增加函数中的行数时,您也增加了阅读和理解它的时间和认知所需的努力。 + +例如,这是包 `heap` 中的函数 `Pop` : + +```go +func Pop(h Interface) interface{} { + n := h.Len() - 1 + h.Swap(0, n) + down(h, 0, n) + return h.Pop() +} +``` + +这个函数的行数只有 4。这使它变得非常容易和理解。将这个函数与 `ascii85` 包中的这个函数比较: + +```go +func (d *decoder) Read(p []byte) (n int, err error) { + if len(p) == 0 { + return 0, nil + } + if d.err != nil { + return 0, d.err + } + + for { + // Copy leftover output from last decode. + if len(d.out) > 0 { + n = copy(p, d.out) + d.out = d.out[n:] + return + } + + // Decode leftover input from last read. + var nn, nsrc, ndst int + if d.nbuf > 0 { + ndst, nsrc, d.err = Decode(d.outbuf[0:], d.buf[0:d.nbuf], d.readErr != nil) + if ndst > 0 { + d.out = d.outbuf[0:ndst] + d.nbuf = copy(d.buf[0:], d.buf[nsrc:d.nbuf]) + continue // copy out and return + } + if ndst == 0 && d.err == nil { + // Special case: input buffer is mostly filled with non-data bytes. + // Filter out such bytes to make room for more input. + off := 0 + for i := 0; i < d.nbuf; i++ { + if d.buf[i] > ' ' { + d.buf[off] = d.buf[i] + off++ + } + } + d.nbuf = off + } + } + + // Out of input, out of decoded output. Check errors. + if d.err != nil { + return 0, d.err + } + if d.readErr != nil { + d.err = d.readErr + return 0, d.err + } + + // Read more data. + nn, d.readErr = d.r.Read(d.buf[d.nbuf:]) + d.nbuf += nn + } +} +``` + +这个函数有 50 行。 + +多大的行数是合适的。在我看来,一个好的函数不应该超过 30 行。您应该能够在您的 IDE(代码编辑器)窗口中显示一个函数而无需向下滚动。在我的 IDE 上,我一次只能阅读 38 行。 + +### 7.4 降低圈复杂度 + +函数内部的行数并不足以判断其简单性。1976 年,Thomal J.McCabe 提出了一个有趣的概念,称为“圈复杂度”。这个想法是我们可以使用图论来检测程序中的复杂性。 + +我们可以用一个或多个条件语句组成一个函数。例如,我们可以有多个 if 语句。让我们看看下面的例子。 + +```go +package main + +import "fmt" + +func main() { + fmt.Println(foo(2, 3)) + fmt.Println(foo(11, 0)) + fmt.Println(foo(8, 12)) +} + +func foo(a, b int) int { + if a > 10 { + return a + } + if b > 10 { + return b + } + return b - a +} +``` + +在函数 `foo` 中,我们有两个输入参数 `a` 和 `b`。在函数体中,我们可以看到两个 if 语句。我们有两个条件(我们将 `a` 和 `b` 与特定数字进行比较)。 + +当我们运行我们的函数时,我们可以想象三个逻辑“路径”: + +- 第一个条件为真。不评估第二个条件。返回值为 `a`。 +- 第一个条件为假,第二个条件为真。返回值为 `b`。 +- 第一个条件为假,第二个条件也为假。返回值为 `b-a`。 + +我们有三个路径。您拥有的路径越多,理解该功能所需的努力就越多。 + +您获得的路径越多,您必须开发的单元测试就越多,以涵盖所有可能的情况。 + +#### 7.4.0.1 计算圈的数量 + +本节不是理解降低圈复杂度的概念所必需的。但是,您可能会发现了解“圈复杂度”背后的推理很有趣。 + +首先,每个程序都可以看作是一个图。图由节点和边组成。例如,在图 3 上,您可以看到一个图。图由节点和边组成。每个节点将代表一组代码。边将代表程序中的控制流。 + +![](./imgs/edge_nodes.a895b46e.png) + +举一个简单的例子。我们有以下功能: + +```go +func bar(a int) { + fmt.Println("start of function") + if a > 2 { + fmt.Println("a is greater than 2") + return + } + fmt.Println("you got") + fmt.Println("bad luck") +} +``` + +![](./imgs/cyclo_complexity.a4f7ffbc.png) + +我们在这里用一组节点和边来表示程序。每个代码块由一个节点表示。这里非常重要。我们不是为每条语句添加一个节点,而是为每组跟在决策规则之后的语句添加一个节点。这里我们必须调用由单个节点表示的 `fmt.Println`。 + +让我们来计算该图上的节点和边: + +- 四个节点 +- 三个边 + +得到圈复杂度的公式是(对于一个函数): + +``` +V(G)= # of edges- # of nodes + 2 +``` + +圈数表示为 V(G)。 + +``` +V(G)= 3 - 3 + 2 = 2 +``` + +这里圈数等于 2,这意味着我们的程序定义了两条线性无关的路径。当这个数字增加时,你的函数的复杂性也会增加: + +- 更多的路径意味着需要开发更多单元测试以完全覆盖您的代码。 +- 更多的路径意味着你的同事需要更多的脑力来理解你的代码。 + +**关于圈数的一些重要结论:** + +- 这个数字只取决于“图的决策结构”。 +- 当您向代码中添加功能语句时,它不会受到影响。 +- 如果在图中插入一条新边,那么圈数就会增加 1。 + +### 7.5 Halstead 指标 + +我想在本节中专门讨论所谓的“Halstead 复杂性指标”。 Maurice Howard Halstead 是计算机科学的先驱之一。他在 1977 年开发了度量标准,以使用源自其源代码的度量标准评估程序的复杂性。 + +- 程序的**词汇** +- 程序的**长度** +- 编写程序所需的**努力** +- 阅读和理解程序所需的**难度** + +Halstead 指标基于两个概念。运算符和操作数。程序由标记组成。这些标记是关键字、变量名称、方括号、大括号...等。这些标记可以分为两大类: + +1. **运算符:** + 1. 所有的关键字。(func, const, var,...) + 2. 成对的括号,成对的大括号。 ({},()) + 3. 所有的比较和逻辑运算符。 ( >,<,&&,||,...) +2. **操作数:** + 1. Identifiers (a, myVariableName, myConstantName, myFunction,...) + 2. 常量 (“this is a string”, 3, 22,...) + 3. Type specification (int, bool,...) + +从这两个定义中,我们可以提取一些基数(我们将使用它来计算 Halstead 指标): + +- n~1~ 不同运算符的数量 +- n~2~ 不同操作数的数量 +- N~1~ 运算符的总数 +- N~2~ 操作数的总数 + +让我们以一个示例程序来提取这四个数字: + +```go +func bar(a int) { + fmt.Println("start of function") + if a > 2 { + fmt.Println("a is greater than 2") + return + } + fmt.Println("you got") + fmt.Println("bad luck") +} +``` + +n~1~ 是不同运算符的数量 + +- func, bar, (), {}, if, >, return + - 我们有 7 个不同的运算符 + +n~2~ 是不同操作数的数量 + +- int, a, fmt.Println,start of function, 2, a is greater than 2,you got,bad luck + - 我们有 7 个不同的操作数 + +N~1~ 是运算符的总数 + +- func, bar, (), () ,() ,() ,() ,{},{}, if, >, return + - 我们有 12 个 + +N~2~ 是操作数的总数 + +- a, a,start of function, 2, a is greater than 2,you got,bad luck, fmt.Println, fmt.Println,fmt.Println, fmt.Println, int + - 我们有总共 12 个操作数 + +来为我们的程序计算 Halstead 指标: + +- **词汇** + + n = n~1~ + n~2~ = 8 + 9 = 17 + +- **长度** + + N = N~1~ + N~2~ = 12 + 12 = 24 + +- **难度** + + \frac{n_{1}}{2}\times\frac{N_{2}}{n_{2}}=5.332*n*1×*n*2*N*2=5.33 + +- **体积** + + 长度 × log=98.10 + +- **努力** + + \text{difficulty}\times\text{volume = 523.20}difficulty×volume = 523.20 + +这些公式需要一些解释。 + +- The **vocabulary** of a program is just like the vocabulary of some essay. For an English essay, we can say that an author’s vocabulary is the total number of different words. For a program, this is the addition of the total number of distinct operators and operands. If the program use only reserved words and a very limited number of identifiers, its vocabulary will below. On the contrary, if your program uses many identifiers, the vocabulary will increase. +- 程序的词汇就像一些文章的词汇。对于一篇英语文章,我们可以说作者的词汇量是不同单词的总数。对于程序,这是相加的不同运算符和操作数的总数。如果程序只使用保留字和非常有限数量的标识符,它的词汇表将在下面。相反,如果你的程序使用了很多标识符,词汇量就会增加。 +- The **length** of a program is the total number of operators and operands used. Here we are not counting distinct tokens but the total number of tokens. +- 程序的长度是使用的运算符和操作数的总数。在这里,我们不计算不同的令牌,而是计算令牌的总数。 +- The **difficulty** is here to give an idea about the amount of time needed to write the program, and to read it. This metrics is equal to half the number of operands multiplied by the quotient between the total number of operators and the distinct number of operands. If your program uses a limited number of operands, the difficulty will be reduced. If the total number of operands increases, the difficulty will also increase (more comparisons, more identifiers, more types to handle and remember). +- 难点在于给出编写程序和阅读程序所需时间的概念。该指标等于操作数数量的一半乘以运算符总数与不同的操作数数量之间的商。如果您的程序使用有限数量的操作数,则难度会降低。如果操作数的总数增加,难度也会增加(更多的比较,更多的标识符,更多的类型来处理和记住)。 +- The effort metric can then be used to compute the time necessary to write the program. +- 然后可以使用工作量度量来计算编写程序所需的时间。 + +Time to write the program : E/18 (in seconds) : in our example : 29 seconds (523,20 / 18). + +编写程序的时间:E/18(以秒为单位):在我们的示例中:29 秒(523,20 / 18)。 + +Halstead also details an estimated number of bugs!B=\frac{E^{2/3}}{3000}*B*=3000*E*2/3 + +Halstead 还详细介绍了估计的错误数量! + +#### 7.5.0.1 Comment + +- Those metrics are interesting, but we should take them cautiously. +- 这些指标很有趣,但我们应该谨慎对待。 +- However, they highlight that the more code we write, the more complex our program will become. +- 然而,他们强调我们编写的代码越多,我们的程序就会变得越复杂。 +- A simple, short, and stupid code is better than an over-engineered solution. +- 简单、简短和愚蠢的代码比过度设计的解决方案要好。 + ## 8 要点 - 包名 diff --git a/chap-40-Design-Recommendations/imgs/cyclo_complexity.a4f7ffbc.png b/chap-40-Design-Recommendations/imgs/cyclo_complexity.a4f7ffbc.png new file mode 100644 index 0000000000000000000000000000000000000000..3da7c56167e940459732527002bafc589c3b3ad4 GIT binary patch literal 75198 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ð|3l<0E4$RC>=F4h$wFL$ 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

(CN+kXTNz2pas$j*3AlA#nUXC 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%0A*pa4 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 R<~iU1qM@pzf`VBG{SPyoaAW`g literal 0 HcmV?d00001 diff --git a/chap-40-Design-Recommendations/imgs/nested_stetements.f4da2548.png b/chap-40-Design-Recommendations/imgs/nested_stetements.f4da2548.png new file mode 100644 index 0000000000000000000000000000000000000000..e8942dba2888f10af880bea6b4e77af38353e212 GIT binary patch literal 21331 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 ODlysyzmU)uL;nR^{7%CF literal 0 HcmV?d00001 -- Gitee From 2d293ae9e50f386a96faa7a33e4752c5c0a041d8 Mon Sep 17 00:00:00 2001 From: wnanbei Date: Tue, 15 Jun 2021 13:50:56 +0800 Subject: [PATCH 8/8] =?UTF-8?q?docs:=20=E6=9B=B4=E6=96=B0=E6=A0=A1?= =?UTF-8?q?=E5=AF=B9=E5=90=8E=E4=BF=AE=E6=94=B9=E5=86=85=E5=AE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../chap-40-Design-Recommendations.md | 38 +++++++++---------- 1 file changed, 18 insertions(+), 20 deletions(-) diff --git a/chap-40-Design-Recommendations/chap-40-Design-Recommendations.md b/chap-40-Design-Recommendations/chap-40-Design-Recommendations.md index 4091885..961e3f7 100644 --- a/chap-40-Design-Recommendations/chap-40-Design-Recommendations.md +++ b/chap-40-Design-Recommendations/chap-40-Design-Recommendations.md @@ -1,4 +1,4 @@ -# chap-40-Design-Recommendations +# chap-40-设计建议 ## 1 本章中能学到的内容 @@ -21,7 +21,7 @@ ## 3 包名 -包名称向包的用户公开。因此,开发人员必须谨慎地选择包名。当我说向包的用户公开是什么意思?这意味着当有人想使用你包的函数 `Bar` 时,他必须写: +包的名称向包的用户公开。因此,开发人员必须谨慎地选择包名。向包的用户公开是什么意思?它的意思是当有人想使用你包内的函数 `Bar` 时,他必须这样写: ```go pkgName.Bar() @@ -46,7 +46,7 @@ pkgName.Bar() - **models**:表示此处有定义数据模型的类型结构的包。包提供的服务并不清楚(除了它会收集数据模型)。例如,我们可以用一个 user 包来保存与用户相关的用户模型和函数。 - **userManagement**: 这不是单个单词。我们会使用它来管理程序的用户,但在我看来,这些功能应该存在于 user 包中(带有指向用户类型的指针的方法作为接收器)。 - **utils**: 这个包通常保存其他包中使用的函数。因此建议将函数直接移动到使用它们的包中。 -- **关于工具包**:对于来自其他语言的开发人员来说,拥有一个 utils 包似乎是合法的,但对于 Go 语言开发者来说,这没有意义,因为它将必须混合可以被直接插入到使用位置的函数。这是我们在项目开始时把在其他地方有用的函数放入此类型包的某种反射。但工具包并未被禁止。Go 标准库提供了工具类的函数,但倾向于按类型对它们进行分组。例如 strings 或 bytes。 +- **关于工具包**:对于来自其他语言的开发人员来说,拥有一个 utils 包似乎是合法的,但对于 Go 语言开发者来说,这没有意义,因为它将必须混合可以被直接插入到使用位置的函数。这是我们在项目开始时把在其他地方有用的函数放入此类型包的某种反射。但工具包并未被禁止。Go 标准库提供了工具类的函数,只不过倾向于按类型对它们进行分组。例如 strings 或 bytes。 ## 4 使用 Interfaces @@ -67,7 +67,7 @@ pkgName.Bar() 为了更好地理解,让我们举个例子。想象一下构建一个新的花哨的加密算法来与朋友秘密交换消息。 - 你会需要开发一个函数来解密消息(也加密它们)。在下一个清单中,你会看到你的第一次尝试 (`Decrypt1`): + 你将需要开发一个函数来解密消息(也可以加密消息)。在下面的代码中,你可以看到你的第一次尝试 (`Decrypt1`): ```go func Decrypt1(b []byte) ([]byte, error) { @@ -143,7 +143,7 @@ pkgName.Bar() ![](./imgs/advice_sources.5e438d63.png) -- **将单文件的名称命名为包名**:如果你的包中有多个文件,最好将一个文件命名为包的名称。例如,在图 2 中,你可以看到我们有两个包:fruit 和 bike。在 fruit 包中,我们有一个 fruit.go,在 bike 包中,我们有一个 bike.go 源文件。这些文件可以存放所有 fruit(或 bike)共有的共享类型、接口和常量。 +- **将单文件的名称命名为包名**:如果你的包中有多个文件,最好将一个文件命名为包的名称。例如,在上图中,你可以看到我们有两个包:fruit 和 bike。在 fruit 包中,我们有一个 fruit.go,在 bike 包中,我们有一个 bike.go 源文件。这些文件可以存放所有 fruit(或 bike)共有的共享类型、接口和常量。 - **每个文件不超过 600 行**:此建议将提高你的程序或包的可读性。文件应该很短(但不能太短);这会让维护者的生活更轻松一点(滚动长文件会很无聊)。请注意,此限制是随意的,你可以根据自己的标准进行调整。 - **一个文件 = 一份责任**:想象一下,你是 Go 开发团队的一员,你被分配去修复一个讨厌的 bug。在 GitHub issue 上,用户正在抱怨 HTTP 客户端处理 cookie 的方式。你需要找到管理 cookie 的位置。毫无疑问,cookie 是在文件 `net/http/cookie.go` 中管理的。这种命名约定让开发人员可以轻松定位源代码责任。 @@ -208,7 +208,7 @@ pkgName.Bar() 错误从何而来?它来自函数 `corge` 吗?它来自函数 `looping` 吗?如果你想知道,你必须完全按照执行路径去找,最终发现 `looping` 从未被调用,因此错误来自于 `corge`。 - 在这个例子中这个练习很难,对于包中包含数百个文件的更大程序来说,它可能变成一场噩梦。 + 在这个例子中,定位源码里错误发生的位置很难,对于包中包含数百个文件的更大程序来说,它可能变成一场噩梦。 解决方案?使用 Dave Cheney 原生开发的包 `errors`: @@ -274,7 +274,7 @@ pkgName.Bar() - 返回给调用者 - 或者处理掉(你的程序实现了某种自动校正机制) -- **谨慎使用 fatal 错误**。当你调用 `log.Fatal` 时,意味着你在强制你的程序突然退出(使用 `os.Exit(1)`)。程序会立即中止,defer 的函数将不会运行。defer 的函数通常用于清理逻辑(例如关闭文件描述符)。因此,不运行它们并不是最佳选择。 +- **谨慎使用 fatal 错误**。当你调用 `log.Fatal` 时,意味着你在强制你的程序突然退出(使用 `os.Exit(1)`)。程序会立即中止,defer 的函数将不会运行。defer 的函数通常用于清理逻辑(例如关闭文件描述符)。因此,我们最好还是运行 defer 函数。 ```go // standard log package. @@ -291,7 +291,7 @@ pkgName.Bar() 例如,你正在构建一个调用 Web 服务的程序。在你的程序执行期间,调用失败。失败的原因是网络(你的服务器已与互联网断开连接)。这个错误是可以恢复的,因为网络将在某个时候再次可用。 -如果对你 Web 服务的调用成功通过网络,但返回了 http 301 错误(“资源永久移动”),则该错误不可以恢复。因为你定义了错误的 Web 服务的 URL,或者你的 Web 服务提供商在没有警告你的情况下更改了某些内容。这种情况下人为干预将是必要的。 +如果通过网络对你的 Web 服务调用成功,但返回了 http 301 错误(“资源永久移动”),则该错误不可以恢复。因为你定义了错误的 Web 服务的 URL,或者你的 Web 服务提供商在没有警告你的情况下更改了某些内容。这种情况下人为干预将是必要的。 - **实现备用选项** @@ -303,7 +303,7 @@ pkgName.Bar() ## 7 函数和方法 -函数和方法在程序中无处不在。一个语法正确的函数(即通过程序编译)可能在代码风格上并不正确。我们想在这里介绍一些与函数编写相关的建议。总之,如何写出风格正确的函数。 +函数和方法在程序中无处不在。一个语法正确的函数(即通过程序编译)可能在代码风格上并不正确。我们想在这里介绍一些与函数编写相关的建议,即如何写出风格正确的函数。 **建议:** @@ -341,8 +341,6 @@ func (u *User) saveAndAuthorize error { 两个不同的任务需要不同的能力(写入数据库、读取数据库、检查访问令牌有效性...)。这个程序可以通过编译,但很难进行测试。返回的错误可以由数据层的故障引起,也可以由应用程序的安全层引起。 -A solution could be to split the function into two different ones : `create` and `authorize`. - 一种解决方案是将函数拆分为两个不同的函数:`create` 和 `authorize`。 ```go @@ -528,7 +526,7 @@ func foo(a, b int) int { 本节不是理解降低圈复杂度的概念所必需的。但是,你可能会发现了解“圈复杂度”背后的推理很有趣。 -首先,每个程序都可以看作是一个图。图由节点和边组成。例如,在图 3 上,你可以看到一个图。图由节点和边组成。每个节点将代表一组代码。边将代表程序中的控制流。 +首先,每个程序都可以看作是一个图,图由节点和边组成。例如,在下图中你可以看到一个图。图由节点和边组成。每个节点将代表一组代码。边将代表程序中的控制流。 ![](./imgs/edge_nodes.a895b46e.png) @@ -552,13 +550,13 @@ func bar(a int) { 让我们来计算该图上的节点和边: -- 四个节点 -- 三个边 +- 三个节点 +- 三条边 得到圈复杂度的公式是(对于一个函数): ``` -V(G)= # of edges- # of nodes + 2 +V(G)= 边的数量 - 节点数量 + 2 ``` 圈数表示为 V(G)。 @@ -664,20 +662,20 @@ $N_2$ 是操作数的总数 这些公式需要一些解释。 - 程序的**词汇**就像一些文章的词汇。对于一篇英语文章,我们可以说作者的词汇量是不同单词的总数。对于程序,词汇是不同运算符和操作数相加的总数。如果程序只使用关键字和非常少的标识符,它的词汇量将很少。相反,如果你的程序使用了很多标识符,词汇量就会增加。 -- 程序的**长度**是使用的运算符和操作数的总数。这里我们不计算不同的令牌,而是计算令牌的总数。 +- 程序的**长度**是使用的运算符和操作数的总数。这里我们不计算不同的标记,而是计算标记的总数。 - 程序的**难度**是编写程序和阅读程序所需时间的概念。该指标等于操作数数量的一半乘以运算符总数与不同的操作数数量之间的商。如果你的程序使用较少的操作数,则难度会降低。如果操作数的总数增加,难度也会增加(更多的比较运算符,更多的标识符,更多的类型需要处理和记忆)。 - **努力**指标可以用来衡量编写程序所需的时间。 编写程序的时间:E/18(单位:秒);在我们的示例中:29 秒(523,20 / 18)。 -Halstead 还详细估计了错误的数量! +Halstead 还详细估计了 bug 的数量! $B=\frac{E^{2/3}}{3000}$ #### 7.5.0.1 评价 - 这些指标很有趣,但我们应该谨慎对待。 -- 然而,他们强调我们编写的代码越多,我们的程序就会变得越复杂。 +- 它们强调我们编写的代码越多,我们的程序就会变得越复杂。 - 简单、简短和愚蠢的代码也比过度设计的解决方案要好。 ### 7.6 降低嵌套层数 @@ -701,7 +699,7 @@ func nested(a, b int) { } ``` -可以在序列图中把分支可视化(图 4)。 +可以在序列图中把分支可视化(下图)。 ![](./imgs/nested_stetements.f4da2548.png) @@ -728,7 +726,7 @@ func nested2(a, b int) { } ``` -在图 5 中,你可以看到这层新的嵌套对序列图的影响。 +在下图中,你可以看到这层新的嵌套对序列图的影响。 ![](./imgs/nested_statement_2.103058c3.png) -- Gitee

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 H@5}!O3THf~ literal 0 HcmV?d00001 diff --git a/chap-40-Design-Recommendations/imgs/edge_nodes.a895b46e.png b/chap-40-Design-Recommendations/imgs/edge_nodes.a895b46e.png new file mode 100644 index 0000000000000000000000000000000000000000..f1487c51868e270dd7fca5c877b28559f57afbb8 GIT binary patch literal 23004 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 literal 0 HcmV?d00001 -- Gitee From f4dcdc6250f0fcf52d4a0a608df99827872a68a1 Mon Sep 17 00:00:00 2001 From: wnanbei Date: Sun, 13 Jun 2021 21:44:58 +0800 Subject: [PATCH 5/8] =?UTF-8?q?docs:=20=E6=9B=B4=E6=94=B9=E5=85=AC?= =?UTF-8?q?=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../chap-40-Design-Recommendations.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/chap-40-Design-Recommendations/chap-40-Design-Recommendations.md b/chap-40-Design-Recommendations/chap-40-Design-Recommendations.md index d38f7a1..ac66db0 100644 --- a/chap-40-Design-Recommendations/chap-40-Design-Recommendations.md +++ b/chap-40-Design-Recommendations/chap-40-Design-Recommendations.md @@ -619,22 +619,22 @@ func bar(a int) { } ``` -n~1~ 是不同运算符的数量 +$n_1$ 是不同运算符的数量 - func, bar, (), {}, if, >, return - 我们有 7 个不同的运算符 -n~2~ 是不同操作数的数量 +$n_2$ 是不同操作数的数量 - int, a, fmt.Println,start of function, 2, a is greater than 2,you got,bad luck - 我们有 7 个不同的操作数 -N~1~ 是运算符的总数 +$N_1$ 是运算符的总数 - func, bar, (), () ,() ,() ,() ,{},{}, if, >, return - 我们有 12 个 -N~2~ 是操作数的总数 +$N_2$ 是操作数的总数 - a, a,start of function, 2, a is greater than 2,you got,bad luck, fmt.Println, fmt.Println,fmt.Println, fmt.Println, int - 我们有总共 12 个操作数 -- Gitee From fea28917053d13d287cec102c3b78163d79b722e Mon Sep 17 00:00:00 2001 From: wnanbei Date: Sun, 13 Jun 2021 22:32:05 +0800 Subject: [PATCH 6/8] =?UTF-8?q?docs:=20=E6=9B=B4=E6=94=B9=E5=85=AC?= =?UTF-8?q?=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../chap-40-Design-Recommendations.md | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/chap-40-Design-Recommendations/chap-40-Design-Recommendations.md b/chap-40-Design-Recommendations/chap-40-Design-Recommendations.md index ac66db0..3e99056 100644 --- a/chap-40-Design-Recommendations/chap-40-Design-Recommendations.md +++ b/chap-40-Design-Recommendations/chap-40-Design-Recommendations.md @@ -600,10 +600,10 @@ Halstead 指标基于两个概念。运算符和操作数。程序由标记组 从这两个定义中,我们可以提取一些基数(我们将使用它来计算 Halstead 指标): -- n~1~ 不同运算符的数量 -- n~2~ 不同操作数的数量 -- N~1~ 运算符的总数 -- N~2~ 操作数的总数 +- $n_1$ 不同运算符的数量 +- $n_2$ 不同操作数的数量 +- $N_1$ 运算符的总数 +- $N_2$ 操作数的总数 让我们以一个示例程序来提取这四个数字: @@ -632,7 +632,7 @@ $n_2$ 是不同操作数的数量 $N_1$ 是运算符的总数 - func, bar, (), () ,() ,() ,() ,{},{}, if, >, return - - 我们有 12 个 + - 我们有总共 12 个运算符 $N_2$ 是操作数的总数 @@ -643,23 +643,23 @@ $N_2$ 是操作数的总数 - **词汇** - n = n~1~ + n~2~ = 8 + 9 = 17 + $n$ = $n_1$ + $n_2$ = 8 + 9 = 17 - **长度** - N = N~1~ + N~2~ = 12 + 12 = 24 + $N$ = $N_1$ + $N_2$ = 12 + 12 = 24 - **难度** - \frac{n_{1}}{2}\times\frac{N_{2}}{n_{2}}=5.332*n*1×*n*2*N*2=5.33 + $\frac{n_1}{2} \times \frac{N_{2}}{n_{2}}=5.33$ - **体积** - 长度 × log=98.10 + $length×log_2(词汇)=98.10$ - **努力** - \text{difficulty}\times\text{volume = 523.20}difficulty×volume = 523.20 + 难度 × 体积 = 523.20 这些公式需要一些解释。 -- Gitee From 7af7779052b739f5b15588a4758ea2befe512db3 Mon Sep 17 00:00:00 2001 From: wnanbei Date: Sun, 13 Jun 2021 23:09:49 +0800 Subject: [PATCH 7/8] docs: translate completed --- .../chap-40-Design-Recommendations.md | 175 +++++++++++++----- .../imgs/nested_statement_2.103058c3.png | Bin 0 -> 26265 bytes .../imgs/nested_stetements.f4da2548.png | Bin 0 -> 21331 bytes 3 files changed, 132 insertions(+), 43 deletions(-) create mode 100644 chap-40-Design-Recommendations/imgs/nested_statement_2.103058c3.png create mode 100644 chap-40-Design-Recommendations/imgs/nested_stetements.f4da2548.png diff --git a/chap-40-Design-Recommendations/chap-40-Design-Recommendations.md b/chap-40-Design-Recommendations/chap-40-Design-Recommendations.md index 3e99056..4091885 100644 --- a/chap-40-Design-Recommendations/chap-40-Design-Recommendations.md +++ b/chap-40-Design-Recommendations/chap-40-Design-Recommendations.md @@ -10,12 +10,12 @@ - 接口 - 方法 - 接收者 -- cyclomatic complexity -- Halstead metrics +- 圈复杂度 +- Halstead 指标 ## 介绍 -本章将尝试回答“如何设计我的 Go 代码?”这个问题。作为来自其他语言的 Go 新开发者,我在一开始时问了自己这个问题。当您编写仅供自己使用的软件时,这个问题并不重要。当您在团队中工作时,您必须遵循惯例和最佳实践。 +本章将尝试回答“如何设计我的 Go 代码?”这个问题。作为来自其他语言的 Go 新开发者,我在一开始时问了自己这个问题。当你编写仅供自己使用的软件时,这个问题并不重要。当你在团队中工作时,你必须遵循惯例和最佳实践。 我阅读了 Go 开发者写的热门博客文章来编写本章。我在本章中的目标是汇总这些建议。不要虔诚地遵循他们。请记住,每个项目都是不同的。 @@ -310,16 +310,16 @@ pkgName.Bar() - 一个函数一个目的 - 名称简单 - 限制长度(最大 100 行) -- Reduce cyclomatic complexity +- 减少圈复杂度 - 减少嵌套层数 -### 7.1 一个函数一个目标 +### 7.1 一个函数一个目的 函数是一个执行**特定**任务的有名称的过程(或例程)。它可以有输入参数,也可以有输出参数。这里的重要术语是“特定”。函数(或方法)执行单个任务,而不是多个。它只有一个目的。 一个好的的函数只做一件事,并且做得非常好。例如,在 `math` 包中,指数函数将为每个 x 实数值计算 `exp(x)` 的值。 -这个函数应该只有一个目旳,这很容易理解。该函数不会同时计算 x 的指数和对数值。相反,我们有两个函数,指数函数和对数函数。 +这个函数应该只有一个目的,这很容易理解。该函数不会同时计算 x 的指数和对数值。相反,我们有两个函数,指数函数和对数函数。 这是一个反例: @@ -409,7 +409,7 @@ if err != nil { ### 7.3 限制代码行数 -一个函数应该只有一个目的(见上一节),而且应该很小。当您增加函数中的行数时,您也增加了阅读和理解它的时间和认知所需的努力。 +一个函数应该只有一个目的(见上一节),而且应该很小。当你增加函数中的行数时,你也增加了阅读和理解它的时间和认知所需的努力。 例如,这是包 `heap` 中的函数 `Pop` : @@ -482,7 +482,7 @@ func (d *decoder) Read(p []byte) (n int, err error) { 这个函数有 50 行。 -多大的行数是合适的。在我看来,一个好的函数不应该超过 30 行。您应该能够在您的 IDE(代码编辑器)窗口中显示一个函数而无需向下滚动。在我的 IDE 上,我一次只能阅读 38 行。 +多大的行数是合适的。在我看来,一个好的函数不应该超过 30 行。你应该能够在你的 IDE(代码编辑器)窗口中显示一个函数而无需向下滚动。在我的 IDE 上,我一次只能阅读 38 行。 ### 7.4 降低圈复杂度 @@ -520,15 +520,15 @@ func foo(a, b int) int { - 第一个条件为假,第二个条件为真。返回值为 `b`。 - 第一个条件为假,第二个条件也为假。返回值为 `b-a`。 -我们有三个路径。您拥有的路径越多,理解该功能所需的努力就越多。 +我们有三个路径。你拥有的路径越多,理解该功能所需的努力就越多。 -您获得的路径越多,您必须开发的单元测试就越多,以涵盖所有可能的情况。 +你获得的路径越多,你必须开发的单元测试就越多,以涵盖所有可能的情况。 #### 7.4.0.1 计算圈的数量 -本节不是理解降低圈复杂度的概念所必需的。但是,您可能会发现了解“圈复杂度”背后的推理很有趣。 +本节不是理解降低圈复杂度的概念所必需的。但是,你可能会发现了解“圈复杂度”背后的推理很有趣。 -首先,每个程序都可以看作是一个图。图由节点和边组成。例如,在图 3 上,您可以看到一个图。图由节点和边组成。每个节点将代表一组代码。边将代表程序中的控制流。 +首先,每个程序都可以看作是一个图。图由节点和边组成。例如,在图 3 上,你可以看到一个图。图由节点和边组成。每个节点将代表一组代码。边将代表程序中的控制流。 ![](./imgs/edge_nodes.a895b46e.png) @@ -569,13 +569,13 @@ V(G)= 3 - 3 + 2 = 2 这里圈数等于 2,这意味着我们的程序定义了两条线性无关的路径。当这个数字增加时,你的函数的复杂性也会增加: -- 更多的路径意味着需要开发更多单元测试以完全覆盖您的代码。 +- 更多的路径意味着需要开发更多单元测试以完全覆盖你的代码。 - 更多的路径意味着你的同事需要更多的脑力来理解你的代码。 **关于圈数的一些重要结论:** - 这个数字只取决于“图的决策结构”。 -- 当您向代码中添加功能语句时,它不会受到影响。 +- 当你向代码中添加功能语句时,它不会受到影响。 - 如果在图中插入一条新边,那么圈数就会增加 1。 ### 7.5 Halstead 指标 @@ -594,9 +594,9 @@ Halstead 指标基于两个概念。运算符和操作数。程序由标记组 2. 成对的括号,成对的大括号。 ({},()) 3. 所有的比较和逻辑运算符。 ( >,<,&&,||,...) 2. **操作数:** - 1. Identifiers (a, myVariableName, myConstantName, myFunction,...) + 1. 标识符 (a, myVariableName, myConstantName, myFunction,...) 2. 常量 (“this is a string”, 3, 22,...) - 3. Type specification (int, bool,...) + 3. 类型 (int, bool,...) 从这两个定义中,我们可以提取一些基数(我们将使用它来计算 Halstead 指标): @@ -639,15 +639,15 @@ $N_2$ 是操作数的总数 - a, a,start of function, 2, a is greater than 2,you got,bad luck, fmt.Println, fmt.Println,fmt.Println, fmt.Println, int - 我们有总共 12 个操作数 -来为我们的程序计算 Halstead 指标: +来计算我们程序的 Halstead 指标: - **词汇** - $n$ = $n_1$ + $n_2$ = 8 + 9 = 17 + $n = n_1 + n_2 = 8 + 9 = 17$ - **长度** - $N$ = $N_1$ + $N_2$ = 12 + 12 = 24 + $N = N_1 + N_2 = 12 + 12 = 24$ - **难度** @@ -659,35 +659,105 @@ $N_2$ 是操作数的总数 - **努力** - 难度 × 体积 = 523.20 + $难度 × 体积 = 523.20$ 这些公式需要一些解释。 -- The **vocabulary** of a program is just like the vocabulary of some essay. For an English essay, we can say that an author’s vocabulary is the total number of different words. For a program, this is the addition of the total number of distinct operators and operands. If the program use only reserved words and a very limited number of identifiers, its vocabulary will below. On the contrary, if your program uses many identifiers, the vocabulary will increase. -- 程序的词汇就像一些文章的词汇。对于一篇英语文章,我们可以说作者的词汇量是不同单词的总数。对于程序,这是相加的不同运算符和操作数的总数。如果程序只使用保留字和非常有限数量的标识符,它的词汇表将在下面。相反,如果你的程序使用了很多标识符,词汇量就会增加。 -- The **length** of a program is the total number of operators and operands used. Here we are not counting distinct tokens but the total number of tokens. -- 程序的长度是使用的运算符和操作数的总数。在这里,我们不计算不同的令牌,而是计算令牌的总数。 -- The **difficulty** is here to give an idea about the amount of time needed to write the program, and to read it. This metrics is equal to half the number of operands multiplied by the quotient between the total number of operators and the distinct number of operands. If your program uses a limited number of operands, the difficulty will be reduced. If the total number of operands increases, the difficulty will also increase (more comparisons, more identifiers, more types to handle and remember). -- 难点在于给出编写程序和阅读程序所需时间的概念。该指标等于操作数数量的一半乘以运算符总数与不同的操作数数量之间的商。如果您的程序使用有限数量的操作数,则难度会降低。如果操作数的总数增加,难度也会增加(更多的比较,更多的标识符,更多的类型来处理和记住)。 -- The effort metric can then be used to compute the time necessary to write the program. -- 然后可以使用工作量度量来计算编写程序所需的时间。 +- 程序的**词汇**就像一些文章的词汇。对于一篇英语文章,我们可以说作者的词汇量是不同单词的总数。对于程序,词汇是不同运算符和操作数相加的总数。如果程序只使用关键字和非常少的标识符,它的词汇量将很少。相反,如果你的程序使用了很多标识符,词汇量就会增加。 +- 程序的**长度**是使用的运算符和操作数的总数。这里我们不计算不同的令牌,而是计算令牌的总数。 +- 程序的**难度**是编写程序和阅读程序所需时间的概念。该指标等于操作数数量的一半乘以运算符总数与不同的操作数数量之间的商。如果你的程序使用较少的操作数,则难度会降低。如果操作数的总数增加,难度也会增加(更多的比较运算符,更多的标识符,更多的类型需要处理和记忆)。 +- **努力**指标可以用来衡量编写程序所需的时间。 -Time to write the program : E/18 (in seconds) : in our example : 29 seconds (523,20 / 18). + 编写程序的时间:E/18(单位:秒);在我们的示例中:29 秒(523,20 / 18)。 -编写程序的时间:E/18(以秒为单位):在我们的示例中:29 秒(523,20 / 18)。 +Halstead 还详细估计了错误的数量! -Halstead also details an estimated number of bugs!B=\frac{E^{2/3}}{3000}*B*=3000*E*2/3 +$B=\frac{E^{2/3}}{3000}$ -Halstead 还详细介绍了估计的错误数量! +#### 7.5.0.1 评价 -#### 7.5.0.1 Comment - -- Those metrics are interesting, but we should take them cautiously. - 这些指标很有趣,但我们应该谨慎对待。 -- However, they highlight that the more code we write, the more complex our program will become. - 然而,他们强调我们编写的代码越多,我们的程序就会变得越复杂。 -- A simple, short, and stupid code is better than an over-engineered solution. -- 简单、简短和愚蠢的代码比过度设计的解决方案要好。 +- 简单、简短和愚蠢的代码也比过度设计的解决方案要好。 + +### 7.6 降低嵌套层数 + +这个建议必须与上一节连起来看。在编写程序时,可以引入嵌套语句,即在特定分支中执行的语句。让我们举个例子。我们这里有一个虚拟函数,它的第一个条件创建了两个分支。在第一个分支中,可以看到我们引入了另一个条件语句(if b < 2 ),它也将创建两个分支。 + +```go +// recommendation/nesting/main.go +//... +func nested(a, b int) { + if a > 1 { + if b < 2 { // nested condition + fmt.Println("action 1") + } else { + fmt.Println("action 2") + } + } else { + fmt.Println("action 3") + } + fmt.Println("action 4") +} +``` + +可以在序列图中把分支可视化(图 4)。 + +![](./imgs/nested_stetements.f4da2548.png) + +我们可以再添加一层嵌套: + +```go +// recommendation/nesting/main.go +//... +func nested2(a, b int) { + if a > 1 { + if b < 2 { // nested condition + if a > 100 { + fmt.Println("action 1") + } else { + fmt.Println("action 2") + } + } else { + fmt.Println("action 3") + } + } else { + fmt.Println("action 4") + } + fmt.Println("action 5") +} +``` + +在图 5 中,你可以看到这层新的嵌套对序列图的影响。 + +![](./imgs/nested_statement_2.103058c3.png) + +你的嵌套越多,你的代码就会变得越复杂。一个通用的建议是限制嵌套数量。如果你发现自己无法避免嵌套,则应该创建另一个函数来支持这种复杂性: + +```go +// recommendation/nesting/main.go +//... +func nested3(a, b int) { + if a > 1 { + subFct1(a, b) + } else { + fmt.Println("action 4") + } + fmt.Println("action 5") +} + +func subFct1(a, b int) { + if b < 2 { // nested condition + if a > 100 { + fmt.Println("action 1") + } else { + fmt.Println("action 2") + } + } else { + fmt.Println("action 3") + } +} +``` ## 8 要点 @@ -722,9 +792,28 @@ Halstead 还详细介绍了估计的错误数量! - 函数和方法 - - One function has one goal - - Simple names - - Limited length (100 lines maximum) - - Reduce cyclomatic complexity - - Reduce the number of nesting levels + - 一个函数一个目的 + - 名称简单 + - 限制长度(最大 100 行) + - 减少圈复杂度 + - 减少嵌套层数 + +*** + +1. 完全随意的数字 +2. https://github.com/pkg/errors, 现在是标准库的一部分 + +## 参考文献 + +[dave-design] Cheney, Dave. 2019. “Practical Go: Real World Advice for Writing Maintainable Go Programs.” https://dave.cheney.net/practical-go/presentations/qcon-china.html. + +[ds-design] Shuralyov, Dmitri. n.d. “Idiomatic Go.” https://dmitri.shuralyov.com/idiomatic-go. + +[dave-design] Cheney, Dave. 2019. “Practical Go: Real World Advice for Writing Maintainable Go Programs.” https://dave.cheney.net/practical-go/presentations/qcon-china.html. + +[dave-design] Cheney, Dave. 2019. “Practical Go: Real World Advice for Writing Maintainable Go Programs.” https://dave.cheney.net/practical-go/presentations/qcon-china.html. + +[mccabe1976complexity] McCabe, Thomas J. 1976. “A Complexity Measure.” IEEE Transactions on Software Engineering, no. 4: 308–20. + +[mccabe1976complexity] McCabe, Thomas J. 1976. “A Complexity Measure.” IEEE Transactions on Software Engineering, no. 4: 308–20. diff --git a/chap-40-Design-Recommendations/imgs/nested_statement_2.103058c3.png b/chap-40-Design-Recommendations/imgs/nested_statement_2.103058c3.png new file mode 100644 index 0000000000000000000000000000000000000000..f5b016ab6fb2a18c6aae5ee016a1d6fc31dea9c2 GIT binary patch literal 26265 zcmbTe1yogEyZ^gsq)R|TkW?D!PU!~e1_|j#x)CWA>5`W2l9Ww|ba!sLyW>uO?>X-| z_l|S^_m1n(A%n5@+;h!%*7N;5-?<`Gl%z4yNYEe<2&Sxzq#6VQmka*+pu&USU`uFI zLLe5#vXWvNo@smOPqfvwW_y&~tG<4&2&SxJHO1BAj@KocFM9cDVsa$=wf$SY(ps~p zwxw>R{4r*wlP#GOF%9yyR19Tq5@M=_0Zd}p`TL3DLPO9Ms^?U%pft{|XX$ysPf=&|#W9S?}8%%2cL{i?%0$|JyhQ^j9!S zfl|7zmR7-a#q#nphvgvXn%PXKCno5YxKWJ;|Hp!Y&4>Hj($Z2LCc@N#{1Gd12g+go&%$VB|^HU?7H*Vp6Y<7;bcUniG9OC*|+?}fxDT?-l-u9klV?+eKnYCIS68t>|Q zV<4_>VzrCo@b~tI)7RF_L&dY85zn4Ii@q0Qh)1Ix`abz$@$YzL2@tUwj_-F?RaLF7 zntFSC<3&hjsU#`T#ml`hoyz*o4(`Xp*~P_8xIQ~uJWEA}2Jedu4PoTEbEBA|1Sb+` z!i40bBvlLyEmWK?PL>9b#-041QSi_=FmMx|8XUxe1ej?1`nG5=fEGvo4xnp+|Kr2Y zbSpbMJ2NvdS&n2{pi`mQt*wj0|L&Kns_M^D6f9KKEr<(F%HN6Jib+pj2zi1(>rEIT zN%GoUrbj!(>M5A#5W^CKri3oj+TCw2B*L~hro)FZ|M~Uw%*_4W=@1Q`Y#%H=J>AUA z3=ZOG#uO+@`9;S3b+UMtYek*``QJ-h6_VIYW~$!JZl$ND&V8koXJTSn&c<(mfPov{ zc5R4&A94Cl4(0@oSirpm^do^;@42Ao@G2Z3At5_EJLv6jFqBQ9Py-JY@pZC7&ImCE zGG0>*a#uB2FrxPMWhyV37#W+KVBPz3^%Nq0`VY;+vev2{?M)xN5fKraFBiRigefiz zS7!M!pf3r~!lAgRh!+j%$p{A9?-P1A1e`g9ZZR-wW#xboVRzFW( zbLOLqFX}Uq{v=A-KJW;>$VWJ{2bT4@OX}~+Fo9Tc>cWs-g2Brs38u!2;0^rFLSIA~ z*NcG+9UaAEAa~x4LICT%gN>7r2`yBum++IuDIRfp8A~`^x)mo$>cEC0ugrGTlYg!m zHWbTKOIDzh9j0_oNJx;JXhsZCpc~tEMGpRD{#vzzoH`h+RW=%x<{ujGg<=yC0>Iu0 zt**W?01L|(39ZZC{O=}4MlRA$&!e3;GTC1-c^`=b+5avIc01DFIsApQiN@8;`06El zHuJ~)e|D;r?2etuNiE?L9-Wc5-%;8Kvv~7ABf++pBhHGM{&+bgo%&7WYN}3NV$&m) z?YE@+3rGrR5+fp%Jk!3Xjmzw5^iZB|%ly`j)x<&g(jis#76v`3I_Y$tSOyp*nGURS zc!)lETkhG35JYq_aP9VS78&wUM%V29*iZhKJ5S(EjAI01J`={{$!X-}yLi#tAny?(XLH*)m*|m^dY1m#vDGl3P%piAOs8i|?1wWQ4yF5elnarl!iv zTGBOQc8|Or9^asZfVs$)z>!2$o9+*@X9_jPpPBpnYhBB5&)ZjR8CfN9q>n!*R|1iG zSWdidzvbtVUXRkCGl+C9{U+k_A4Wu4wWFgp@wQl1Qr9zqzf166&1CBt*GwV;U2U!v z&D#~G?SJR|@wmJUr|(ltoYtN6UvnJi9*)YwE&1iI zRB+i$3i{o7f+i*>CkLa0qQse)nK@p+PD%7o``ZM2Sy@?cZ|~ybB63M}Bx8CJsX&k@ zl?9W4imK`go4=aPlYSQc1{@+HA_4+)DvoHhl;}4}UqeDdva_?3l9EEviQpmd2nZhg zv+LX2A1?NE$a)s$=Q~Z=eds_GS$S2UoOyA1iH(gd;(25o=|+_oe8ob((Y6X*Ewx1B zA^%ZQLJ%PdqVzG`?qq3`^ZK9Fu1JylGj&M&w^!=o;^Oe|@SyKwxkZ?y+~8ZUuCCIA zya^L(X3#89ce<$*qJo1Zc~G7pjZg9YNRo z5}n8nM{=ZfbxFdZ$LHq*gM;}+uL+C9@8YLy#eLfYB(b|#9yeEG8D@nw{2^R52{FD2fuX4#60E=dvaD66+$kdu||9U5}b zS1K5jkdVm9&gOPlBqJo8v|vnP{y`ea#`;lG@iJHCC5XYWw|5tF4t{=qJN2B5=`u7A zL;hG@J^qOq54mO-4isShXw}r zCrkBy{rWXv!|Srqf3`hlW@_qwFkjgCwEr2{TnbU~@o$}+oKByh!3Va(j?vK3$;rvJ zN_CM6Y@kpm2$B(!rdC!~u;96~?T6c?rA)!zbS}opKYzaV?cXl{IvgCVn@yU+<>-P0 ztgfEe&0(?X^FD(NPd`6jpM6IIF&_VM%^Nc{DHkudp6UM}nbmx3b<09NdBn^tu&8nw zq-<TZ7=_%KYOmo~ z@0%VUMpk{gK-;IMr}y{wJofX`)s{o7ZFg$-nyRW_5)-Ea;1Jvo7w@k(GwUbO(jjDl zY+O`dWEkS>t~3=D6;H)6poYz!fhNQ;Fzkd!SDfZs<7+gGrm@*JE}M<&83i7m9jjh zv9z|av9-I)ZKqq4nwoR-yQ8C8k)?oJ?e-7*UW|(8V0Slz(7lR{QCILfBUX@y`or}= z9KEufy!`IY4vBx|#KZ(|OyBy+?CdPv(gz)#4OHhBELivMG4CjtUhu4sFxOAG`e z-Sca6$l>zB-A+F~b?zf;Ym%Ug1x5@4UIeO8mG7-)SU5_VPBlFThxg&);qqH5s>PXF zM)p_R;%cMU9F`9V5J&eIerI!E)Y2O%#EG_-u=Vz~1M}`Q=EfA@!_!Yjw8LyF7?ViO0IIr10}7I+-5$W5zRgZMTgc_|e;k``2%xw;&}jVbgxD1PS=A zh~5yG(cNe|co4_er2LL9<5aKAETN-2uB|}XVWyJWdcNTeqh|l7NYaH>5C_p1;^E2p zKWa18R(SG_D(9&YpuO{Lf#1PRqg5GlSX(1-<}GngF7RE41c*E|kl-FGrMd~<9dOcV zt^TqTx(QSVx`Rin+ zE$^1e$=>yI;;^2c*e<8Lj?lL6(>gjjghYv42i;PVXH^y7p9|kv+U^-+Kp~L(n{yV% z;y-=(KO3eq`Q1MJ{;Wb6IkHMiMIB79r2jRMes6N%;An*q`8?G~>GlsCB$DtxcwRF< zGAbkvTPsZi