Go Packageの命名方法
公式GoのBlog Pacakge namesの(一部)和訳、まとめになります。
導入
いいパッケージの名前はパッケージの内容を示唆し、そのユーザーが内容や使い方を理解するのに役立つ。Effective Goにパッケージ、タイプ、関数など名前の付け方のガイドラインがあり、それらをさらに拡張して議論します。悪い名前の付け方、その直し方も議論します。
パッケージの命名
いいパッケージの名前は短くて簡単なもの
Lower case (小文字) のみ
under_scores, mixedCaps がないもの
いい例
- time
- list
- http
悪い例
- computeServiceClient
mixedCapsは使うべきではない - priority_queue
under_scoresは使うべきではない
慎重な省略(Abbreviation Judiciously)
パッケージの名前をただ省略するだけでは、ただ曖昧になるだけ。
また、別のユーザーからいい名前を盗むべきではない。
いい例
-
strconv (string conversion)
-
syscall (system call)
-
fmt (formatted I/O)
-
bufio (buffered I/O)
buffered I/O は buf とは略すべきではない。buf は buffer に使われるべき。
パッケージのコンテンツの命名
関数や変数の命名法
パッケージの名前をプレフィックス(接頭語)として使うことになる。
反復をさける
パッケージの名前とセットで考える
いい例
- time.Now()
- http.Server()
悪い例
- time.TimeNow()
- http.HTTPServer()
単純な関数の名前
pkg.New() は pkg.Pkg または *pkg.Pkg を返す
例
q := list.New() // q は *list.List
d, err := time.ParseDuration("10s") // d は time.Duration
ticker := time.NewTicker(d) // ticker は *time.Ticker
もしプレフィックスとしてのパッケージの名前が思いつかないのであれば、パッケージの境界が間違っているかもしれない。
悪い命名例
意味のないパッケージネームは避ける
- util
- common
- misc
はユーザー側になにも情報を提供しない。
汎用的な名前だからほかのパッケージとも衝突しやすい
悪い例
package util
func NewStringSet(...string) map[string]bool {...}
func SortStringSet(map[string]bool) []string {...}
いい例
utilから抽出してパッケージに分ける
package stringset
func New(...string) map[string]bool {...}
func Sort(map[string]bool) []string {...}
API をひとつにまとめない
API(interface)をひとつのapiというパッケージにまとめようとするのは間違ったアプローチ際限なく大きくなり、ユーザーにガイダンスを提示せず、依存が混雑し、importが複雑になる。
不必要な名前の衝突を避ける
異なるディレクトリのパッケージが同じ名前がついたとき、それらがよく一緒に使われるのであれば、明確に異なるパッケージの名前に変えるべき。
また、ioやhttpといった有名な名前と一緒にすべきでもない。
References