Znamená "Přijmout Rozhraní" prolomit odmítání nástrojů?

0

Otázka

Odmítání

Podporované způsob označování funguje jako zastaralé, je něco jako toto:

type MyStruct struct {
}

// MyFunc returns hello
// Deprecated: Use YourFunc
func (m MyStruct) MyFunc() string {
  return "hello"
}

Moderní IDEs bude upozorňovat na jakékoliv použití této funkce a lintry může také zvýšit varování (nemám osobně zkontrolováno)

Showing the IDE highlight

Přijmout rozhraní. Návrat structs.

Populární nejlepší praxe je "Přijmout rozhraní. Návrat structs." - která má tendenci podporovat SOLIDNÍ design v softwaru.

Nicméně, následující kód, který následuje toto nejlepší praxe - skrývá odmítání varování:


// MyInterface specifies a single function that we require from a dependency
type MyInterface interface {
    MyFunc() string
}

func main() {

    var v MyInterface
    v = MyStruct{}
    v.MyFunc()

}

Showing the lack of IDE highlighting

Otázka

Existuje řešení tohoto problému?

Kdybych byl, například, knihovna udržovatel: jak mohu zajistit, že moje odmítání varování jsou vidět uživatelé knihovny, kteří jsou také následující nejlepší postupy a definování jejich vlastní závislost na rozhraní.

1

Nejlepší odpověď

3

Zdá se to logické, protože metoda rozhraní nebylo zastaralé. Přidání Deprecated: linka do rozhraní funkce může pomoci v tomto případě (netestovali, protože VSCode to nedělá zatím).

// MyInterface specifies a single function that we require from a dependency
type MyInterface interface {
    // Deprecated: use YourFunc
    MyFunc() string
}

V tomto případě, protože rozhraní má pouze 1 funkci, kterou by měla zastaralé celou věc. Což vím, že je podporován godoc/pkg.jít.dev, vzít Queryer například.

// MyInterface specifies a single function that we require from a dependency
// Deprecated: use YourInterface
type MyInterface interface {
    MyFunc() string
}
2021-11-22 21:18:36

Jedním z hlavních aspektů otázku, nicméně, je "jako knihovna správce, jak lze zajistit, odmítání oznámení je vidět koncoví uživatelé?" Knihovna správce nemá žádnou kontrolu nad uživatelské rozhraní, definice, takže se nemohou dostat dovnitř a přidat odmítání varování.
Brad Johnson

Zdá se mi to divné, že knihovna poskytuje struct a uživateli poskytuje rozhraní, které struct knihovna implementuje. Pokud jde o scénář se obáváte, že by bylo chytřejší, abych odsuzoval celý struct, což by mělo způsobit v = MyStruct{} stát zasažený prostřednictvím
caveman

"Zdá se mi divné, že knihovna poskytuje struct a uživateli poskytuje rozhraní..." není to to, co rozhraní segregace zásadě podporuje?
Brad Johnson

Pokud vím, rozhraní-princip segregace je o rozbití velké rozhraní na menší interfeaces, stejně jako "větší rozhraní, slabší abstrakce." jít přísloví. Myslím, že závislost na principu inverze je více ve hře. Obvykle budete chtít použít rozhraní jako parametry, takže skutečná realizace může být vyměněn ven. Takže je logické, definovat rozhraní v obalu a použít ho jako vstup. Ale já nevím o žádné běžné použití případě, kdy uživatel balíček definuje rozhraní, které knihovna struct implicitně provádí.
caveman

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ý
..................................................................................................................