Refactoring metoda být součástí rozhraní

0

Otázka

Já jsem bývalý python dev někdy potýká s explicitní povaze Jít. Já se tady snažím, aby refaktorovat kódu, aby bylo možné přesunout metoda, z jedné struktury být součástí rozhraní. Ale ten proces mi přijde divný, rád bych potvrdil, že nedělám něco špatně.

Mám následující rozhraní, struktury a metody:

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 MyExecuter{attribut1: "test"}
}

Takže tady máme obecný rozhraní Spustit, toto rozhraní bude přístupné objekt vrácený GetExecuter metoda.

Nyní, jako součást realizace jednoho z mých Executer, chci se přestěhovat Formát metoda jako součást rozhraní.
Tak jsem dělala následující:

type Formatting interface {
    format() string
}

type Formatter struct {}

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

Tak jsem se vytvořit nové rozhraní, nové prázdné struktury, a aktualizovat své funkce, aby se jako atribut můj předchozí struktury.

I když se to zdá k práci, zdá se mi, že je to trochu spletitý. Speciálně ta část, kde jsem třeba přidat odkaz na můj původní objekt jako atribut metody. Dělám něco špatně, nebo je to správná cesta?

go interface
2021-11-22 20:42:22
1

Nejlepší odpověď

3

Vaše Executer provádění již realizuje Formatting rozhraní:

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

Jedna věc k poznámce: kód ukazuje ukazatel přijímače. To znamená, že metody jsou definovány pro *MyExecuter, ale ne pro MyExecuter. Takže budete muset projít ukazatele na struct instance pro tuto práci. Nebo, jako jsem to udělal já výše, použít hodnotu přijímače tak metody, které jsou definovány pro oba MyExecuter a *MyExecuter.

2021-11-22 20:47:20

V jiných jazycích

Tato stránka je v jiných jazycích

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................