2017-08-25 36 views
0

我一直在做一些最近的编程工作,并试图遵循Effective Go风格指南,有时我发现在命名包和接口和结构时很难避免口吃。避免在包和结构名称中出现口吃的方法?

作为一个例子。
我可能有一个控制台包包含控制台接口控制台结构和新功能的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型无处不在。

当我在一个封装中的两个或更多的结构我最终之类的东西 con := console.NewConsole()

我不介意大大多扁平封装结构,但我不喜欢井然有序尽可能我的代码。我对IO.Reader和IO.Writer的想法没问题,但是当包与事物相同但仍需要分离时该怎么办。 (是的,我知道,给定的例子可能是Console.Writer但让我们假装它完全不同的东西)

所以我的问题是: 这是口吃效果的东西我甚至应该担心? (即它是不好的形式?) 有没有人有避免它的任何提示?

+2

你可以考虑将'Interface'命名为''sort.Interface'](https://golang.org/pkg/sort/#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

我的经验是,除非你只想在一个包中使用一个结构,否则当你使用一个通用设计的模型时,这是不方便的。

另外一个风险是拥有很多软件包是循环导入,因为很多时候结构都是指对方。当你只允许一个包中包含一个结构时,你会限制自己。顺便说一句,你有这样的代码:func New()* Console 在哪个控制台是一个接口的结构控制台。你为什么不从你的构造函数中返回* console,因为这就是它所传递的,我的想法是func New()* console更好。