Heim  >  Artikel  >  Backend-Entwicklung  >  Ist dies ein gültiger Anwendungsfall für Generika?

Ist dies ein gültiger Anwendungsfall für Generika?

PHPz
PHPznach vorne
2024-02-06 08:10:12523Durchsuche

Ist dies ein gültiger Anwendungsfall für Generika?

Frageninhalt

Jetzt habe ich in meinem Code eine Menge sich wiederholender Arbeiten, die so aussehen.

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
}

Mein Problem ist, dass ich jedes Mal, wenn ich einen neuen fp-Typ mit einer anderen Anzahl/einem anderen Typ von Parametern hinzufügen möchte, diese Methode neu definieren muss, sodass ich den Dekorator in meinem Code am Ende 4-5 Mal neu definiere und dies wahrscheinlich tun muss mehr. Ich möchte es durch Decorator ersetzen

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

Und lassen Sie fp den Typ bestätigen. Aber ich bin mir nicht sicher, ob dies Probleme verursacht/ein schlechter Anwendungsfall ist, da ich viel darüber gesehen habe, dass die Schnittstelle nicht verwendet wird/Leistungsprobleme verursacht werden.


Richtige Antwort


Generika helfen aus bestimmten Gründen nicht, insbesondere Generika helfen nur beim Typ, nicht bei der Anzahl der Parameter. Ich persönlich würde dieses Problem anders angehen:

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

Nennen Sie es mit einer Schließung:

var res sometype

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

Auf der Aufrufseite ist es etwas ausführlich, aber es funktioniert absolut für jede Funktionssignatur – jede Anzahl oder Art von Parametern und jede Anzahl oder Art von Rückgabewert. Es funktioniert sogar mit Methodenaufrufen. Es hört sich so an, als würden Sie auf der Grundlage der Ergebnisse eine Logik anwenden, also könnten Sie genauso gut:

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
})

Auch wenn die dekorierte Funktion mehr Rückgabewerte als dieser Bool hat oder wenn Sie eine andere Logik verwenden möchten (z. B. wenn sie einen Fehler zurückgibt, möchten Sie

verwenden). != 转换为 bool),它仍然可以工作。 nil

Das obige ist der detaillierte Inhalt vonIst dies ein gültiger Anwendungsfall für Generika?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen