Golangでの「this」の使用


12

Golangがここにあるスタイルガイドに最も近いのは、Receiver Namesの下です。

メソッドのレシーバーの名前は、そのアイデンティティを反映したものでなければなりません。多くの場合、そのタイプの1文字または2文字の略語で十分です(「クライアント」の「c」または「cl」など)。「me」、「this」、「self」などの汎用名は使用しないでください。これらは、関数ではなくメソッドに重点を置くオブジェクト指向言語の典型的な識別子です。名前はメソッドの引数のように説明的なものである必要はありません。その役割は明白であり、文書の目的には役立たないからです。

個人的には、「this」が関数の記述および編集時に取り組んでいるものの焦点であるため、常に「this」を識別子として使用しています。それは正しいように聞こえ、(少なくとも私には)理にかなっています。

名前が記述的である必要がない場合、その役割は明白であり、ドキュメンタリーの目的を果たしません。なぜ「これ」の使用が眉をひそめるのでしょうか?


3
同様の質問とその他の回答:stackoverflow.com/questions/23482068
トレントン

回答:


11

そのスタイルガイドの作成者に確実に知ってもらう必要がありますが、私が彼に同意する主な理由は、構造体とメソッドの間の接続が他の言語よりもGoではるかに緩いことです

本質的に、次のようなメソッドを記述する場合:

func (m *MultiShape) area() float64 {
  ...
}

これは、次のような関数を書くこととほぼ同じです。

func area(m *MultiShape) float64 {
  ...
}

唯一の違いは、関数/メソッドの呼び出し方法のわずかな構文の変更です。

他の言語では、通常、this/ self/ whatever変数には、言語によって魔法のように提供されたり、プライベートメソッドに特別にアクセスしたりするなどの特別なプロパティがあります(Goにはプライベートフィールド/メソッドがないことに注意してください)。「レシーバー」はまだある程度「魔法のように提供」されていますが、通常の関数の引数に非常に似ているため、おそらくカウントされません。

さらに、「従来の」OOP言語では、構造体/クラスのメソッドにはすべて構造体/クラス定義が付属しているため、外部から追加することはできません。Goでは、私が知る限り、誰でも(もちろん、独自のコードの範囲内で)より多くのメソッドを追加できます。

独自のスタイルガイドを作成するのに十分なGoを記述していませんが、個人的にはthis、受信する構造体と同じファイルで定義されたメソッドで使用するでしょう。。


それは良い説明です。私はC#や他のOOP言語に慣れていると思うので、私は知っている慣習に戻ります。
アダム

1
@Adam私は、私がthis伝統的なOOP言語ではないことを思い出させる以外の理由がない場合は避けます。
マイケルハンプトン

4
「this」と「receiver」の間に実際の違いはありません(「マジック」という言葉の乱用を止めてください-高レベルプログラミング言語のすべての機能は「マジック」と呼ぶことができます。 「魔法」であることは意味がないので、「これ」を選んでください。
mvmn

6

私はこのスタイルガイドで納得していないと私は何よりも優れているとは思わないthismeまたはself。そのためthismeあるいはselfそれがスーパークリアな変数は、コンテキスト構造体のインスタンスであることになります。小文字の構造体名変数が悪い考えだと言っているのではなくthis、それが非常に明確になる方法が好きです。


説明がなければ、他の誰かが反対意見を投稿した場合、この答えは役に立たない可能性があります。たとえば、誰かが「このスタイルガイドに納得していてthis、より良いと思う」meまたはself「」などの主張を投稿した場合この回答は読者が2つの反対意見を選ぶのにどのように役立ちますか?考えてみましょ編集を満たすために、より良い形にそれをINGの回答方法のガイドラインを
ブヨ

私が言いたいことを明確に説明したと思います。
銭チェン

1
同意する。javascriptコンテキストによって毒された脳が多すぎると思います。脇に置いておくと。これが現在のコンテキストを参照することははるかに簡単です。また、後で構造体の名前を変更したり、実装の一部をコピーして貼り付けたりする方が簡単です。短い謎の名前line hlなどのゴングは、これよりも簡単ではありません。
セン

0

これはthis、コンパイラにとって実際のキーワードの意味を持つJavaScriptの観点からですが、私の理解では、オブジェクトタイプの2文字の省略形で問題なければ、代わりにそれを使用するのは十分に簡単なはずです。違いの理由は、徐々に大きくなる非同期コードのかなり大きなブロックでは、「これ」または受信者がより深いコンテキストにあるものを誤解するのは非常に簡単だからです。また、同じオブジェクトではない可能性があります。

たとえばJavaScriptでは、コントロールモジュールがダイアログを起動し、onLoadインラインで関数を宣言する場合があります。しかし、その時点では、別のコーダーがthis内部onLoadでは誤って解釈してダイアログではなく制御モジュールを参照するのは非常に簡単です。またはその逆。コントロールがと呼ばれctrl、ダイアログがと呼ばれる場合、これは回避できますdg


3
私はダウンボーターではありませんがthis、Javascriptの混乱する動作のほとんどはGoには当てはまらないため、その理由を推測しています。
Ixrec

@Ixrec Hm ...大丈夫。私はあなたthisの名前を選択できる状況にそれを拡張しようとしていた。たとえば、多くの場合、JSコーダーはvar self = this同じ参照を保持するために書き込みます。しかし、Goのデザインガイドによると、同じ混乱の問題が発生する可能性があり、理論的にはより説明的なリファレンスを使用する必要があります。
Katana314
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.