LoginSignup
0
0

More than 1 year has passed since last update.

Go Package 命名法

Last updated at Posted at 2022-11-14

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

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0