为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
婷婷同学_ 2022-08-09 20:42:40
我正在编写一个软件,该软件使用来自不同服务的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 providerHow would I use it then?我的最终目标是拥有可维护且干净的代码。老实说,我讨厌这样一个事实,即我必须为每个端点编写相同的方法来实现接口,但也许我还没有那么清楚的接口概念,或者在这种情况下使用接口几乎没有优势,再次,可维护和干净的代码的最终目标。
查看完整描述

2 回答

?
湖上湖

TA贡献2003条经验 获得超2个赞

// "struct endPoint interface" is invalid, and signatures are missing their return types:

type endPoint interface{

    getLastDateURL() string

    processData() output

}

那我该如何使用它呢?


我无法给出一个完整的解决方案,因为你还没有展示你如何使用你目前的代码,但总的来说你会有:


实例化实现的东西 - 无论在当前实现中设置什么,都会创建一个具体类型实现的实例。NameendPoint

调用和/或的东西 - 而不是接收结构,它将接收接口值,然后不会关心底层实现是什么;它只会调用方法,就像今天一样getLastDateURLprocessData*endPointendPoint

我的最终目标是拥有可维护且干净的代码。


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


老实说,讨厌这样一个事实,即我必须为每个端点编写相同的方法来实现接口


您已经为每个端点编写了一个实现,只是将它们全部用相同的方法编写。你必须编写的代码量几乎是相同的,但生成的代码更干净,更有条理 - 例如,每个具体的实现都可以在自己的文件中,而不必全部使用相同的方法。对于许多/复杂的提供商,如果您需要更改当前解决方案或添加提供商,则导航起来变得越来越困难。


查看完整回答
反对 回复 2022-08-09
?
元芳怎么了

TA贡献1798条经验 获得超7个赞

使用双重调度模式

在端点上为其支持的每个类定义一个类型化 func。

定义一个接口,该接口具有接受终结点对象的 func。

让所有想要使用 endPoint 的类实现该接口的 func,并将自身传递给类型化的 endPoint 方法。

若要调用它,请调用传递终结点的接口方法。

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


查看完整回答
反对 回复 2022-08-09
  • 2 回答
  • 0 关注
  • 116 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信