gointerfacenaming-conventionsnaming

Interface naming convention Golang


I'll just post my code:

/*
*  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 (r Role) IsRole(role Role, hierarchy RolesHierarchy) bool {
    if role == r {
        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, ri := range hierarchy {
        if this == ri {
            thisI = i
        }
        if role == ri {
            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
}

It should be noted that ServerSession is also an interface, calling "ServerSessioner" just feels wonky to me.

I'm toying with the idea of creating an interface with IsRole() and AssumeRole(), however "Roler" seems very wonky. It's dawning on me that I don't really know or have ever come across naming conventions for interfaces, other than the standard "er" suffix. I do seem to recall the VS C++ convention is to just throw an "I" in front of everything. Is this "idiomatic"?

Any suggestions?


Solution

  • I got it, turns out I can use the "er" convention.

    /*
    *  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
    }
    

    Thank you Sarathsp for getting me thinking about this properly.