¿"Aceptar Interfaces de" romper la desaprobación de utillaje?

0

Pregunta

En desuso

El apoyó la forma de marcar las funciones como obsoleto es algo como esto:

type MyStruct struct {
}

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

Moderno de los IDEs resaltar los usos de esta función y de pelusa también podría aumentar las advertencias (no he comprobado personalmente este)

Showing the IDE highlight

Aceptar las interfaces. Volver estructuras.

Un popular mejor práctica es "Aceptar interfaces. Volver estructuras." - que tiende a fomentar SÓLIDO diseño en el software.

Sin embargo, el siguiente código que sigue las mejores prácticas - oculta el mismo mensaje de advertencia:


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

Pregunta

Hay una solución a este problema?

Si yo fuera, por ejemplo, una biblioteca mantenedor: ¿cómo puedo asegurarme de que mi desaprobación advertencias son vistos por los usuarios de la biblioteca que también están siguiendo las mejores prácticas y la definición de su propia dependencia de las interfaces.

1

Mejor respuesta

3

Lo que parece lógico, ya que el método de la interfaz no ha sido desaprobado. La adición de la Deprecated: línea para la función de interfaz podría ayudar en este caso (no de prueba, ya que VSCode no hacer esto todavía).

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

En este caso, ya que la interfaz sólo tiene 1 función debe obsoleto toda la cosa. Que sé que es apoyado por godoc/pkg.vaya.dev, tomar Queryer por ejemplo.

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

Una de las facetas básicas de la cuestión, sin embargo, es "como una biblioteca de mantenedor, ¿cómo puedo asegurarme de que mi desaprobación aviso es visto por los usuarios finales?" La biblioteca mantenedor no tiene ningún control sobre la interfaz de usuario definiciones, por lo que no puede alcanzar y añadir la desaprobación advertencias de allí.
Brad Johnson

Parece extraño para mí que una biblioteca proporciona una estructura y el usuario proporciona una interfaz que la estructura de la biblioteca implementa. Si esta es una situación que preocupa, sería más inteligente para desaprobar toda su estructura, lo que debería provocar la v = MyStruct{} para ser afectadas a través de
caveman

"No me parece extraño que una biblioteca proporciona una estructura y el usuario proporciona una interfaz de..." Es que no es lo que la interfaz del principio de separación anima?
Brad Johnson

Hasta donde yo sé, la interfaz de la segregación principio se trata de romper con grandes interfaces en pequeñas interfeaces, tanto como "el más grande de la interfaz, el más débil es el de la abstracción." ir proverbio. Creo que el principio de inversión de dependencia es más en juego aquí. Normalmente, desea utilizar interfaces como parámetros para la implementación real puede ser intercambiado. Por lo que es lógico para definir una interfaz en un paquete y utilizar como entrada. Pero yo no sé de ningún caso de uso habitual en el que el usuario de un paquete define una interfaz que la biblioteca struct implícitamente implementa.
caveman

En otros idiomas

Esta página está en otros idiomas

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