Não Aceitam as Interfaces de" quebra de depreciação de ferramentas?

0

Pergunta

Substituição

A forma com suporte de marcação funciona como preterido é algo como isto:

type MyStruct struct {
}

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

IDEs modernos vai destacar quaisquer usos para esta função e "linters" também pode aumentar avisos (eu não tenha verificado pessoalmente a este)

Showing the IDE highlight

Aceitar interfaces. Voltar estruturas.

Um popular melhor prática é "Aceitar interfaces. Voltar estruturas." - o que tende a incentivar SÓLIDO design de software.

No entanto, o código a seguir - que segue esta melhor prática - esconde a substituição de aviso:


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

Pergunta

Existe uma solução para este problema?

Se eu fosse, por exemplo, uma biblioteca de mantenedor: como posso garantir que a minha substituição avisos são vistos pelos usuários da biblioteca, que também estão seguindo as melhores práticas e a definição de seus próprios dependência de interfaces.

1

Melhor resposta

3

Isso parece lógico, uma vez que o método que a interface não foi preterida. Adicionar a Deprecated: linha para a função de interface pode ajudar neste caso (não teste, desde VSCode não fazer isso ainda).

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

Neste caso, uma vez que a interface tem apenas 1 função deve preterido a coisa toda. O que eu sei é suportado por godoc/pkg.ir.dev, tomar Queryer por exemplo.

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

Uma das principais facetas da questão, no entanto, é "como uma biblioteca mantenedor, como posso garantir o meu aviso de substituição é visto pelos usuários finais?" A biblioteca mantenedor não tem nenhum controle sobre a interface do utilizador definições, para que eles não possam alcançar e adicionar substituição avisos de lá.
Brad Johnson

Parece estranho para mim que uma biblioteca fornece uma estrutura e o usuário fornece uma interface que a estrutura da biblioteca implementa. Se este é um cenário que você está preocupado, seria mais inteligente deixaram de usar toda a sua estrutura, o que deve causar o v = MyStruct{} para tornar-se rachou
caveman

"Parece estranho para mim que uma biblioteca fornece uma estrutura e o usuário fornece uma interface..." isso não É o que a interface segregação princípio incentiva?
Brad Johnson

Até onde eu sei, a interface de segregação princípio é sobre quebrar grandes interfaces em menor interfeaces, muito parecido com o "maior é A interface, mais fraca é a abstração." vá provérbio. Eu acho que a dependência inversão de princípio é mais em jogo aqui. Normalmente você deseja usar interfaces como parâmetros para a implementação real pode ser trocada. Por isso, é lógico para definir uma interface em um pacote e usá-lo como entrada. Mas eu não sei de nenhum caso de uso comum, onde o usuário de um pacote define uma interface que a biblioteca de estrutura que implementa implicitamente.
caveman

Em outros idiomas

Esta página está em outros idiomas

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