Haruskah saya membuat sarang fungsi dalam bahasa yang memungkinkan saya melakukan itu atau haruskah saya menghindarinya?

12

Dalam JavaScript, PL / SQL dan beberapa bahasa lain, fungsi dapat disarangkan, yaitu dideklarasikan dalam fungsi lain. Ini dapat digunakan untuk memecah fungsi besar menjadi potongan-potongan kecil, tetapi menyimpan potongan-potongan itu dalam konteks fungsi yang lebih besar.

function doTooMuch() {
    function doSomething () {
       ...
    }
    function doSomethingElse() {
       ...
    }
    function doYetAnotherThing() {
       ...
    }

    // doTooMuch body

    doSomething();
    doSomethingElse();
    doYetAnotherThing();
}

Dalam beberapa kasus, ketika fungsi-fungsi yang lebih kecil tidak menggunakan variabel lokal dari fungsi yang lebih besar, ini dapat dengan mudah diubah ke versi di mana semua fungsi tidak diuji.

function doSomething () {
   ...
}
function doSomethingElse() {
   ...
}
function doYetAnotherThing() {
   ...
}
function doTooMuch() {
    doSomething();
    doSomethingElse();
    doYetAnotherThing();
}

Dengan asumsi bahwa fungsi-fungsi bersarang tidak dapat digunakan di tempat lain, apakah lebih baik menyimpannya dalam konteks fungsi besar atau apakah itu buruk karena inilah yang membuat fungsi besar, yah, besar?

pengguna281377
sumber

Jawaban:

8

Ini masalah pendapat, tapi saya akan menghindari fungsi bersarang kecuali itu sebenarnya bagian yang perlu dan disengaja dari desain Anda.

Saat Anda menjalankan fungsi, dalam sebagian besar bahasa, Anda berakhir dengan semacam efek mekanis. Yang paling umum, dan menarik, adalah untuk menutup ruang lingkup leksikal variabel yang dapat digunakan di dalam tubuh, tetapi yang lain (misalnya: visibilitas fungsi) juga muncul beberapa waktu.

Itu biasanya alat yang luar biasa, bila digunakan dengan benar - tetapi itu adalah alat yang rumit, karena dapat menghasilkan efek non-lokal atau tidak jelas ketika Anda pertama kali melihat kode.

Jika Anda tidak menggunakannya, banyak orang akan membaca kode dan tidak melihat apa-apa melakukan hal itu - jadi anggaplah mereka melewatkannya, dan lihat lagi, mencoba mencari tahu mengapa Anda melakukannya dengan cara itu, dan tidak dalam ruang lingkup yang terpisah.

Anda juga berisiko bahwa para programmer di masa depan akan dengan sengaja atau bahkan tidak sengaja menutup sesuatu yang tidak mereka inginkan, dengan tidak memperhatikan risiko di sana.

Akhirnya, jika deklarasi fungsi Anda mendeklarasikan fungsi yang dinamai di luar lingkup fungsi melampirkan, hindari saja. Itu sangat membingungkan semua orang.

Adapun catatan akhir: karena kode fungsi individu bantuan membatasi, fungsi bersarang kurang merepotkan daripada fungsi raksasa tunggal, tetapi pada akhirnya itu tidak berarti banyak membaca kode yang lebih untuk memahami doTooMuch()- terutama jika Anda dapat menyembunyikan kode antara deklarasi fungsi bersarang, atau perlu memeriksa bahwa tidak ada yang melakukannya.

Daniel Pittman
sumber
-1: Javascript bukan "kebanyakan bahasa". Fungsi bersarang di Javascript adalah praktik normal.
kevin cline
2
@kevincline fungsi bersarang di JavaScript adalah praktik buruk yang umum
Raynos
@ Raynos: Jika Anda tidak membuat sarang, di mana Anda akan meletakkannya? Engkau bukan kelas untuk mengandung mereka. Berikut adalah beberapa kode khas:jquery(function($){ $('#id').click(function(){...}); }
kevin cline
@kevincline ... Kode umum untuk noobs, Anda memerlukan fungsi yang bersarang satu dalam. Dan itu karena javascript tidak memiliki cakupan modul, jadi Anda perlu penutupan anonim itu.
Raynos
Dan jika klik itu mengeksekusi panggilan Ajax, dengan callback selesai? Sekarang Anda memiliki fungsi bersarang dua tingkat. Tentu, Anda bisa membatasi sarang dengan menetapkan penutupan anonim ke variabel. Apakah itu benar-benar lebih baik?
kevin cline
2

Ini adalah salah satu pertanyaan yang tidak memiliki jawaban yang benar dan kata-kata seperti "preferensi pribadi", "latihan tim" muncul di benak Anda. Menurut pendapat saya, fungsi-fungsi kecil (sekarang ini hal subyektif lain) yang tidak digunakan di mana saja termasuk dalam fungsi orangtua mereka, terutama ketika mereka dapat dinamai.

devmiles.com
sumber
0

Pertanyaan ini tidak memiliki jawaban yang benar, karena tidak ada pilihan yang memaksimalkan enkapsulasi. Jika Anda membuat sarang, mereka masih memiliki akses ke variabel yang seharusnya tidak mereka miliki. Jika tidak, maka fungsi lain memiliki akses ke fungsi yang seharusnya tidak. Bagaimanapun, Anda kalah.

DeadMG
sumber