はじめに
英語の勉強でリーディングを始めました。Go言語の勉強も兼ねてEffective Goを翻訳していければと思います。
自分の勉強用の翻訳なので、直訳かつ、訳に間違いがあるかもしれませんが、ご容赦いただければ幸いです。
もし間違いを見つけた方はコメントいただけると嬉しいです。
念のため、Effective GoのCopyrightを記載します。
コンテンツは Creative Commons Attribution 3.0 License、コードはBSD licenseとなっているため、適切に引用や翻訳すれば問題なさそうでした。
Effective Go 翻訳 – Names
Names are as important in Go as in any other language. They even have semantic effect: the visibility of a name outside a package is determined by whether its first character is upper case. It’s therefore worth spending a little time talking about naming conventions in Go programs.
https://golang.org/doc/effective_go#names
Goにおける名前は他の言語と同じくらい重要です。最初の文字が大文字かどうかによってパッケージの外から参照できるか決定されるように、名前は人にとって意味を成す効果を持ちます。そのためGoプログラムでネーミングの慣習について時間を使う価値があります。
Package names
When a package is imported, the package name becomes an accessor for the contents. After
https://golang.org/doc/effective_go#names
パッケージがインポートされる時、パッケージ名はコンテンツへのアクセサーとなります。
import "bytes"
the importing package can talk about
https://golang.org/doc/effective_go#namesbytes.Buffer
. It’s helpful if everyone using the package can use the same name to refer to its contents, which implies that the package name should be good: short, concise, evocative. By convention, packages are given lower case, single-word names; there should be no need for underscores or mixedCaps. Err on the side of brevity, since everyone using your package will be typing that name. And don’t worry about collisions a priori. The package name is only the default name for imports; it need not be unique across all source code, and in the rare case of a collision the importing package can choose a different name to use locally. In any case, confusion is rare because the file name in the import determines just which package is being used.
パッケージインポートimport "bytes"
の後、bytes.Buffer
について話すことができます。パッケージを使用するすべての人が同じ名前で内容を参照できると便利です。それは、パッケージ名は短く、簡潔、連想させるような良い名前であるべきであることを暗に意味します。慣習として、パッケージは小文字で人単語の名前で与えられます。アンダースコアやミックスキャプスは必要とすべきではありません。パッケージを使用するすべての人が名前をタイピングするため、簡潔にし過ぎるくらい簡潔にしてください。そして、衝突について事前に心配する必要はありません。パッケージ名はインポートのためのデフォルト名のみです。それは、すべてのソースコードに渡ってユニークである必要はなく、衝突というレアケースではインポートするパッケージは使用するローカルで違う名前を選ぶことができます。いずれにしても、インポート時のファイル名は使用されているどのパッケージかを決めるため、混乱することは稀です。
Another convention is that the package name is the base name of its source directory; the package in
https://golang.org/doc/effective_go#namessrc/encoding/base64
is imported as"encoding/base64"
but has namebase64
, notencoding_base64
and notencodingBase64
.
別の慣習として、パッケージ名はソースディレクトリのベース名であるという慣習があります。src/encoding/base64
内のパッケージは"encoding/base64"
としてインポートされますが、base64
という名前であり、encoding_base64
でもencodingBase64
でもありません。
The importer of a package will use the name to refer to its contents, so exported names in the package can use that fact to avoid repetition. (Don’t use the
https://golang.org/doc/effective_go#namesimport .
notation, which can simplify tests that must run outside the package they are testing, but should otherwise be avoided.) For instance, the buffered reader type in thebufio
package is calledReader
, notBufReader
, because users see it asbufio.Reader
, which is a clear, concise name. Moreover, because imported entities are always addressed with their package name,bufio.Reader
does not conflict withio.Reader
. Similarly, the function to make new instances ofring.Ring
—which is the definition of a constructor in Go—would normally be calledNewRing
, but sinceRing
is the only type exported by the package, and since the package is calledring
, it’s called justNew
, which clients of the package see asring.New
. Use the package structure to help you choose good names.
パッケージのインポーターはその名前を使ってコンテンツを参照するため、パッケージ内のエクスポートされる名前はその事実を利用して繰り返しを避けることができます。(import .
表記を使ってはいけません。それは、テスト対象のパッケージの外で実行されなければならないテストを簡単にすることができますが、それ以外の場合は避けるべきです。)例えば、bufio
パッケージにおけるbuffered readerタイプは、ユーザはbufio.Reader
としてそれを見るため、BufReader
ではなく、Reader
と呼ばれ、これは明瞭で簡潔な名前です。さらに、インポートされたエンティティはいつもそれらのパッケージ名で表示されるため、bufio.Reader
はio.Reader
と衝突しません。同様に、ring.Ring
の新しいインスタンスを生成する関数(Goのコンストラクタの定義)は通常NewRing
と呼ばれますが、Ring
はパッケージによってエクスポートされる唯一のタイプであり、パッケージはring
と呼ばれるため、それはNew
と呼ばれ、パッケージのクライアントはring.New
として見ます。パッケージ構造を使用することはあなたが良い名前を選ぶことを助けます。
Another short example is
https://golang.org/doc/effective_go#namesonce.Do
;once.Do(setup)
reads well and would not be improved by writingonce.DoOrWaitUntilDone(setup)
. Long names don’t automatically make things more readable. A helpful doc comment can often be more valuable than an extra long name.
once.Do
は別の短い例です。once.Do(setup)
は読みやすく、once.DoOrWaitUntilDone(setup)
と書くことで改善されないでしょう。長い名前は自動的に物事をより読みやすくしません。役に立つdocコメントは余分に長い名前よりもしばしば価値があります。
Getters
Go doesn’t provide automatic support for getters and setters. There’s nothing wrong with providing getters and setters yourself, and it’s often appropriate to do so, but it’s neither idiomatic nor necessary to put
https://golang.org/doc/effective_go#namesGet
into the getter’s name. If you have a field calledowner
(lower case, unexported), the getter method should be calledOwner
(upper case, exported), notGetOwner
. The use of upper-case names for export provides the hook to discriminate the field from the method. A setter function, if needed, will likely be calledSetOwner
. Both names read well in practice:
Goはゲッターとセッターの自動的なサポートを提供しません。ゲッターとセッターを自分で提供することは全く悪いことではなく、そのようにすることはしばしば適切ですが、Get
をゲッターの名前に入れることは慣用的でも必要もありません。もしowner
(小文字、エクスポートされていない)と呼ばれるフィールドを持っていたとして、ゲッターメソッドはGetOwner
ではなく、Owner
(大文字、エクスポートされている)と呼ばれるべきです。エクスポートとしてアッパーケースの名前を利用することはメソッドからフィールドを識別するフックを提供します。もし必要なら、セッター関数はSetOwner
と呼ばれるでしょう。実際に両方の名前は読みやすいです。
owner := obj.Owner()
if owner != user {
obj.SetOwner(user)
}
Interface names
By convention, one-method interfaces are named by the method name plus an -er suffix or similar modification to construct an agent noun:
https://golang.org/doc/effective_go#namesReader
,Writer
,Formatter
,CloseNotifier
etc.
慣習として、一つのメソッドを持つインターフェイスはメソッド名に-erサフィックスをプラスした名前や、Reader
, Writer
, Formatter
, CloseNotifier
などの名詞を構築するための類似した変更によって名前づけられます。
There are a number of such names and it’s productive to honor them and the function names they capture.
https://golang.org/doc/effective_go#namesRead
,Write
,Close
,Flush
,String
and so on have canonical signatures and meanings. To avoid confusion, don’t give your method one of those names unless it has the same signature and meaning. Conversely, if your type implements a method with the same meaning as a method on a well-known type, give it the same name and signature; call your string-converter methodString
notToString
.
そのような名前は多くあり、それらの名前とそれらがキャプチャするメソッド名を尊重することは生産的です。Read
, Write
, Close
, Flush
, String
などは正規の署名と意味があります。混乱を避けるため、同じ署名や意味を持たない限り、あなたのメソッドにそれらの名前の一つを与えないようにしてください。反対に、もしあなたのtypeがよく知られるtypeのメソッドと同じ意味を持つメソッドを実装しているならば、そのメソッドに同じ名前と署名を与える必要があります。あなたのstring-converterメソッドをToString
ではなく、String
と呼んでください。
MixedCaps
Finally, the convention in Go is to use
https://golang.org/doc/effective_go#namesMixedCaps
ormixedCaps
rather than underscores to write multiword names.
最後に、Goの慣習では、複数単語から成る名前はアンダースコアで書くよりMixedCaps
やmixedCaps
を利用します。
【自分用】文法/熟語メモ
therefore(それゆえに、そのため、従って)
硬いので口語では使わない。
I think, therefore I am. | 我思う、故に我あり |
He was my friend. Therefore, I persuaded him. | 彼は私の友達なので、彼を説得しました |
be worth ~ing(〜する価値がある)
This movie is well worth watching. | この映画は本当に見る価値がある。 |
The book is worth reading. | その本は読む価値がある。 |
It is worth reading the book. | その本は読む価値がある。 |
There is nothing wrong with ~(〜に全く問題がない)
There is nothing wrong with the plan. | その計画には全く問題がない。 |
neither A nor B(AでもBでもない)
Neither her mother nor her father speaks English. | 彼女の父も母も英語が話せない。 |
Neither interviews nor written examinations will be required. | 面接も筆記試験も要求されません。 |
in practice(実際には)
In practice, we don’t need to follow the procedures as strictly. | 実際には、厳密に手順に従う必要はありません。 |
I will now explain how the method works in practice. | この方法が実際にどのように機能するかについて、今から説明します。 |
put A into B(AをBに入れる、AをBの状態にする、AをBに翻訳する、AをBで表現する)
Put these English words into Japanese. | これら英単語を日本語に直しなさい。 |
You put a lot of work into that project. | あなたはあのプロジェクトにとても力を入れた。 |
a number of ~(たくさんの〜)
unless ~(〜でない限り、〜しない限り)
I’m going to go unless it rains. | 雨が降らなければ行きます。 |
I can’t get the answer unless you give me hint. | ヒントをくれないと答えられない。 |
【自分用】単語メモ
evocative | 喚起する |
brevity | (時の)短さ、簡潔さ |
collision | 衝突 |
noun | 名詞 |
基準的な、標準的な、正規の |
コメント