将方法重构为接口的一部分

Posted

技术标签:

【中文标题】将方法重构为接口的一部分【英文标题】:Refactoring method to be part of an interface 【发布时间】:2022-01-01 10:18:47 【问题描述】:

我是一名前 Python 开发人员,有时会为 Go 的显式性质而苦苦挣扎。 我在这里尝试重构一些代码,以便能够将方法从一个结构移动到接口的一部分。 但是这个过程对我来说似乎很奇怪,我想确认我没有做错什么。

我有以下接口、结构和方法:

type Executing interface 
    Execute()


type MyExecuter struct 
     attribut1 string


//The function I wish to move
func (exe1 *MyExecuter) format() string 
    return fmt.sprintf ("formated : %s", exe1.attribut1) 



func (exe1 *MyExecuter) Execute() 
    //Executing
    fmt.Println(exe.format())




func GetExecuter () Executer
    return MyExecuterattribut1: "test"


所以这里我有一个通用接口Execute,这个接口会被GetExecuter方法返回的对象访问。

现在,作为我的 Executer 实现的一部分,我想将 Format 方法作为接口的一部分移动。 所以我正在做以下事情:

type Formatting interface 
    format() string


type Formatter struct 

func (formatter *Formatter) format(exe1 *MyExecuter) (string) 
    return fmt.sprintf ("formated : %s", exe1.attribut1)


所以我创建了一个新接口,一个新的空结构,并更新了我的函数以将我以前的结构作为属性。

虽然这似乎可行,但在我看来这有点令人费解。特别是我需要添加对初始对象的引用作为方法属性的部分。我在这里做错了什么,还是这是正确的方法?

【问题讨论】:

【参考方案1】:

您的Executer 实现已经实现了Formatting 接口:

type Executing interface 
    Execute()


type Formatting interface 
    format() string


func (exe1 MyExecuter) format() string 
    return fmt.sprintf ("formated : %s", exe1.attribut1) 



func (exe1 MyExecuter) Execute() 
    //Executing
    fmt.Println(exe.format())


v:=MyExecuter
// Here, v implements Executing and Formatting interfaces

这里需要注意一点:您的代码显示了指针接收器。这意味着这些方法是为*MyExecuter 定义的,但不是为MyExecuter 定义的。因此,您必须将指针传递给结构实例才能使其工作。或者,就像我在上面所做的那样,使用值接收器,以便为 MyExecuter*MyExecuter 定义方法。

【讨论】:

以上是关于将方法重构为接口的一部分的主要内容,如果未能解决你的问题,请参考以下文章

在将大型类重构为较小的类之前,您是否查看了方法使用的变量? [关闭]

需要帮助将类重构为单独的头文件和 cpp 文件

重构改善既有代码

重构应用程序委托

TS编程——面向对象随手录——接口_命名空间——重构javaScrip 3D引擎代码部分——函数

为了重构庞大的代码库,我应该记住啥?