我如何使用接口重构此代码,如果是这样,我应该这样做吗?

How do I refactor this code with Interfaces, and if so, should I?

我正在编写一个使用来自不同服务的 API 的软件,方法相同但执行方式不同。我想知道代码是否可以在接口中组织,或者我只是继续这样工作:

type endPoint struct{
    serverName string
}

func (this *endPoint) getLastDateURL () string{
    if this.Name ="A"{
        return "api.someAWebsite.com/getLastDate"
    }
    if this.Name ="B"{
        return "api.someBWebsite.com/getLastDate"
    }
    return ""
}

func (this *endPoint) processData () output{
    if this.Name ="A"{
        //process in some way
        return
    }
    if this.Name ="B"{
                //process in some different way
                return
    }
    return
}

我正在考虑的界面替代方案是这样的:

struct endPoint interface{
    getLastDateURL()
    processData()
}

...
Do each method for each API provider
How would I use it then?

我的最终目标是拥有可维护和干净的代码。老实说我讨厌这样一个事实,即我必须为每个端点编写相同的方法来实现接口,但也许我还没有那么清楚的接口概念,或者在这种情况下再次使用接口几乎没有优势,可维护和干净代码的最终目标。

谢谢。

使用 double dispatch pattern:

在 endPoint 上为其支持的每个 class 定义类型化函数。

定义一个接口,该接口具有接受端点对象的函数。

让想要使用 endPoint 的所有 class 实现该接口的函数并将它们自己传递给类型化的 endPoint 方法。

要调用它,调用传递 endPoint 的接口方法。

恕我直言,你应该这样做。

// "struct endPoint interface" is invalid, and signatures are missing their return types:
type endPoint interface{
    getLastDateURL() string
    processData() output
}

How would I use it then?

我无法给出完整的解决方案,因为您还没有展示您是如何使用当前代码的,但通常您会:

  • 实例化一个实现的东西——在当前实现中设置 Name 的任何东西都会创建一个实现 endPoint
  • 的具体类型的实例
  • 调用 getLastDateURL and/or processData 的东西 - 而不是接收 *endPoint struct,它会接收 endPoint 接口值,然后就不会关心底层实现是什么;它只会调用方法,就像今天一样

My end goal is to have maintainable and clean code.

这可能是实现该目标的好方法,但这取决于问题中未显示的上下文。

Honestly hate the fact that I'd have to write the same methods for each end point to implement the interface

已经为每个端点编写一个实现,您只是用相同的方法编写它们。您必须编写的代码量几乎相同,但生成的代码更清晰、更有条理——例如,每个具体实现都可以在其自己的文件中,而不必全部使用相同的方法。使用 many/complex 个提供商,如果您需要更改它或添加一个提供商,您当前的解决方案将变得越来越难以导航。