Nu "Accepta Interfețe" rupe dezaprobare scule?

0

Problema

Dezaprobare

Acceptate mod de marcare funcții ca învechită este ceva de genul:

type MyStruct struct {
}

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

Modern Idele va evidenția orice utilizări de această funcție și linters s-ar putea ridica, de asemenea, avertismente (nu am verificat personal acest lucru)

Showing the IDE highlight

Accepta interfețe. Reveni structs.

O populare mai bune practici este "Accept interfețe. Reveni struct." - care tinde să încurajeze design SOLID în software-ul.

Cu toate acestea, codul de mai jos - care urmează cele mai bune practici - ascunde dezaprobare de avertizare:


// 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

Întrebare

Există o soluție la această problemă?

Dacă aș fi fost, de exemplu, o bibliotecă de întreținere: cum mă pot asigura că-mi dezaprobare avertismente sunt văzute de utilizatori de bibliotecă, care sunt, de asemenea, următoarele cele mai bune practici și definirea propriilor dependență interfețe.

1

Cel mai bun răspuns

3

Asta pare logic din moment ce metoda de interfața nu a fost depreciat. Adăugarea Deprecated: linie de interfață de funcție ar putea ajuta în acest caz (nu am testat, deoarece VSCode nu face încă acest lucru).

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

În acest caz, pentru că interfața are doar 1 funcție ar trebui să depreciat totul. Ceea ce știu este susținută de godoc/pkg.du-te.dev, ia Queryer de exemplu.

// 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

Unul dintre principalele aspecte ale întrebare, cu toate acestea, este "ca o bibliotecă de întreținere, cum pot asigura mea dezaprobare notificare este văzut de către utilizatorii finali?" Biblioteca de întreținere are nici un control asupra utilizatorului interfață de definiții, astfel încât acestea nu pot ajunge în și se adaugă dezaprobare avertismente acolo.
Brad Johnson

Se pare ciudat că o bibliotecă oferă o struct și oferă utilizatorului o interfață care struct de biblioteca pune în aplicare. Dacă acesta este un scenariu sunteți îngrijorat, ar fi mai inteligent pentru a condamna toată struct, care ar trebui să ar trebui să cauzeze v = MyStruct{} pentru a deveni afectate prin
caveman

"Se pare ciudat că o bibliotecă oferă o struct și oferă utilizatorului o interfață..." - nu asta interfața segregarea principiu încurajează?
Brad Johnson

În măsura în care știu, interfața-segregare, în principiu, este vorba de rupere mare interfețe în mai mică interfeaces, la fel ca "Cea mai mare interfata, mai slab de abstractizare." du-te proverb. Cred că dependența de inversiune principiu este mai mult în joc aici. De obicei doriți să utilizați interfețe, ca parametri, astfel încât punerea în aplicare efectivă poate fi schimbat. Deci, este logic pentru a defini o interfață într-un pachet și să-l utilizați ca date de intrare. Dar eu nu cunosc nici un caz de utilizare comună în cazul în care utilizatorul de un pachet care definește o interfață care biblioteca struct implicit pune în aplicare.
caveman

În alte limbi

Această pagină este în alte limbi

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