Non "Accettare" Interfacce di interruzione di un periodo di ammortamento di utensileria?

0

Domanda

Deprecazione

Il modo di marcatura funzioni deprecate è qualcosa di simile a questo:

type MyStruct struct {
}

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

Moderni Ide evidenziare eventuali usi di questa funzione e linters potrebbe anche raccogliere le segnalazioni (non ho controllato questo)

Showing the IDE highlight

Accettare le interfacce. Ritorno strutture.

Un famoso esempio di buona pratica è "Accettare le interfacce. Ritorno strutture." - che tende ad incoraggiare SOLIDO di progettazione del software.

Tuttavia, il seguente codice che segue questa buona pratica nasconde l'apposito messaggio di avviso:


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

Domanda

C'è una soluzione a questo problema?

Se fossi, per esempio, una biblioteca responsabile: come posso verificare che la mia disapprovazione avvisi sono visibili da tutti gli utenti della biblioteca che stanno seguendo le migliori pratiche e la definizione di una propria dipendenza interfacce.

1

Migliore risposta

3

Che sembra logico, dal momento che il metodo dell'interfaccia non è stato deprecato. Aggiunta la Deprecated: linea per la funzione di interfaccia potrebbe aiutare in questo caso (non si prova, dal momento che VSCode non farlo ancora).

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

In questo caso, dato che l'interfaccia ha solo 1 funzione si dovrebbe deprecato il tutto. Lo so che è supportato da godoc/pkg.andare.dev, prendere Queryer per esempio.

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

Uno dei principali aspetti della questione, tuttavia, è "come una biblioteca manutentore, come posso garantire la mia disapprovazione avviso è visto dagli utenti finali?" La biblioteca manutentore non ha alcun controllo sul definizioni di interfaccia, in modo che non può raggiungere e aggiungere un periodo di ammortamento di avvertimenti.
Brad Johnson

Sembra strano anche a me che una libreria fornisce una struttura e l'utente fornisce un'interfaccia che la struttura della libreria implementa. Se questo scenario si sono preoccupati, sarebbe più intelligente per deprecare la tua intera struttura, che dovrebbe dovrebbe causare l' v = MyStruct{} per diventare estenuati
caveman

"Non mi sembra strano che una libreria fornisce una struttura e l'utente fornisce un'interfaccia..." non È quello l'interfaccia di segregazione principio incoraggia?
Brad Johnson

Per quanto ne so, l'interfaccia di segregazione principio è su breaking grande interfacce in piccoli interfeaces, come il "più grande è l'interfaccia, il più debole, l'astrazione." vai proverbio. Penso che la dipendenza inversione di principio è più in gioco. In genere si desidera utilizzare interfacce come parametri in modo da consentire l'effettiva attuazione può essere sostituita. Quindi è logico per definire un'interfaccia in un pacchetto e utilizzare come input. Ma io non sono a conoscenza di alcun caso di uso comune, in cui l'utente di un pacchetto definisce un'interfaccia che la biblioteca struct implicitamente implementa.
caveman

In altre lingue

Questa pagina è in altre lingue

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