Golang 中“在使用时定义接口”原则的问题

问题描述 投票:0回答:1

我很困惑如何在这种情况下遵循这条规则。 例如,我有一些带有 Criteria 的包,它使用某种访问者

type Visitor interface {
    VisitID(int64)
    VisitLocation(lat, lon float64)
}

type CriteriaIdentity int64

func (c CriteriaIdentity) Apply(v Visitor) {
    v.VisitID(int64(c))
}

type CriteriaLocation struct {
   lat float64
   lon float64
}

func (c *CriteriaIdentity) Apply(v Visitor) {
    v.VisitLocation(c.lat, c.lon)
}

然后,我想在一些包中定义一个

criteria
接口
search

type SearchCriteria interface {
     Apply(???) // What can I hint here?
}

type User struct {
    engine searchEngine
}

func (u *User) Search(ctx context.Context, criterias ...SearchCriteria) ([]int64, error) {
}

并在其他包中使用我的搜索器

landing

type Searcher interface {
    Search(ctx context.Context, criterias ...???) // Same question
}

如何以不违反规则的方式为

SearchCriteria
和`Se定义提示?

go design-patterns interface
1个回答
0
投票

我对golang没有什么特别的了解,只是单纯从模块化和依赖倒置原则的角度,有两个考虑

  1. 接口通常属于使用接口类型值的包。
  2. 接口不属于具有这些值的实现的包。

这显然意味着接口的客户端(用户)永远不会与该接口的实现位于同一个包中。目标是使客户端与实现细节的所有知识(包括包名称、传递依赖性等)分离。我们实际上可以仅使用上面的第二点来实现该目标。第一个更方便。

当一个接口只有一个客户端时,将它放在客户端的包中是合乎逻辑的(根据 代码审查评论),因为该单个客户端是唯一需要合约知识的高级类。

当一个接口有多个客户端(在不同的包中)时,则不能应用第一个点;但是我们可以通过将接口放在它自己的包中来实现模块化的总体目标,与它的实现它的客户分开。

© www.soinside.com 2019 - 2024. All rights reserved.