Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Adakah ini kes penggunaan yang sah untuk generik?

Adakah ini kes penggunaan yang sah untuk generik?

PHPz
PHPzke hadapan
2024-02-06 08:10:12523semak imbas

Adakah ini kes penggunaan yang sah untuk generik?

Kandungan soalan

Kini dalam kod saya, saya mempunyai sekumpulan kerja berulang yang kelihatan seperti ini.

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
}

Masalah saya ialah setiap kali saya ingin menambah jenis fp baharu dengan nombor/jenis parameter yang berbeza, saya perlu mentakrifkan semula kaedah ini, jadi saya akhirnya mentakrifkan semula penghias 4-5 kali dalam kod saya, dan mungkin perlu Do lebih. Saya mahu menggantikannya dengan penghias

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

Dan biarkan fp menegaskan jenisnya. Tetapi saya tidak pasti sama ada ini menyebabkan masalah/adalah kes penggunaan yang buruk kerana saya telah banyak melihat tentang tidak menggunakan antara muka/menyebabkan masalah prestasi.


Jawapan betul


Generik tidak membantu atas sebab tertentu, terutamanya generik sahaja membantu dengan jenis, bukan nombor parameter. Secara peribadi, saya akan mendekati masalah ini dengan cara yang berbeza:

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

Panggilnya menggunakan penutupan:

var res sometype

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

Ia agak bertele-tele di tapak panggilan, tetapi ia berfungsi sepenuhnya untuk sebarang tandatangan fungsi - sebarang nombor atau jenis parameter dan sebarang nombor atau jenis nilai pulangan. Ia juga berfungsi dengan panggilan kaedah. Nampaknya anda mungkin melakukan beberapa logik berdasarkan keputusan, jadi anda juga mungkin:

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

Walaupun fungsi yang dihias mempunyai lebih banyak nilai pulangan daripada bool itu atau jika anda ingin menggunakan logik lain (contohnya, jika ia mengembalikan ralat, anda mahu menggunakan != 转换为 bool),它仍然可以工作。 nil).

Atas ialah kandungan terperinci Adakah ini kes penggunaan yang sah untuk generik?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam