Go Check List

Go Check Sheet #

References #

設計 #

パッケージ管理 #

  • Go Modules (go.mod)

設計 #

  • 分割
    • パッケージを適切に分割
    • ファイルを適切に分割
  • 命名
    • 大文字なしの1単語
      • UpperCamelCase, snake_cake, chain-case は NG
    • 具体性のない命名は NG
      • e.g. commonutil などは NG
      • fileutil のように具体性がある命名は許容範囲
    • 標準/準標準パッケージと同じ名前は避けること
    • 気持ちの良い命名は良い設計ができた証拠
    • 冗長な命名は設計がうまくいっていない証拠
  • 適切に型定義すること
    • 多くの引数を引き回さないこと
    • 何でもかんでも構造体にしないこと
      • e.g. go/token.Pos int ソースコード上の場所を表す型 大小を演算子で比較できる  token.FileSet は構造体 構造体ではメソッド化が必要になるため面倒
    • 型同士がお互いを知りすぎていると密結合になるため注意
  • 過度の抽象化をおこなわないこと
    • メソッドの数が多すぎるインターフェイス
    • テストの事情を背負いすぎているインターフェイス
  • internal ディレクトリ
    • 公開したくない機能を隠蔽
    • internal 以下は内部パッケージ
    • internal ディレクトリ以下のパッケージのみ参照可
    • internal 以下でエクスポートしても外のパッケージから参照不可
  • 大規模データの入力を考慮
    • 処理できる範囲を仕様として明確化
    • 大きすぎる入力はエラーとして処理 (大規模データの入力を想定せずに落ちるのはNG)
    • メモリが溢れないこと
    • 処理に時間がかかりすぎないこと
    • 再帰呼び出ししすぎてスタックオーバーフローをおこさないこと
  • テスト可用性
    • パッケージ変数は極力使用しないこと t.Parallel 使用時に競合するため
    • Configurability(設定変更容易性) 定数は初期値としてのみ使用, 構造体のフィールド等で値を変更してテストで使用

実装 #

  • README.md を作成
  • 処理のまとまり
    • 読み手が脳のワーキングメモリを消費しない長さ
    • 読む際, 息継ぎしやすい長さ
    • ネストは浅く(特に if文 や for文)
  • DRY
    • 同じ処理を複数回かかないこと
    • 適切に関数に切り出していること
  • main.go はできるだけ薄くすること
  • 標準/準標準パッケージの機能を充分に活用
    • bufio, bytes, exec, fmt, fs, io, os, path, filepath, strings, etc
  • ディレクトリ区切り
    • Linux, Mac, Windows etc どのOSでも動作するようメソッドを選択
    • path.Join path パッケージの区切りは全てスラッシュ
    • filepath.FromSlash, filepath.ToSlash
  • Export
    • メソッドと返り値で公開と非公開を統一(捻じれが生じないようにすること)
  • 初期化
    • 初期化には make を使用したほうが間違いが少ない) map[int]int{} -> make(map[int]int)
  • エラー処理
    • log.Fatal は内部で os.Exit(1) を呼んでいるためパッケージ側では使用しないこと
    • エラーメッセージ https://github.com/golang/go/wiki/CodeReviewComments#error-strings
      • 簡潔に記述
      • 先頭は小文字
      • 終端は句読点なし
    • 通常のエラー処理は panic を使用せず error を複数戻り値で使用 https://github.com/golang/go/wiki/CodeReviewComments#dont-panic
  • 並行処理
    • 並行処理での競合を回避するためにパッケージ変数は基本的に使用せず不変なものにのみ使用すること
    • context のキーは 空の構造体(empty struct)を使用(メモリ消費なし)
    type ctxKey struct{}
    var a ctxKey
    

解析 #

テスト #

その他 #