Maison  >  Article  >  développement back-end  >  Est-ce un cas d'utilisation valable pour les génériques ?

Est-ce un cas d'utilisation valable pour les génériques ?

PHPz
PHPzavant
2024-02-06 08:10:12523parcourir

Est-ce un cas dutilisation valable pour les génériques ?

Contenu de la question

Maintenant dans mon code, j'ai un tas de travaux répétitifs qui ressemblent à ceci.

type fp = func(arg1 string, arg2 int, arg3 []string) bool
func decorator(fp fp, arg1 string, arg2 int, arg3 []string) {
    // do some stuff prior to running fp
    res := fp(arg1, arg2, arg3)
    // do some other stuff depending on res
}

Mon problème est que chaque fois que je veux ajouter un nouveau type fp avec un nombre/type de paramètres différent, je dois redéfinir cette méthode, donc je finis par redéfinir le décorateur 4 à 5 fois dans mon code, et j'ai probablement besoin de le faire. plus. Je veux le remplacer par décorateur

type FP = func(a ...interface{}) bool
func Decorator(fp FP, argDetails interface{}) {
    // do stuff
    res := fp(a)
    // do other stuff
}

Et laissez fp affirmer le type. Mais je ne sais pas si cela pose des problèmes/est un mauvais cas d'utilisation, car j'ai vu beaucoup de choses sur la non-utilisation de l'interface/provoquant des problèmes de performances.


Bonne réponse


Les génériques n'aident pas pour certaines raisons, en particulier les génériques seulement aident avec le type, pas le nombre de paramètres. Personnellement, j'aborderais ce problème d'une manière différente :

func decorator(fp func()) {
    // do stuff
   fp()
    // do other stuff
}

Appelez-le en utilisant une fermeture :

var res sometype

decorator(func() {
    res = originalfunc(arg1, arg2, arg3)
})

C'est un peu verbeux sur le site d'appel, mais cela fonctionne absolument pour n'importe quelle signature de fonction - n'importe quel nombre ou type de paramètres et n'importe quel nombre ou type de valeur de retour. Cela fonctionne même avec les appels de méthode. On dirait que vous faites une certaine logique en fonction des résultats, alors autant :

func Decorator(fp func() bool) {
    // do stuff
   res := fp()
    // do other stuff
}

var res someType

Decorator(func() bool {
    res = originalFunc(arg1, arg2, arg3)
    return res
})

Même si la fonction décorée a plus de valeurs de retour que ce booléen ou si vous souhaitez utiliser une autre logique (par exemple, si elle renvoie une erreur, vous souhaitez utiliser != 转换为 bool),它仍然可以工作。 nil).

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer