Mengapa ada begitu banyak desas-desus tentang penutupan? [Tutup]
9
Mengapa ada begitu banyak desas-desus tentang penutupan di antara pengembang? Dalam karier saya, saya tidak pernah sengaja menggunakannya, meskipun tidak jelas mengerti apa itu.
UPD: hanya untuk memperjelas. Pertanyaannya adalah tentang mengapa konsep penutupan menjadi begitu banyak bicara hari ini.
Bagaimana Anda bisa dengan sengaja menggunakan sesuatu yang Anda tidak tahu apa itu? Jadi pada dasarnya Anda harus terlebih dahulu bertanya (atau mencari) apa penutupan itu.
Steven Jeuris
1
Apakah Anda membaca artikel wikipedia? Apa yang tidak Anda mengerti tentang hal itu?
kevin cline
2
Apa karir Anda berdasarkan?
4
Pertanyaan macam apa ini? Apa itu "buzz"? Apa yang tidak kamu mengerti? Mengapa Anda tidak bertanya bahwa pertanyaan bukan?
Aaronaught
4
Dalam membela OP, penutupan adalah konsep lama, tetapi baru-baru ini mereka menjadi bahan pembicaraan di kota itu. Dan konsepnya memang sangat sederhana bagi siapa saja yang belajar matematika lebih banyak, saya juga tidak bisa mengerti mengapa orang berbicara tentang mereka seolah-olah mereka adalah sesuatu yang sangat sulit untuk dipahami. Mungkin itu hanya cara untuk membuat diri mereka terlihat lebih pintar: "lihat, aku grok penutupan yang sangat sulit grok, jadi aku goyang".
quant_dev
Jawaban:
22
Penutupan adalah kode yang mengingat dunia dari mana asalnya sementara masih dapat digunakan di mana ia dibawa.
Contohnya adalah mendefinisikan fungsi anonim di Java yang tahu bahwa itu ada di dalam YourObject dan dapat memanipulasi metode dan fungsinya. Fungsi ini kemudian dikirim ke misalnya Ayunan di mana ia masuk jauh ke dalam misalnya Pendengar tetapi masih memiliki garis hidup kembali ke akarnya.
Ini adalah konsep yang sangat kuat karena memungkinkan Anda untuk memberikan kode yang - tanpa diketahui oleh kode yang menggunakannya - dapat mencapai kembali ke bagian lain dari kode.
Iya. Ini adalah cara untuk menyuntikkan tidak hanya prosedur, tetapi juga menyatakan, ke dalam kode lain. Hal ini memungkinkan tingkat fleksibilitas yang sangat tinggi dalam mendesain algoritma; Anda dapat merancang metode templated yang bergantung pada subrutin stateful, yang bahkan mungkin tidak tahu tentang itu pada waktu kompilasi. Kelemahannya adalah bahwa tautan ke sumber asli metode itu, dan dengan demikian menyatakan, dapat diputuskan tanpa diketahui oleh konsumen; ketika itu terjadi, Anda mendapatkan kesalahan runtime yang sulit ditemukan.
Penutupan adalah sesuatu untuk menyelesaikan berbagai masalah dengan cara yang elegan. Sebenarnya, dalam bahasa pemrograman di mana tidak ada penutupan, teknik dibuat untuk mengimplementasikan fungsi yang serupa.
Pikirkan functors di C ++ atau Runnables di Java. Mereka hanya teknik yang memungkinkan fungsionalitas mirip dengan penutupan. Semacam «penutupan manual».
Penutupan semakin populer karena diintegrasikan ke dalam bahasa populer: Javascript berkembang karena aplikasi online (seperti google doc misalnya), C # mengimplementasikannya, PHP menerapkannya sejak 5.3, dan seterusnya.
Sekarang penutupan tersedia dalam semakin banyak teknologi, menjadi sangat mudah bahwa semakin banyak orang tertarik pada mereka.
Jadi sekarang, apa itu penutupan? Ini cukup sederhana. Penutupan adalah fungsi dan konteks untuk menjalankannya di dalam. Ini dimanipulasi sebagai objek. Mengapa ini berguna? Ini berguna untuk menghubungkan kode Anda sendiri ke dalam kode yang ada.
Berikut adalah dua situasi umum yang mengharuskan: ketika tindakan dikelola oleh sepotong kode lain, seperti dalam multithreading dengan kumpulan utas, atau ketika suatu tindakan harus dijalankan pada peristiwa yang dipilih (sering digunakan dalam javascript untuk UI).
Apakah saya jelas mengerti Anda? Ada beberapa "penutupan manual" (bukan benar-benar penutupan, tetapi sesuatu yang menyerupai perilaku mereka) dan ada beberapa "penutupan BENAR"?
Penutupan adalah kemampuan bahasa. Beberapa bahasa tidak memiliki kemampuan itu, jadi Anda harus melakukan penutupan secara manual menggunakan alat yang disediakan bahasa untuk Anda. Mengatakan bahwa mereka BENAR atau tidak bukanlah debat IMHO yang sangat menarik.
deadalnix
2
@ gasan, Anda selalu dapat mengeluarkan perakitan dan secara manual melakukan pola apa pun yang Anda inginkan dengan seember pernyataan GOTO. Demikian pula Anda dapat secara manual melakukan loop "for" dengan loop "while" (dalam C ++). Semakin maju, level yang lebih tinggi menawarkan cara standar untuk melakukan hal-hal umum.
Philip
6
Saya melihat kutipan yang lucu di hari lain, itu sepanjang baris "kelas adalah data dengan fungsi. Penutupan adalah fungsi dengan data".
Ya, ini penyederhanaan yang berlebihan, tetapi membantu menjelaskan maksudnya.
Jawaban:
Penutupan adalah kode yang mengingat dunia dari mana asalnya sementara masih dapat digunakan di mana ia dibawa.
Contohnya adalah mendefinisikan fungsi anonim di Java yang tahu bahwa itu ada di dalam YourObject dan dapat memanipulasi metode dan fungsinya. Fungsi ini kemudian dikirim ke misalnya Ayunan di mana ia masuk jauh ke dalam misalnya Pendengar tetapi masih memiliki garis hidup kembali ke akarnya.
Ini adalah konsep yang sangat kuat karena memungkinkan Anda untuk memberikan kode yang - tanpa diketahui oleh kode yang menggunakannya - dapat mencapai kembali ke bagian lain dari kode.
sumber
Penutupan adalah sesuatu untuk menyelesaikan berbagai masalah dengan cara yang elegan. Sebenarnya, dalam bahasa pemrograman di mana tidak ada penutupan, teknik dibuat untuk mengimplementasikan fungsi yang serupa.
Pikirkan functors di C ++ atau Runnables di Java. Mereka hanya teknik yang memungkinkan fungsionalitas mirip dengan penutupan. Semacam «penutupan manual».
Penutupan semakin populer karena diintegrasikan ke dalam bahasa populer: Javascript berkembang karena aplikasi online (seperti google doc misalnya), C # mengimplementasikannya, PHP menerapkannya sejak 5.3, dan seterusnya.
Sekarang penutupan tersedia dalam semakin banyak teknologi, menjadi sangat mudah bahwa semakin banyak orang tertarik pada mereka.
Jadi sekarang, apa itu penutupan? Ini cukup sederhana. Penutupan adalah fungsi dan konteks untuk menjalankannya di dalam. Ini dimanipulasi sebagai objek. Mengapa ini berguna? Ini berguna untuk menghubungkan kode Anda sendiri ke dalam kode yang ada.
Berikut adalah dua situasi umum yang mengharuskan: ketika tindakan dikelola oleh sepotong kode lain, seperti dalam multithreading dengan kumpulan utas, atau ketika suatu tindakan harus dijalankan pada peristiwa yang dipilih (sering digunakan dalam javascript untuk UI).
sumber
Saya melihat kutipan yang lucu di hari lain, itu sepanjang baris "kelas adalah data dengan fungsi. Penutupan adalah fungsi dengan data".
Ya, ini penyederhanaan yang berlebihan, tetapi membantu menjelaskan maksudnya.
sumber