2017-08-25 5 views
0

私はちょっと遅れてプログラミングを行っていましたが、Effective Goスタイルのガイドラインに従おうとしていましたが、パッケージやインターフェイス、構造体に名前を付けるときに吃音を避けるのが難しいことがあります。goパッケージとstruct名に吃音を避ける方法はありますか?

例として、
は私がコンソールインタフェースにコンソール構造体や新機能を含むConsole.goファイルとコンソールパッケージを持っているかもしれません。

//console/Console.go 
package console 

type Console interface { 
    Print(s String) 
} 

type console struct { 
    .... 
} 

func (c *console) Print(s String){ 
    .... 
} 

func New() Console{ 
    return &console{} 
} 

今、私はこのどこかを使用するとき、私はどこにでもconsole.Consoleタイプを使用して終了。私はパッケージに2つの以上の構造体を持っている場合

は、私は大きなほとんどフラットパッケージ構造を持つ気にしない con := console.NewConsole()

のようなものを終わるが、私は可能な限り整理自分のコードを維持したいです。私はIO.ReaderとIO.Writerのアイデアは大丈夫​​ですが、パッケージが同じものだがまだ分離する必要がある場合は何をするべきか。 は(はい、私は与えられた例はConsole.Writerことができることを認識していますが、完全に異なるその何かをふります)

だから私の質問は以下のとおりです。 このスタッター効果は私も心配すべきものですか? (すなわち、それは悪い形ですか?) 誰もそれを避けるためのヒントはありますか?

+2

['sort.Interface'](https://golang.org/pkg/sort/#Interface)のように' Interface'という名前を付けて考えることができます。しかし、私は@Adrianに同意します。そして、コンストラクタが 'New'であり、' NewConsole'でないなら、あなたは大丈夫です –

答えて

5

吃音タイプの名前は一般的に問題ありません。fooはタイプFooの定義専用ですので、珍しいことではありません。foo.Fooです。絶対に間違っていることはありません。

あなたが避けたいのはです。吃音です。単純にfoo.Newが十分に正確な場合は、foo.NewFooのようになります。foo.FooBarfoo.FooBazの場合、foo.Barfoo.Bazの場合も同様です。

標準ライブラリのhtml/templateは、タイプ(template.Template)とコンストラクタ(template.New)を定義しているとします。

+0

ありがとう、私はこれをやめようと思っています。 –

0

私の経験では、パッケージ内に1つの構造体だけが必要な場合を除いて、New()から離れることはありません。

非常に多くの場合、構造体が互いに参照するため、多くのパッケージを持つ危険性があります。パッケージ内に1つの構造体しか許されていないときは、自分自身を非常に制限します。

ところで、あなたはこのコードを持っています:func New()* Console ここで、Consoleはstructコンソールへのインターフェイスです。とにかくあなたがコンストラクタから* consoleを返さないのはなぜですか。私の考えはfunc New()* consoleが優れているということです。

関連する問題