Go 接口命名约定
我将发布我的代码:Go 接口命名约定,go,interface,naming-conventions,naming,Go,Interface,Naming Conventions,Naming,我将发布我的代码: /* * Role will ALWAYS reserve the session key "role". */ package goserver const ( ROLE_KEY string = "role" ) type Role string //if index is higher or equal than role, will pass type RolesHierarchy []Role func (r Role) String() str
/*
* Role will ALWAYS reserve the session key "role".
*/
package goserver
const (
ROLE_KEY string = "role"
)
type Role string
//if index is higher or equal than role, will pass
type RolesHierarchy []Role
func (r Role) String() string {
return string(r)
}
func NewRole(session ServerSession) Role {
return session.GetValue(ROLE_KEY).(Role)
}
func (this Role) IsRole(role Role, hierarchy RolesHierarchy) bool {
if role == this {
return true
}
if len(hierarchy) == 0 {
return false
}
var thisI int = 0
var roleI int = 0
//Duped roles in hierarchy are verified in verifyConfig during parse
for i, r := range hierarchy {
if this == r {
thisI = i
}
if role == r {
roleI = i
}
}
//TODO I can probably condense what follows into one if
if thisI == 0 && roleI == 0 {
return false
}
return thisI >= roleI
}
func (this *Role) AssumeRole(session ServerSession, role Role) {
session.SetValue(ROLE_KEY, role)
*this = role
}
应该注意的是,ServerSession也是一个接口,调用“ServerSessioner”对我来说是不可靠的
我想用IsRole()和AssumeRole()创建一个接口,但是“Roler”看起来很不可靠。我开始明白,除了标准的“er”后缀之外,我真的不知道或曾经遇到过接口的命名约定。我确实记得VS C++约定是在所有事情面前都投一个“i”。这是“惯用”吗
有什么建议吗?按照惯例,在golang中,一个方法接口名称是 表示行为人的名词。比如说,
the `Read` method implements the `Reader` interface, and
the `Generate` method implements the `Generator` interface.
最好将约定的细节弄清楚,不管它们是什么。当接口只需要一个函数或一组非常特定的函数时,这是很好的
有一种做法是使用
I
前缀作为函数的最低公分母,在这种情况下,IRole
将是一个更好的接口名称,因为接口定义了两个函数,必须由表示角色的所有类型来满足角色我知道了,事实证明我可以使用“er”约定
/*
* Role will ALWAYS reserve the session key "role".
*/
package goserver
const (
ROLE_KEY string = "role"
)
type Role string
//if index is higher or equal than role, will pass
type RolesHierarchy []Role
type RoleChecker interface {
IsRole(Role, RolesHierarchy) bool
}
type RoleAssumer interface {
AssumeRole(ServerSession, Role)
}
type RoleCheckerAssumer interface {
RoleChecker
RoleAssumer
}
func (r Role) String() string {
return string(r)
}
func NewRole(session ServerSession) Role {
return session.GetValue(ROLE_KEY).(Role)
}
func (this Role) IsRole(role Role, hierarchy RolesHierarchy) bool {
if role == this {
return true
}
if len(hierarchy) == 0 {
return false
}
var thisI int = 0
var roleI int = 0
//Duped roles in hierarchy are verified in verifyConfig during parse
for i, r := range hierarchy {
if this == r {
thisI = i
}
if role == r {
roleI = i
}
}
//TODO I can probably condense what follows into one if
if thisI == 0 && roleI == 0 {
return false
}
return thisI >= roleI
}
func (this *Role) AssumeRole(session ServerSession, role Role) {
session.SetValue(ROLE_KEY, role)
*this = role
}
谢谢Sarathsp让我好好考虑这件事。在你的情况下,我只想把他们命名为RoleChecker
和Roleasumer
,“合并”一方Rolecheckersumer
。或者,如果使用单一界面,则可以是RoleHelper
或RoleChecker
ServerSession
也可以,甚至只是Session
(特别是在没有“客户端”会话的情况下)<另一方面,code>ServerSessioner
是不好的,Session
不是动词,也不是接口的方法
有很多关于公约的帖子
按照惯例,一个方法接口通过方法名称加上-er后缀或类似修改来命名,以构造一个代理名词:Reader
、Writer
、Formatter
、CloseNotifier
等
有很多这样的名字,尊重它们和它们捕获的函数名是很有成效的<代码>读取
,写入
,关闭
,刷新
,字符串
等具有规范的签名和含义。为了避免混淆,不要给你的方法取这些名字中的一个,除非它有相同的签名和含义。相反,如果您的类型实现的方法与已知类型上的方法具有相同的含义,请为其指定相同的名称和签名;调用字符串转换器方法string
notToString
只指定一个方法的接口通常只是附加了“er”的函数名
type Reader interface {
Read(p []byte) (n int, err error)
}
有时结果不是正确的英语,但我们还是这样做了:
type Execer interface {
Exec(query string, args []Value) (Result, error)
}
有时我们用英语来让它变得更好:
type ByteReader interface {
ReadByte() (c byte, err error)
}
当接口包含多个方法时,请选择准确描述其用途的名称(例如:net.Conn、http.ResponseWriter、io.ReadWriter)
对于接收方名称,不要使用this
或self
或类似名称。相反:
接受者是一种特殊的论点
按照惯例,它们是一个或两个反映接收器类型的字符,
因为它们通常出现在几乎每一行上:
func (b *Buffer) Read(p []byte) (n int, err error)
func (sh serverHandler) ServeHTTP(rw ResponseWriter, req *Request)
func (r Rectangle) Size() Point
接收方名称应在类型的方法中保持一致。
(不要在一种方法中使用r,在另一种方法中使用rdr。)
方法接收者的名称应该是其身份的反映;通常,其类型的一个或两个字母缩写就足够了(例如“c”或“cl”表示“客户”)。不要使用诸如“me”、“this”或“self”之类的泛型名称,这些标识符是面向对象语言的典型标识符,它们更强调方法而不是函数。该名称不必像方法参数那样具有描述性,因为它的作用是显而易见的,并且不起记录作用。它可以很短,因为它几乎会出现在每一种类型的方法的每一行上;熟悉意味着简洁。也要保持一致:如果你在一种方法中调用接收者“c”,不要在另一种方法中调用它“cl”
IsRoler和Assumerler->ISserasumer?哈哈,这在英语堆栈交换中可能更好…@Dale=>有时结果不是正确的英语,但我们还是这样做了:@SarathSadasivanPillai。。让我试着去理解。。。如果我将一个结构(即与一个方法关联的数据结构)引入到这个上下文中,我宁愿说“任何实现方法‘Read’的结构都会变成Reader”,这是有意义的?;让我在这里添加另一个快速问题:用作读取源的结构的名称是什么?“Sourcer”?,(我知道它在Java中是“可读的!”@Victor接口名称取决于它所使用的函数implements@SarathSadasivanPillai我想我明白了。我的想法是,出于某种原因,我基于面向对象的思想(在JAVA工作多年后)仍然让我说,接口描述对象(同类)行为,go中的接口也描述对象行为。这两种方法都是用一个对象来描述一个方法(1个或多个),我们同意这一点?。猜测在JAVA中,您正在寻找一个词来描述客户机可以对对象做什么(对象可以“告诉”要做的事情),而在GOLANG中,这个词仅与对象可以做什么相关。这让我很难回答Sourcer/Readable的问题。我只想称之为RoleSupport
,但接触English.SE确实是一个有趣的尝试。请考虑不要使用<代码>这个<代码>来命名方法接收器:这是不确定的。讨论这些问题的方法。不是单个字母,而是有意义的缩写——单个字母可以表示短函数(包括您的函数)。“任何其他语言”肯定是一个粗俗的例子。嗯,出于某种原因,这不是一个p