Golang 多方法接口(interface)和结构命名

标签 go

Golang 文档提供了关于 how to name single-method interface 的明确指导(通过附加“-er”)。但是,命名一个只有一个结构实现它的多方法接口(interface)的最佳实践是什么?

在 C# 中,接口(interface)将具有“I”前缀,在 Java 中,类将具有“Impl”后缀。 Golang 是否有类似的指南?

这里有一个接口(interface)的目的是能够模拟它以对依赖它的组件进行单元测试。

这里是一个UserManager接口(interface)的具体例子。它将由 Web API Controller 使用,该 Controller 将 HTTP 请求转换为此接口(interface)上的方法调用。这个 web api Controller 将使用 UserManager 的大部分方法。

type UserManager interface { // Should it be UserManagerInterface ?
    GetUser(id int) User
    CreateUser(user User)
    DeleteUser(id int)
    ResetPassword(id int, newPassword string)
    VerifyEmail(id int)
}

type UserManagerImpl struct { // -Impl, or -Struct, or something else? 

}

最佳答案

从 Java/C# 到 Go 需要范式转变。

因为它们是隐式实现的,所以接口(interface)是在使用的地方定义的,而不是在实现的地方定义的。

因为它们是隐式实现的,所以较小的接口(interface)比较大的接口(interface)更受欢迎,因此关注单一方法“Verber”接口(interface)。如果您有一个需要读取字节的函数,它可以采用 io.Reader,并且可以为该函数提供具有该方法的任何类型(无论它具有什么其他方法)。您可能没有调用接口(interface)中列出的所有 5 种方法的函数(如果是这样,该函数可能做的太多了)。

如果您想将结构和接口(interface)命名为相同的东西,因此需要某种前缀/后缀,那么您可能以错误的方式思考它,可能需要重新考虑您的设计。

DBAL 是一个有时需要较大接口(interface)的真实案例的领域(尽管它可能仍应由较小的接口(interface)组成)。但在这种情况下,“Impl”并没有告诉你任何信息——Java 和 C# 喜欢拥有无意义的接口(interface),而 Go 没有。如果您只有一种实现,那么接口(interface)可能毫无用处。

如果您将有多个实现,它们之间的差异应该指导您的命名。例如,您可能有一个 PostgresUserManager、一个 MongoUserManager 和一个 MockUserManager

关于Golang 多方法接口(interface)和结构命名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57063010/

相关文章:

json - 从 GoLang 中的响应中检索到的漂亮 JSON

go - 如何停止 io.CopyN

go - io.Pipe Write() 和 Read() 函数如何工作?

mysql - Golang Net.IP 到 IPv6(来自 MySQL)作为 Decimal(39,0) 转换?

go - 如何创建一个通用函数来解码所有类型?

go - 为什么函数执行后值会发生变化?

arrays - js函数调用的go函数不能返回数组。 panic : ValueOf: invalid value

go - 如何在 go 中实现可比较的接口(interface)?

go - Switch case 语句落空为 default

go - golang 中的 nil 是什么意思?