使用多种方法进行接口 - 可接受或不可接受?

时间:2017-07-30 03:09:42

标签: go idiomatic

接口是否有多少分配给它的功能有什么问题?

我读到的每个地方,理想情况下接口应该只有一个方法(接口应该以之后命名)。但是,对于接口有多种方法,是否有任何陷阱? 实施例

type FooMgrInterface interface {
    CreateFoo(hostname string, fooConfig interface{}) (uuid string, err error)
    DeleteFoo(hostname string, fooID string) (err error)
    CreateBar(hostname string, barID string, barConfig interface{}) (uuid string, err error)
    DeleteBar(hostname string, barID string) (err error)
    AttachBar(hostname string, fooID string, bars []string) (err error)
    DetachBar(hostname string, barID string) (err error)
    GetBars(hostname string) (bars []Bar, err error)
    GetBar(hostname string, barID string) (bar Bar, err error)
    GetFoo(hostname string, fooID string) (foo Foo, err error)
    GetFoos(hostname string) (foos []Foo, err error)
}

如果是这样,上面的接口如何简化或(可能)分成多个接口?

2 个答案:

答案 0 :(得分:6)

它没有任何问题,因为语言支持它就好了。

我相信作者根据经验提供建筑建议。具体来说,如果你的界面有很多方法,你可能在某处有错误的抽象。

您可以问自己一些澄清问题:

  • 这个界面有多少种不同的实现?
  • 其中有多少人会有相同的方法实施?
  • Foos / Bars如何连接到执行器?以某种方式扭转它会更简单吗?例如{{1}}
  • 之类的东西

答案 1 :(得分:2)

https://golang.org/src/io/io.go

中寻找灵感

你会看到:

一个。 “原子”界面:ReaderWriterCloserSeeker

湾组合接口:ReaderWriterReaderWriterSeekerReaderSeekerCloser等。

Golang不会抱怨巨大的界面,而是你和你的同事会对大型单片接口抱怨。

我建议将您的界面划分为4个(可能是2个)接口:FooOpsFoosOpsBarOpsBarsOps,然后从它们定义组合接口。