Monkey Patching in Go
Dalam bahasa pengaturcaraan Go, mengejek boleh mencabar apabila berurusan dengan kod yang tidak berstruktur di sekitar antara muka. Apabila struct saling berhubung secara langsung dan suntikan kebergantungan tidak hadir, ia menghalang keupayaan untuk menguji dan menanda aras secara berkesan tanpa mengubah suai kod asas.
Satu teknik yang mungkin terlintas di fikiran daripada bahasa skrip seperti Python ialah tampalan monyet, di mana objek boleh diubah suai semasa runtime. Walaupun Go tidak mempunyai mekanisme yang setara untuk pengubahsuaian objek langsung, terdapat pendekatan alternatif untuk mencapai hasil yang serupa.
Satu strategi biasa ialah mencipta antara muka anda sendiri sebagai pembalut di sekeliling struktur yang anda ingin ejek. Ini membolehkan anda melaksanakan tingkah laku yang diingini dalam kaedah antara muka, sambil mengekalkan fungsi asal dalam struct asas. Contohnya:
type MyInterface interface { DoSomething(i int) error DoSomethingElse() ([]int, error) } type Concrete struct { client *somepackage.Client } func (c *Concrete) DoSomething(i int) error { return c.client.DoSomething(i) } func (c *Concrete) DoSomethingElse() ([]int, error) { return c.client.DoSomethingElse() }
Dengan melaksanakan MyInterface, anda kini boleh membuat pelaksanaan olok-olok untuk ujian anda:
// MockMyInterface implements MyInterface for testing purposes type MockMyInterface struct { mockedDoSomethingError error mockedDoSomethingElseResult []int } func (m *MockMyInterface) DoSomething(i int) error { return m.mockedDoSomethingError } func (m *MockMyInterface) DoSomethingElse() ([]int, error) { return m.mockedDoSomethingElseResult, nil }
Pendekatan lain, yang dicadangkan oleh @elithrar dalam ulasan, ialah membenamkan taip yang anda ingin ejek dalam struct anda sendiri. Ini membolehkan anda mengejek kaedah yang memerlukannya secara selektif:
type Concrete struct { *somepackage.Client }
Dengan membenamkan Klien, anda boleh terus memanggil kaedah seperti DoSomethingNotNeedingMocking tanpa menambahkannya pada antara muka atau mencipta olok-olok untuk mereka.
Teknik ini menyediakan alternatif yang berdaya maju kepada tampalan monyet untuk ujian dan kod penanda aras yang tidak berstruktur di sekeliling antara muka.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mencapai Kesan Tampalan Monyet dalam Go untuk Ujian dan Penandaarasan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!