名前
名前はGoにおいて他の言語と同じく重要です。場合によっては意味的な効果を持つこともあります。たとえば、名前の最初の文字が大文字かどうかによって、パッケージの外部からその名前が見える(公開される)かどうかが決まります。そのため、Goプログラムでの命名規則について少し時間を割いて説明する価値があります。
パッケージ名
パッケージがインポートされると、パッケージ名がその内容にアクセスするためのアクセサーになります。次のようにした後:
import "bytes"
インポートするパッケージはbytes.Buffer
について話すことができます。そのパッケージを使用するすべての人が同じ名前を使ってその内容を参照できると便利です。これは、パッケージ名が良いものであるべきことを意味します:短く、簡潔で、想起しやすい。慣習として、パッケージには小文字の単一語の名前が付けられます。アンダースコアやmixedCapsは必要ありません。あなたのパッケージを使用するすべての人がその名前を入力することになるため、簡潔性を重視してください。そして、衝突を事前に心配する必要はありません。パッケージ名はインポートのデフォルト名にすぎません。すべてのソースコードで一意である必要はありません。まれに衝突が発生した場合、インポートするパッケージがローカルで使用する別の名前を選択できます。いずれにしても、混乱はまれです。なぜなら、インポートのファイル名がどのパッケージが使用されているかを決定するからです。
もう一つの慣習は、パッケージ名がそのソースディレクトリのベース名であることです。src/encoding/base64
にあるパッケージは"encoding/base64"
としてインポートされますが、名前はbase64
であり、encoding_base64
でもencodingBase64
でもありません。
パッケージのインポーターは、その名前を使用してその内容を参照するため、パッケージ内のエクスポートされた名前はその事実を利用して繰り返しを避けることができます。(主にテストや他の特殊な状況を意図したimport .
記法は使用しないでください)たとえば、bufio
パッケージのバッファード・リーダー・タイプはBufReader
ではなくReader
と呼ばれます。なぜなら、ユーザーはそれをbufio.Reader
として見るからです。これは明確で簡潔な名前です。さらに、インポートされたエンティティは常にそのパッケージ名でアドレス指定されるため、bufio.Reader
はio.Reader
と競合しません。同様に、ring.Ring
の新しいインスタンスを作成する関数(これはGoにおけるコンストラクタの定義です)は通常NewRing
と呼ばれますが、Ring
がパッケージによってエクスポートされる唯一のタイプであり、パッケージがring
と呼ばれるため、単にNew
と呼ばれます。パッケージのクライアントはこれをring.New
として見ます。パッケージ構造を使用して良い名前を選択するのに役立ててください。
別の短い例はonce.Do
です。once.Do(setup)
は読みやすく、once.DoOrWaitUntilDone(setup)
と書いても改善されません。長い名前が自動的に物事をより読みやすくするわけではありません。役に立つdocコメントは、すべての情報を名前に詰め込もうとするよりも、多くの場合価値があります。
Getters
Goは getters や setters の自動サポートを提供していません。gettersやsettersを自分で提供することは何も悪いことではなく、しばしば適切なことですが、getter の名前にGet
を付けることは慣用的でも必要でもありません。owner
(小文字、非公開)というフィールドがある場合、getterメソッドはGetOwner
ではなくOwner
(大文字、公開)と呼ばれるべきです。大文字の名前を使用することで、フィールドからメソッドを識別するためのフックを提供します。必要に応じて、setter関数はおそらくSetOwner
と呼ばれるでしょう。どちらの名前も実際によく読めます:
owner := obj.Owner()
if owner != user {
obj.SetOwner(user)
}
インターフェース名
慣習として、1つのメソッドインターフェースは、メソッド名に-er接尾辞または類似の修飾を付けてエージェント名詞を構成することによって命名されます:Reader
、Writer
、Formatter
、CloseNotifier
など。
このような名前は数多くあり、それらと、それらが捉える関数名を尊重することは生産的です。Read
、Write
、Close
、Flush
、String
などには標準的なシグネチャと意味があります。混乱を避けるため、同じシグネチャと意味を持つ場合でなければ、メソッドにそれらの名前の一つを付けないでください。逆に、あなたのタイプが、よく知られたタイプのメソッドと同じ意味を持つメソッドを実装する場合、同じ名前とシグネチャを付けてください。文字列変換メソッドをToString
ではなくString
と呼んでください。
MixedCaps
最後に、Goの慣習は、複数語の名前を書くためにアンダースコアではなくMixedCaps
やmixedCaps
を使用することです。