Czy nie łamie "Odbiór interfejsów" narzędzia starzenia?

0

Pytanie

Potępienie

Obsługiwany sposób oznaczania funkcji jak przestarzałych wygląda mniej więcej tak:

type MyStruct struct {
}

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

Nowoczesne IDE będą wydzielać korzystanie z tej funkcji, a линтеры również mogą powodować ostrzeżenia (osobiście nie testowałem tego).

Showing the IDE highlight

Bierz interfejsy. Zwracane struktury.

Popularne najlepsze praktyki - "Brać interfejsy. Zwracane struktury". - co, jak zwykle zachęca SOLIDNY projekt w oprogramowaniu.

Jednak poniższy kod, który należy w tym najlepszych praktyk, ukrywa ostrzeżenie o terminie ważności:


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

Pytanie

Czy istnieje rozwiązanie tego problemu?

Gdybym był, na przykład, opiekunem biblioteki: jak mogę zagwarantować, że moje ostrzeżenia o nadchodzącym terminie zmiany będą widoczne dla użytkowników biblioteki, które także dążą wytycznych i określają swoje własne interfejsy zależności.

1

Najlepsza odpowiedź

3

To wydaje się logiczne, ponieważ metoda interfejsu nie był przestarzały. Dodawanie Deprecated: ciąg funkcji interfejsu może pomóc w tym przypadku (nie testowałem, tak jak VSCode jeszcze tego nie robi).

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

W tym przypadku, ponieważ interfejs ma tylko 1 funkcję, należy zrezygnować z tego wszystkiego. Który, jak wiem, jest obsługiwany godoc/pkg.go.dev, weźmy, na przykład, Queryer.

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

Jednak jednym z najważniejszych aspektów jest w następujący sposób: "Jako opiekun biblioteki, jak mogę zagwarantować, że moje zawiadomienie o terminie ważności zostaną zauważone przez użytkowników końcowych?" Opiekun biblioteki nie kontroluje ustalenia interfejsu użytkownika, więc nie może zalogować się i dodać tam ostrzeżenia o terminie ważności.
Brad Johnson

Wydaje mi się dziwne, że biblioteka udostępnia strukturę, a użytkownik zapewnia interfejs, który realizuje struktura biblioteki. Jeśli jest to scenariusz, o którym martwisz się, byłoby rozsądniej zrezygnować z całej twojej struktury, co powinno prowadzić do v = MyStruct{} aby zostać trafionym przez
caveman

"Wydaje mi się dziwne, że biblioteka udostępnia strukturę, a użytkownik udostępnia interfejs..." Czy to nie zachęca zasada podziału interfejsów?
Brad Johnson

O ile wiem, zasada podziału interfejsów jest podział dużych interfejsów na mniejsze межпространства, podobnie, jak "Im więcej interfejs, tym słabsze abstrakcja". idź пословицей. Myślę, że tutaj już obowiązuje zasada odwracania zależności. Zwykle chcesz korzystać z interfejsów jako opcji, aby można było zastąpić rzeczywistą realizację. Więc logiczne jest określić interfejs w pakiecie i używać go jako danych wejściowych. Ale ja nie znam ani jednego popularnego zastosowania, gdy użytkownik pakietu określa interfejs, który pośrednio realizuje struktura biblioteki.
caveman

W innych językach

Ta strona jest w innych językach

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