Rumah > Peranti teknologi > AI > GPT-4 ialah pakar pengaturcaraan, saya benar-benar yakin!

GPT-4 ialah pakar pengaturcaraan, saya benar-benar yakin!

王林
Lepaskan: 2023-04-29 17:28:07
ke hadapan
2251 orang telah melayarinya

​Minggu lepas saya menghantar pengenalan kepada GPT-4 mengajar matematik Ramai orang terkejut dan merasakan ia boleh mencetuskan revolusi dalam industri pendidikan.

Bagaimanakah prestasinya dalam bidang pengaturcaraan? Jangan bercakap tentang sama ada ia boleh menggantikan pengaturcara Ini masih memerlukan lebih banyak ujian dan maklum balas, saya ingin mencuba dahulu sama ada ia boleh mengajar pengaturcaraan seperti matematik.

Saya menemui konsep yang sukar difahami dalam pengaturcaraan Java: proksi dinamik dan mengujinya.

Di bawah ialah perbualan lengkap yang saya ada dengannya, di mana saya berpura-pura sebagai orang baru yang mempelajari pengaturcaraan Java dan tidak mengetahui corak proksi untuk melihat bagaimana ia mengajar saya.

Kandungannya agak panjang adalah disyorkan untuk membacanya dengan sabar dan merasai keupayaan AI.

Jika anda benar-benar tidak tahan, anda boleh melangkau ke penghujung dan menonton sorotan secara terus.

[Liu Xin]: Katakan anda seorang mentor yang sentiasa menjawab soalan dalam gaya Socratic. Anda tidak akan memberi saya jawapan secara langsung, tetapi akan membimbing saya untuk berfikir, okay?

【GPT】: Sudah tentu. Jika anda mempunyai sebarang pertanyaan, izinkan saya membimbing anda untuk berfikir dan berbincang.

[Liu Xin]: Saya sedang belajar Java, dan ada konsep proksi dinamik, yang saya tidak faham

[GPT]: Sangat bagus, mari gunakan kaedah Socratic. bersama-sama Terokai proksi dinamik Java. Pertama, kita perlu memahami corak proksi. Apa yang anda tahu tentang model agensi? Apakah tujuan corak proksi?

[Liu Xin]: Adakah ini bermakna seseorang mengambil tempat orang lain?

[GPT]: Ya, dalam erti kata lain, corak proksi adalah tentang melaksanakan konsep serupa dalam reka bentuk perisian. Dalam kes ini, satu objek (ejen) melaksanakan tugas tertentu bagi pihak objek lain (objek sasaran). Sekarang, fikirkan, mengapa kita perlu menggunakan corak proksi dalam pengaturcaraan? Dalam situasi apakah penggunaan mod proksi akan membantu?

[Liu Xin]: Saya tidak tahu

[GPT]: Tidak mengapa, mari kita terokai beberapa sebab yang mungkin. Corak proksi berguna dalam banyak senario, seperti apabila kita perlu melakukan beberapa operasi tambahan sebelum atau selepas mengakses objek. Sebagai contoh, kita boleh menggunakan corak proksi dalam situasi berikut:

Kawal akses kepada objek sasaran (kawalan akses)

Tambah fungsi tambahan sebelum dan selepas objek sasaran menjalankan operasi (seperti pengelogan, caching, dll. )

Malas memuatkan, mencipta objek sasaran hanya apabila benar-benar diperlukan

Ini hanyalah beberapa senario aplikasi corak proksi. Jadi, pada pendapat anda, bagaimanakah proksi dinamik boleh dimainkan dalam senario ini? Apakah perbezaan antara proksi dinamik dan proksi statik?

[Liu Xin] Apakah maksud ini saya tidak faham

[GPT] Kami boleh membantu anda memahami mod proksi melalui contoh mudah.

Andaikan anda mempunyai aplikasi yang perlu disambungkan ke pelayan jauh untuk mendapatkan data. Dalam kes ini, anda boleh mencipta kelas yang dipanggil RemoteServerConnection, yang bertanggungjawab untuk mewujudkan sambungan dengan pelayan jauh dan mendapatkan data.

Kini, aplikasi anda perlu melakukan beberapa tindakan tambahan, seperti menyemak status rangkaian sebelum menyambung ke pelayan jauh dan mengelog selepas mengambil data. Pada masa ini, anda boleh menggunakan mod proksi.

Anda boleh mencipta kelas yang dipanggil RemoteServerConnectionProxy, yang mempunyai antara muka yang sama seperti RemoteServerConnection tetapi menambah kefungsian menyemak status rangkaian dan pengelogan. Aplikasi akan menggunakan RemoteServerConnectionProxy untuk mendapatkan data dan bukannya menggunakan RemoteServerConnection secara langsung. RemoteServerConnectionProxy akan mengendalikan operasi tambahan dan kemudian berkomunikasi dengan RemoteServerConnection bagi pihak aplikasi apabila diperlukan.

Dalam contoh ini, RemoteServerConnectionProxy ialah proksi yang mewakili RemoteServerConnection (objek sasaran) untuk melaksanakan tugas tertentu.

Sekarang anda mempunyai pemahaman asas tentang model proksi, mari lihat proksi dinamik. Dalam contoh di atas, kami mencipta kelas proksi yang berasingan (proksi statik). Tidak seperti proksi statik, proksi dinamik dijana secara dinamik pada masa jalan dan bukannya ditulis terlebih dahulu. Ejen dinamik boleh bertindak balas terhadap senario yang berbeza dengan lebih fleksibel.

Di Java, proksi dinamik biasanya dilaksanakan dengan melaksanakan antara muka InvocationHandler dan menggunakan kelas Proksi. Jadi, fikirkanlah, mengapa proksi dinamik mungkin mempunyai kelebihan berbanding proksi statik dalam sesetengah situasi?

[Liu Xin]: Tunggu sebentar, mari kita selesaikan bercakap tentang proksi statik dahulu dalam contoh anda

RemoteServerConnectionProxy menambah beberapa fungsi untuk menyemak status rangkaian dan merakam log ke kelas sebelumnya, tetapi mengapa ia mempunyai antara muka yang sama seperti RemoteServerConnection?

[GPT]: Maaf saya tidak menerangkannya dengan jelas sebelum ini. Mari kita semak tujuan corak proksi: satu objek (proksi) melaksanakan tugas tertentu bagi pihak objek lain (objek sasaran). Untuk membolehkan objek proksi berjaya melaksanakan tugas bagi pihak objek sasaran, mereka perlu mempunyai antara muka yang sama. Dengan cara ini, kod pelanggan tidak peduli sama ada ia berinteraksi dengan objek proksi atau objek sasaran, kerana ia mempunyai antara muka yang sama.

Dalam kes kami, RemoteServerConnectionProxy (objek proksi) dan RemoteServerConnection (objek sasaran) mempunyai antara muka yang sama, kerana dengan cara ini aplikasi boleh menggunakan kedua-dua kelas ini secara telus. Apabila kami memutuskan untuk menggunakan proksi dalam aplikasi kami, kami tidak perlu menukar kod klien kerana kedua-dua objek proksi dan objek sasaran melaksanakan antara muka yang sama. Inilah sebabnya mengapa objek proksi dan objek sasaran perlu mempunyai antara muka yang sama.

Selain itu, mempunyai antara muka yang sama bermakna objek proksi boleh memanggil kaedah objek sasaran semasa melaksanakan tugas. Ini penting untuk melaksanakan fungsi tambahan seperti kawalan akses, pengelogan, dsb., kerana objek proksi perlu memberikan kawalan kepada objek sasaran pada masa yang sesuai.

[Liu Xin]: Faham, ini adalah model proksi Jadi apakah proksi dinamik?

[GPT]: Bagus, sekarang setelah anda memahami mod proksi, mari beralih kepada proksi dinamik.

Perbezaan utama antara proksi dinamik dan statik ialah cara ia dicipta. Proksi statik ialah kelas proksi pratulis, yang bermaksud bahawa untuk setiap kelas sasaran, anda perlu membuat kelas proksi yang berasingan untuknya. Walau bagaimanapun, proksi dinamik dijana secara dinamik pada masa jalan, yang membolehkan anda mencipta proksi generik untuk berbilang kelas tanpa mengubah kod sumber. Dengan cara ini, anda mengurangkan pertindihan kod dan meningkatkan kebolehselenggaraan.

Di Java, proksi dinamik dilaksanakan terutamanya melalui kelas java.lang.reflect.Proxy dan antara muka java.lang.reflect.InvocationHandler. Berikut ialah langkah asas proksi dinamik:

Tentukan kelas pelaksanaan InvocationHandler, yang bertanggungjawab untuk mengendalikan panggilan kaedah pada objek proksi. Dalam kelas ini, anda boleh menambah operasi tambahan seperti yang diperlukan, seperti pengelogan, kawalan akses, dsb.

Gunakan kaedah Proxy.newProxyInstance() untuk mencipta proksi dinamik. Kaedah ini menerima tiga parameter: pemuat kelas, tatasusunan antara muka (antara muka yang perlu dilaksanakan oleh kelas proksi) dan contoh InvocationHandler. Kaedah ini mengembalikan objek proksi yang melaksanakan antara muka yang ditentukan.

Dalam kod pelanggan, gunakan objek proksi dinamik yang dicipta untuk memanggil kaedah. Apabila anda memanggil kaedah pada objek proksi, ia memajukan panggilan ke kaedah invoke() bagi contoh InvocationHandler.

Dengan cara ini anda boleh mencipta proksi dinamik untuk satu atau lebih kelas pada masa jalan tanpa perlu menulis kelas proksi yang berasingan untuk setiap kelas.

Sekarang anda memahami konsep proksi dinamik, sila fikirkan tentang kelebihan dan had proksi dinamik berbanding proksi statik.

[Liu Xin] kelihatan keliru

[GPT] Tidak mengapa, mari kami cuba membantu anda memahami proksi dinamik melalui contoh mudah.

Andaikan kami mempunyai antara muka Bank, yang mempunyai pemindahan kaedah() untuk melaksanakan operasi pemindahan. Kami ingin menambah fungsi pengelogan pada antara muka ini, tetapi kami tidak mahu mengubah suai pelaksanaan antara muka Bank. Pada masa ini, kita boleh menggunakan proksi dinamik.

Pertama, kita perlu melaksanakan InvocationHandler Kelas ini akan bertanggungjawab untuk mengendalikan panggilan kaedah pada objek proksi dan menambah fungsi pengelogan:

public class LoggingHandler implements InvocationHandler {
private Object target;
public LoggingHandler(Object target) {
this.target = target;
}


@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("日志记录:开始执行 " + method.getName() + " 方法");
Object result = method.invoke(target, args);
System.out.println("日志记录:执行 " + method.getName() + " 方法完成");
return result;
}
}
Salin selepas log masuk

Sekarang, kita boleh. gunakan Proxy Kaedah newProxyInstance() mencipta proksi dinamik untuk antara muka Bank. Ambil perhatian bahawa kita perlu menghantar contoh kelas pelaksanaan antara muka Bank kepada LoggingHandler:

Bank realBank = new RealBank(); // 假设RealBank是Bank接口的一个实现
InvocationHandler handler = new LoggingHandler(realBank);




Bank proxyBank = (Bank) Proxy.newProxyInstance(
realBank.getClass().getClassLoader(),
realBank.getClass().getInterfaces(),
handler
);
Salin selepas log masuk

Sekarang, apabila kita memanggil kaedah pemindahan() menggunakan proxyBank, fungsi pengelogan akan ditambah secara automatik:

proxyBank.transfer();
Salin selepas log masuk

Lulus Dengan contoh ini, kita dapat melihat kelebihan utama proksi dinamik: daripada menulis kelas proksi yang berasingan untuk setiap kelas, proksi generik boleh dibuat untuk satu atau lebih kelas pada masa jalan. Pada masa yang sama, ia juga menjadikan kod lebih fleksibel dan lebih mudah untuk diselenggara.

Walau bagaimanapun, proksi dinamik juga mempunyai beberapa had Sebagai contoh, dalam Java, proksi dinamik hanya boleh membuat proksi untuk kelas yang melaksanakan antara muka Jika kelas tidak melaksanakan sebarang antara muka, proksi dinamik tidak boleh digunakan.

Semoga contoh ini membantu anda memahami konsep proksi dinamik. Jika anda masih mempunyai sebarang soalan, sila berasa bebas untuk bertanya.

[Liu Xin]: Dalam contoh anda, kami berharap dapat menambahkan fungsi pengelogan pada antara muka Bank Kemudian saya boleh menulis BankProxy dan menambah kod pengelogan? Mengapa perlu bersusah payah menggunakan InvocationHandler?

[GPT]: Anda menimbulkan soalan yang sangat bagus. Dalam sesetengah kes, menggunakan proksi statik (seperti BankProxy yang anda nyatakan) sememangnya boleh mencapai fungsi yang kami inginkan. Walau bagaimanapun, dalam senario yang lebih kompleks, proksi dinamik mungkin membawa beberapa kelebihan ketara:

Kesejagatan: Proksi dinamik boleh mencipta proksi untuk berbilang kelas dan antara muka tanpa perlu menulis kelas Ejen yang berasingan. Jika anda perlu menambah fungsi yang sama pada banyak antara muka, seperti pengelogan, kawalan akses, dsb., proksi dinamik boleh membantu anda mengurangkan kod pendua dan meningkatkan kebolehgunaan semula kod.

Mudah diselenggara: Jika anda perlu mengubah suai atau menambah fungsi pada proksi anda pada masa hadapan, lebih mudah untuk menggunakan proksi dinamik. Untuk proksi statik, anda perlu mengubah suai setiap kelas proksi satu demi satu; untuk proksi dinamik, anda hanya perlu mengubah suai pelaksanaan InvocationHandler. Dengan cara ini anda boleh mengubah suai tingkah laku ejen dengan mudah tanpa menukar kelas dan antara muka asal.

Penyahgandingan: Proksi dinamik membantu memisahkan logik proksi daripada logik perniagaan. Apabila anda perlu mengubah suai logik proksi, tidak perlu menukar kelas dan antara muka asal. Ini menjadikan kod lebih mudah difahami dan diselenggara.

Namun, proksi dinamik tidak selalunya penyelesaian terbaik. Dalam sesetengah kes, proksi statik mungkin lebih sesuai dengan keperluan anda. Apabila memilih antara menggunakan proksi dinamik atau proksi statik, anda perlu menimbang kebaikan dan keburukan berdasarkan senario dan keperluan tertentu.

Semoga jawapan ini dapat membantu anda memahami dengan lebih baik perbezaan antara proksi dinamik dan proksi statik. Jika anda mempunyai sebarang pertanyaan lanjut, sila berasa bebas untuk bertanya.

[Liu Xin]: Faham, tetapi mengapa anda perlu mencipta kelas baharu melalui Proxy.newProxyInstance? Bukankah bagus untuk mengubah suai kelas RealBank asal secara langsung

[GPT]: Soalan anda melibatkan konsep reka bentuk kod dan penyahgandingan. Sudah tentu boleh dilakukan untuk mengubah suai kelas RealBank secara langsung untuk menambah fungsi pengelogan, tetapi ini mungkin membawa kepada masalah berikut:

Prinsip Tanggungjawab Tunggal: Menurut Prinsip Tanggungjawab Tunggal, kelas hanya perlu bertanggungjawab untuk satu yang jelas. fungsi. Tanggungjawab utama kelas RealBank adalah untuk melaksanakan antara muka Bank dan mengendalikan logik perniagaan berkaitan bank. Jika kami menambah fungsi pengelogan dalam kelas RealBank, ia akan bertanggungjawab untuk kedua-dua logik perniagaan dan pengelogan, yang mungkin melanggar prinsip tanggungjawab tunggal. Dengan menggunakan proksi, kita boleh memisahkan kedua-dua tanggungjawab ini supaya setiap kelas memberi tumpuan kepada fungsi yang jelas.

Penyahgandingan: Jika kami menambah fungsi pengelogan terus ke kelas RealBank, maka kami perlu menukar pelaksanaan kelas RealBank jika kami perlu mengubah suai atau mengalih keluar fungsi pengelogan pada masa hadapan. Ini mungkin menyebabkan kelas RealBank digabungkan dengan fungsi pengelogan, mengurangkan kebolehselenggaraan kod. Dengan menggunakan proksi, kita boleh memisahkan fungsi pengelogan daripada kelas RealBank supaya jika kita perlu mengubah suai atau mengalih keluar fungsi pengelogan, kita tidak perlu menukar kelas RealBank.

Kebolehgunaan semula: Katakan kita ingin menambah fungsi pengelogan pada berbilang kelas. Jika kita mengubah suai secara langsung pelaksanaan setiap kelas, ini akan membawa kepada banyak pertindihan kod. Dengan menggunakan proksi (terutamanya proksi dinamik), kami boleh menyediakan fungsi pengelogan biasa untuk berbilang kelas, dengan itu mengurangkan pertindihan kod dan meningkatkan kebolehgunaan semula kod.

Ringkasnya, dengan menggunakan ejen, kita boleh mengikut prinsip tanggungjawab tunggal, mencapai penyahgandingan dan meningkatkan kebolehgunaan semula kod. Walaupun mengubah suai kelas asal secara langsung boleh dilaksanakan dalam beberapa kes, terdapat banyak senario yang menggunakan proksi boleh membawa kepada reka bentuk dan kebolehselenggaraan kod yang lebih baik.

Semoga jawapan ini membantu anda. Jika anda mempunyai sebarang pertanyaan lanjut, sila berasa bebas untuk bertanya.

[Liu Xin]: Parameter Proxy.newProxyInstance sangat rumit saya faham

InvocationHandler diluluskan. Mengapakah kita perlu melepasi dua parameter yang lain?

[GPT]: Kaedah Proxy.newProxyInstance memang memerlukan tiga parameter, izinkan saya menerangkan peranannya secara terperinci:

ClassLoader: Pemuat kelas bertanggungjawab untuk memuatkan kod bait ke dalam mesin maya Java. Tujuan menghantar pemuat kelas adalah untuk membolehkan kaedah Proxy.newProxyInstance mengetahui tempat untuk mencari definisi kelas dan cara memuatkan kelas proksi ke dalam memori. Biasanya, kami menggunakan pemuat kelas kelas sasaran kerana kami mahu kelas proksi dimuatkan dalam pemuat kelas yang sama dengan kelas sasaran. Ini memastikan bahawa kelas proksi mempunyai akses kepada antara muka kelas sasaran. Dalam kebanyakan kes, pemuat kelas kelas sasaran boleh diperolehi melalui target.getClass().getClassLoader().

Tatasusunan antara muka (Antara Muka[]): Tatasusunan antara muka mentakrifkan antara muka yang perlu dilaksanakan oleh kelas proksi. Antara muka ini biasanya adalah antara muka yang sama yang dilaksanakan oleh kelas sasaran supaya kelas proksi boleh menggantikan kelas sasaran secara telus. Apabila kaedah objek proksi dipanggil, InvocationHandler akan mengendalikan kaedah yang ditakrifkan dalam antara muka ini. Dalam kebanyakan kes, antara muka yang dilaksanakan oleh kelas sasaran boleh diperolehi melalui target.getClass().getInterfaces().

Contoh InvocationHandler: Parameter ini ialah contoh pelaksanaan InvocationHandler, yang bertanggungjawab untuk memproses panggilan kaedah objek proksi. Apabila kaedah objek proksi dipanggil, kaedah invoke() InvocationHandler akan dilaksanakan. Kita boleh menyesuaikan gelagat objek proksi dengan menghantar contoh InvocationHandler kepada kaedah Proxy.newProxyInstance.

Walaupun kaedah Proxy.newProxyInstance memerlukan tiga parameter, kesemuanya adalah untuk memastikan kelas proksi boleh dimuatkan dengan betul, melaksanakan antara muka kelas sasaran dan menyesuaikan gelagat objek proksi. Semoga penjelasan ini membantu anda memahami perkara yang dilakukan oleh parameter ini. Jika anda mempunyai sebarang pertanyaan lanjut, sila berasa bebas untuk bertanya.

[Liu Xin]: Walaupun jawapan anda agak panjang lebar, saya masih faham

[GPT]: Saya gembira anda faham. Sebab mengapa saya menerangkannya secara terperinci adalah untuk memastikan anda memahami sepenuhnya parameter kaedah ini dan fungsinya. Jika anda menghadapi soalan lain semasa belajar, atau memerlukan penjelasan yang lebih ringkas, sila berasa bebas untuk bertanya. Saya akan cuba sedaya upaya untuk membantu anda. Saya ucapkan selamat maju jaya dalam pelajaran!

Sorotan

Dari segi kaedah pengajaran:

1 Bermula dari konsep mudah (statik proksi), sangat bagus!

2. Apabila saya tidak memahami sesuatu konsep, saya akan menerangkannya dengan contoh, yang sangat bagus!

3 Apabila saya sengaja meluahkan ketidakfahaman saya tentang apa yang dikatakan, ia boleh menerangkannya dengan lebih lanjut setiap kali.

4. Agak bersemangat untuk memperkenalkan ejen dinamik, dan ia boleh kembali kepada konsep asas semasa soalan berulang saya.

Secara teknikal, ia menerangkan dengan tepat:

1 Mengapa terdapat proksi dinamik dan perbezaan antara proksi itu dengan proksi dinamik.

2. Mengapakah Proksi perlu sama dengan antara muka kelas asal?

3. Mengapa tiga parameter diperlukan untuk mencipta proksi dinamik.

4 Memperkenalkan beberapa prinsip reka bentuk (tanggungjawab tunggal), decoupling, guna semula dan fungsi lain.

Sama ada kaedah pengajaran atau pengajaran ilmu, GPT-4 berprestasi sangat baik walaupun ada pensyarah yang cemerlang, ini mungkin berlaku.

Rasanya agak bertele-tele. Adalah lebih baik jika ia menyokong kesan suara.

Tidak kira bagaimana GPT-4 dilakukan secara dalaman, ia berkelakuan seperti master pengaturcaraan secara luaran. Ia bukan sahaja menguasai konsep proksi dinamik, ia mempunyai sejumlah besar contoh untuk menyokongnya, dan ia juga boleh. terangkan dari yang mudah kepada yang mendalam, saya akan mencuba keupayaan reka bentuknya kemudian dan berkongsi dengan anda.

Atas ialah kandungan terperinci GPT-4 ialah pakar pengaturcaraan, saya benar-benar yakin!. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:51cto.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan