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
not
ToString

只指定一个方法的接口通常只是附加了“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