2016-08-09 80 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++約定是在每件事物前面拋出一個「I」。這是「慣用」嗎?

有什麼建議嗎?

+1

我只是稱之爲'角色支持',但要達到英語水平。事實上,這將是一個有趣的嘗試。請考慮不要使用'this'來命名方法接收器:這被認爲是單向性的Go。討論這些問題的[一個例子](http://stackoverflow.com/q/23482068/720999)。 – kostix

+0

是的,我一直在努力接收機名稱。我知道這個成語是使用單個字母變量....我很抱歉,我不能那樣做。 「這個」或「自我」在任何其他語言中都非常普遍,它可以消除歧義。 「角色支持」是可以的,但並不適合整潔的模式。 – Dale

+1

不是單個字母,而是有意義的縮寫 - 單個字母可以用於短的功能(包括您的)。 「任何其他語言」肯定是一個嚴重的分解。那麼,出於某種原因,這對我來說不是問題:不同的語言只是感覺不同。新手程序員的確努力成爲一招狗,試圖將他們的學習技能集成到他們面對的任何新語言中(一直在我自己身邊),但理解語言背後的哲學並堅持下去總是更好。 – kostix

回答

1
的類型來satiisfied兩種功能的做法

我明白了,tur我可以使用「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將是一個更好的界面名稱作爲接口定義了必須由所有代表Role

+0

IsRoler和AssumeRoler - > IsserAssumer?大聲笑,這可能會更好的英文堆棧交換.... – Dale

+0

@戴爾https://talks.golang.org/2014/names.slide#14 =>有時結果是不正確的英語,但我們這樣做無論如何: –

10

在你的情況下,我只是將它們命名爲RoleChecker和,「合併」一個RoleCheckerAssumer。或者,如果您想要使用單個界面,那可能是RoleHelperRoleChecker

ServerSession也很好,甚至只是Session(特別是如果沒有「客戶」會話)。另一方面ServerSessioner是壞的,Session不是接口的動詞而不是方法。


關於這些約定有很多帖子。

Effective Go: Interface names:

按照慣例,一個方法接口由該方法name加上後綴-er或類似的修改命名構建的試劑名:ReaderWriterFormatterCloseNotifier

有許多這樣的名字,並且對它們以及它們捕獲的函數名稱進行高效的表示。 Read,Write,Close,Flush, String等都具有規範簽名和含義。爲了避免混淆,除非它具有相同的簽名和含義,否則不要給你的方法一個這樣的名字。相反,如果你的類型實現了一個與着名類型的方法具有相同含義的方法,給它一個相同的名字和簽名;請致電您的字符串轉換器方法String而不是ToString

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

接口指定只有一個方法通常只是附加到它的「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)。

對於接收者名稱,請勿使用thisself或類似的名稱。相反:

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 

接收器的名稱應該是跨越式的方法一致。 (不要在另外一個方法和RDR使用河)

Go Code Review Comments: Receiver Names:

的方法的接收器的名稱應該是其身份的反映;通常一個字母的一個或兩個字母的縮寫就足夠了(例如「客戶」的「c」或「cl」)。不要使用通用名稱,比如「me」,「this」或「self」,這些名稱是面向對象的語言的典型代碼,與函數相比,它更強調方法。這個名字不必像方法論證那樣具有描述性,因爲它的作用是顯而易見的,並且沒有任何文獻目的。它可能很短,因爲它幾乎出現在每種類型的每種方法的每一行上;熟悉承認簡潔。也要保持一致:如果您用一種方法調用接收器「c」,則不要在另一個方法中將其稱爲「cl」。

+0

單一方法接口「更容易」。 「是()」扔了我。我最終只使用「checker()」。是的,抱歉,不會使用單個或兩個字母標識符。我不在乎這裏的習慣用法。我知道使用這種或者自己的六種語言,爲什麼我會在這裏打破約定,僅僅是因爲語言規範中的一些文檔說我應該?這或我自己正是我的意思和我想要的。在一天結束時,我需要閱讀我的代碼,並且如果我翻閱我的speghetti單個字母標識符,那有什麼意義? – Dale

+3

@Dale你可以做任何你想做的事。沒有人會強迫你做任何事情。只要你編碼「獨自」,它不會打擾其他人。但是,如果你想與他人合作,或者其他人需要使用你的代碼,你需要說一個「通用」的語言。關於'this'和'self'作爲接收方的方法:[在Go中將接收方變量命名爲'self'誤導性或良好實踐?](http://stackoverflow.com/questions/23482068/in-go-is-naming - 接收者 - 變量 - 自我誤導或良好實踐) – icza

+0

謝謝。我不想爭論。我打算開放這個堆。也許反饋會迫使我重新思考我的決定。我仍然不相信這裏的設計師的決定。這就是說,我在Go上看到的所有其他東西都非常令人印象深刻。 – Dale