web-dev-qa-db-ja.com

Go、CamelCase、またはSemi-CamelCaseで関数に名前を付ける方法はどれですか?

Goで関数を記述して、MongoDBデータベースのコレクションにドキュメントを挿入します。どちらの方法で関数に名前を付けるのが良いですか、

  • writeToMongoDBまたは
  • WriteToMongoD

2つ目はCamelCaseで、誰かが最初のスタイルを使用しているのを見たので、どちらが適切かはわかりません。ありがとう。

53
Tim

構文

Goでは、これはスタイルの問題ではなく、構文の問題です。

エクスポートされた名前(つまり、定義されているパッケージ以外のパッケージから使用できる識別子)は、大文字で始まります。したがって、メソッドがパブリックAPIの一部である場合、次のように記述する必要があります。

WriteToDB

ただし、内部ヘルパーメソッドの場合は、次のように記述する必要があります。

writeToDB

キーワードを使用してエクスポートの定義(externpublicなど)を定義するよりも、この方法で行うことの利点は、名前の一部にすることで、識別子が使用されている場所で、それがエクスポートされているかどうかを見つけることなく確認できることです定義された場所(定義にキーワードが含まれているかどうかを確認するため)。

以下も参照してください:仕様からエクスポートされた識別子 .

国際化

GoはUTF-8でエンコードされており、識別子名に文字または数字のプロパティを持つUnicode文字をサポートしているため、大文字と小文字の概念を持たないロケールの一部の人々は、エクスポートされたメソッドの作成に問題があります(デフォルトはエクスポートされていません)。この場合(しゃれを意図)、エクスポートを示すためにXを識別子の前に付けるのが一般的です。例:X日本語

以下も参照してください:Unicode識別子の最新情報 .

スタイル

一般的なスタイルに関する限り、常にキャメルケースを使用することです(前述の最初の文字を除く)。これには、定数、関数、およびその他の識別子が含まれます。たとえば、(エクスポートされた)定数のリストは次のようになります。

const (
    StateConnected = iota
    StateError
    StateDone

    internalStateMask = 0x2 
)

さらに、略語は常に同じ大文字と小文字で記述されるため、次のいずれかを記述します。

dbWrite
writeDB

writeDbまたはDbWriteの代わりに。

84
Sam Whited

Goでは、混合キャップを使用するのが慣例です。ドキュメントから: https://golang.org/doc/effective_go.html#mixed-caps

最後に、Goの規則では、アンダースコアではなくMixedCapsまたはmixedCapsを使用してマルチワード名を記述します。

大文字で始まるファイルレベル名はパッケージレベルでエクスポートされることに注意してください。 https://golang.org/doc/effective_go.html#Getters

また、すべての大文字に頭字語を書くのが慣例です。以下は問題ありません:

writeToMongoDB // unexported, only visible within the package

または

WriteToMongoDB // exported

ではなく:

writeToMongoDb
19
abhink

お名前

Goでは、他の言語と同様に名前が重要です。それらには意味的な効果さえあります:パッケージ外の名前の可視性は、その最初の文字が大文字かどうかによって決まります。したがって、Goプログラムの命名規則について少し話をする価値があります。

パッケージ名

パッケージがインポートされると、パッケージ名がコンテンツのアクセサーになります。後

import "bytes"インポートパッケージはbytes.Bufferについて話すことができます。パッケージを使用するすべての人が同じ名前を使用してその内容を参照できると便利です。つまり、パッケージ名は短く、簡潔で、刺激的でなければなりません。 慣例により、パッケージには小文字の単一単語名が付けられます。アンダースコアやmixedCapsは必要ないはずです。パッケージを使用する全員がその名前を入力するため、簡潔にするために誤りがあります。先験的に衝突について心配する必要はありません。パッケージ名は、インポートのデフォルト名のみです。すべてのソースコードにわたって一意である必要はなく、まれに衝突が発生した場合、インポートパッケージはローカルで使用する別の名前を選択できます。いずれの場合でも、インポートのファイル名によって使用されるパッケージが決まるため、混乱はほとんどありません。

別の規則では、パッケージ名はソースディレクトリのベース名です。 src/encoding/base64のパッケージは「encoding/base64」としてインポートされますが、encoding_base64およびencodingBase64ではなくbase64という名前が付いています。

パッケージのインポーターはその名前を使用してそのコンテンツを参照するため、パッケージ内のエクスポートされた名前はその事実を使用して、スタッターを回避できます。 (import。表記法を使用しないでください。これにより、テスト対象のパッケージの外部で実行する必要があるテストを簡略化できますが、そうでない場合は避ける必要があります。)ユーザーはそれをbufio.Readerと見なします。これは明確で簡潔な名前です。さらに、インポートされたエンティティは常にパッケージ名でアドレス指定されるため、bufio.Readerはio.Readerと競合しません。同様に、Goのコンストラクターの定義であるring.Ringの新しいインスタンスを作成する関数は、通常NewRingと呼ばれますが、Ringはパッケージによってエクスポートされる唯一のタイプであり、パッケージはringと呼ばれるため、 Newと呼ばれ、パッケージのクライアントはring.Newと表示されます。適切な名前を選択するには、パッケージ構造を使用してください。

もう1つの短い例は、once.Doです。 once.Do(setup)は読みやすく、once.DoOrWaitUntilDone(setup)を書き込んでも改善されません。長い名前は、自動的に読みやすくなりません。 役立つドキュメンテーションコメントは、余分な長い名前よりも価値があることがよくあります。

ゲッター

Goは、ゲッターとセッターの自動サポートを提供しません。ゲッターとセッターを自分で提供することには何の問題もありません。そうすることはしばしば適切ですが、Getをゲッターの名前に入れることは慣用的でも必要でもありません。 owner(小文字、エクスポートされていない)というフィールドがある場合、getterメソッドはGetOwnerではなくOwner(大文字、エクスポートされた)と呼ばれるべきです。エクスポートに大文字の名前を使用すると、メソッドからフィールドを区別するためのフックが提供されます。 セッター関数は、必要に応じて、おそらくSetOwnerと呼ばれます。両方の名前は実際にはよく読みます:

owner := obj.Owner()
if owner != user {
    obj.SetOwner(user)
}

インターフェース名

慣例により、1メソッドインターフェイスは、メソッド名に-er接尾辞またはエージェント名詞を構成する同様の変更(Reader、Writer、Formatter、CloseNotifierなど)によって名前が付けられます

そのような名前は多数あり、それらとそれらがキャプチャする関数名を尊重することは生産的です。 読み取り、書き込み、閉じる、フラッシュ、文字列などには、標準的な署名と意味があります。混乱を避けるため、同じシグネチャと意味を持たない限り、メソッドにこれらの名前を付けないでください。逆に、タイプが井戸のメソッドと同じ意味のメソッドを実装する場合-既知のタイプ、同じ名前と署名を付けます。 ToStringではなく、ストリングコンバーターメソッドStringを呼び出します。

MixedCaps

最後に、Goの規則では、アンダースコアではなくMixedCapsまたはmixedCapsを使用してマルチワード名を記述します

ref: 有効なGo

12
user6169399

Golangでは、大文字で始まる識別子(例:CamelCase)を持つ変数(または関数)は、プログラム内の他のすべてのパッケージに公開(アクセス可能)されますが、小文字で始まるもの(例) 、camelCase)は、宣言されているパッケージを除き、どのパッケージからもアクセスできません。

別のパッケージで変数(または関数)を使用する場合はCamelCaseを使用する必要があります。または、camelCaseを安全に使用できます。

8
Tanmay Garg