2016-08-09 2 views
4

Я просто разместить свой код:Интерфейс именования Golang

/* 
* 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++ - это просто бросить «я» перед всем. Является ли это «идиоматическим»?

Любые предложения?

+1

Я бы назвал это 'RoleSupport', но для английского языка это было бы интересным делом. Пожалуйста, подумайте над тем, чтобы не использовать 'this' для обозначения приемников методов: это неодобрительно, как унииоматическое Go. [Один пример] (http://stackoverflow.com/q/23482068/720999) обсуждения этих вопросов. – kostix

+0

Да, я боролся с именами приемников. Я знаю, что идиотский ход - использовать однобуквенные переменные ... Извините, я не могу этого сделать. «это» или «я» настолько распространено на каком-либо другом языке, что это неоднозначно. «RoleSupport» в порядке, но на самом деле не подходит аккуратный шаблон. – Dale

+1

Не одиночные буквы, а довольно значимые сокращения - с единственными буквами в порядке для коротких функций (включая ваши). «Любой другой язык» - это полная преувеличение.Ну, по какой-то причине это не проблема для меня: разные языки просто * чувствуют * по-разному. Новички-программисты действительно стараются быть однокристскими собаками, которые пытаются нести свой набор изученных навыков на любой новый язык, с которым они сталкиваются (были там сами наверняка), но всегда лучше понимать философию языка и придерживаться его. – kostix

ответ

1

У меня есть, тур ns out Я могу использовать соглашение «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 за то, что задумался об этом правильно.

1

В golang По соглашению имена интерфейсов одного метода: существительные, обозначающие исполнителя действия. Например,

the `Read` method implements the `Reader` interface, and 
the `Generate` method implements the `Generator` interface. 

Было бы лучше, чтобы специфика конвенции ясно, независимо от того, что они are.This идет хорошо, когда есть только одна функция или очень специфический набор функций требует интерфейс

Существует практика использования I префикса к наименьшему общему знаменателю функций, в этом случае IRole будет лучше имя интерфейса в качестве интерфейса определяет две функции, которые должны быть satiisfied всеми типами представляющих Role

+0

IsRoler и AssumeRoler -> IsserAssumer? lol, это может быть лучше в обмене текстом на английском языке .... – Dale

+0

@Dale https://talks.golang.org/2014/names.slide#14 => Иногда результат неверен на английском, но мы делаем это в любом случае: –

10

В вашем случае я бы назвал их RoleChecker и , «слитый» один RoleCheckerAssumer. Или если вы идете с одним интерфейсом, это может быть RoleHelper или RoleChecker.

ServerSession также хорошо, или даже просто Session (особенно если нет сеанса «клиент»). ServerSessioner с другой стороны плохо, Session - это не глагол, а не метод интерфейса.


Было много сообщений об условностях.

Effective Go: Interface names:

По соглашению, один метод интерфейсы названы именем метода плюс суффикс -er или подобной модификации для построения агента существительное: Reader, Writer, Formatter, CloseNotifier и т.д.

Существует множество таких имен, и их продуктивность - их честь и имена функций, которые они фиксируют. Read, Write, Close, Flush, String и т. Д. Имеют канонические подписи и значения. Чтобы избежать путаницы, не давайте вашему методу одно из этих имен, если оно не имеет одинаковую подпись и значение.И наоборот, если ваш тип реализует метод с тем же значением, что и метод по известному типу, дайте ему то же имя и подпись; вызовите метод строкового преобразователя String не ToString.

Interface Types @ What's in a name? - Talks at golang.org

Интерфейсы, которые определяют только один метод, как правило, только что имя функции с «эр», приложенном к нему.

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 или аналогичные. Вместо этого:

Receivers @ What's in a name? - Talks at golang.org

приемники представляют собой особый вид аргументации.

По соглашению, они один или два символа, которые отражают тип приемника, , потому что они, как правило, появляются практически в каждой строке:

func (b *Buffer) Read(p []byte) (n int, err error) 

func (sh serverHandler) ServeHTTP(rw ResponseWriter, req *Request) 

func (r Rectangle) Size() Point 

имена приемника должны быть согласованы по методам типа. (Не следует использовать г в одном методе и РДР в другой.)

Go Code Review Comments: Receiver Names:

Имя приемнику метода должна быть отражением ее идентичности; часто бывает достаточно одной или двух буквенных сокращений его типа (например, «c» или «cl» для «Клиент»). Не используйте общие имена, такие как «я», «это» или «я», идентификаторы, типичные для объектно-ориентированных языков, которые уделяют больше внимания методам, а не функциям. Имя не должно быть таким же описательным, как имя аргумента метода, поскольку его роль очевидна и не служит никакой документальной цели. Он может быть очень коротким, поскольку он появится почти на каждой линии каждого метода типа; знакомство допускает краткость. Будьте также последовательны: если вы вызываете приемник «c» одним способом, не называйте его «cl» в другом.

+0

Интерфейсы с одним интерфейсом «проще». «Is ()« меня выбрасывает. Я закончил тем, что использовал «checker()». Да, извините, не будем использовать один или два буквенных идентификатора. Мне все равно, что здесь идиоматично. Я знаю полдюжины языков, которые используют это или я, почему я нарушаю конвенцию здесь просто потому, что какой-то документ в спецификации языка говорит, что я должен? Это или я - это именно то, что я имею в виду и что хочу. В конце концов, мне нужно прочитать мой код, и если я буду рыться в моем speghetti для одного идентификатора одной буквы, в чем смысл? – Dale

+3

@Dale Ты делаешь все, что хочешь. Никто не заставит вас что-либо сделать. И пока вы вводите код «в одиночку», это никому не мешает. Но если вы хотите работать с другими, или другие должны работать с вашим кодом, вам нужно говорить на «общем» языке. Относительно 'this' и' self' в качестве приемника метода: [В Go назначает переменную-приемник «self», вводящую в заблуждение или хорошую практику?] (Http://stackoverflow.com/questions/23482068/in-go-is-naming -the-receiver-variable-self-misleading-or-good-practice) – icza

+0

Спасибо. Я не хочу спорить. Я планирую открыть источник этой кучи. Возможно, обратная связь заставит меня пересмотреть мое решение. Я все еще не убежден в решениях дизайнеров. Это, как говорится, почти все, что я видел в Go, было очень впечатляющим. – Dale

Смежные вопросы