Biasanya merupakan hal yang baik untuk melakukan hal ini sedapat mungkin, tetapi saya suka menganggap pekerjaan semacam ini bukan sebagai "langkah", tetapi sebagai subtugas .
Subtugas adalah unit kerja tertentu yang dapat dilakukan: ia memiliki tanggung jawab spesifik, dan input dan output yang ditentukan (pikirkan "S" dalam SOLID ). Subtitle tidak perlu digunakan kembali: beberapa orang cenderung berpikir "Saya tidak akan pernah harus memanggil ini dari yang lain jadi mengapa menulisnya sebagai fungsi?" tapi itu salah.
Saya akan mencoba juga menguraikan manfaat dan juga bagaimana itu berlaku untuk fungsi bersarang (penutupan) vs hanya fungsi lain di kelas. Secara umum, saya akan merekomendasikan untuk tidak menggunakan penutupan kecuali Anda secara khusus membutuhkannya (ada banyak kegunaan, tetapi memisahkan kode menjadi potongan logis bukan salah satunya).
Keterbacaan.
200+ baris kode prosedural (badan fungsi) sulit dibaca. Fungsi 2-20 baris mudah dibaca. Kode untuk manusia.
Bersarang atau tidak, Anda sebagian besar mendapatkan manfaat keterbacaan, kecuali Anda menggunakan banyak variabel dari lingkup induknya, dalam hal ini bisa jadi sama sulitnya untuk dibaca.
Batasi ruang lingkup variabel
Memiliki fungsi lain memaksa Anda untuk membatasi ruang lingkup variabel, dan secara khusus melewati apa yang Anda butuhkan.
Ini sering juga membuat Anda menyusun kode lebih baik, karena jika Anda memerlukan semacam variabel status dari "langkah" sebelumnya, Anda mungkin benar-benar menemukan sebenarnya ada subtugas lain yang harus ditulis dan dijalankan terlebih dahulu untuk mendapatkan nilai itu. Atau dengan kata lain, membuatnya lebih sulit untuk menulis potongan kode yang sangat berpasangan.
Memiliki fungsi bersarang memungkinkan Anda untuk mengakses variabel dalam lingkup induk dari dalam fungsi bersarang (penutupan). Ini bisa sangat berguna, tetapi juga dapat menyebabkan bug yang sulit ditemukan karena eksekusi fungsi mungkin tidak terjadi dengan cara yang tertulis. Ini bahkan menjadi masalah jika Anda memodifikasi variabel dalam lingkup induknya (umumnya ide yang sangat buruk).
Tes unit
Setiap subtugas, menerapkan fungsi (atau bahkan kelas) adalah bagian kode yang berdiri sendiri, dapat diuji. Manfaat pengujian unit dan TDD didokumentasikan dengan baik di tempat lain.
Menggunakan fungsi / penutupan bersarang tidak memungkinkan pengujian unit. Bagi saya, ini adalah pemecah kesepakatan dan alasan mengapa Anda harus menjalankan fungsi lainnya, kecuali ada kebutuhan khusus untuk penutupan.
Bekerja pada desain tim / Top-down
Subtugas dapat ditulis oleh orang yang berbeda, secara mandiri, jika perlu.
Bahkan oleh Anda sendiri, dapat berguna ketika menulis kode untuk hanya memanggil beberapa subtugas yang belum ada, sambil membangun fungsionalitas utama, dan khawatir tentang benar-benar menerapkan subtugas hanya setelah Anda tahu itu akan mendapatkan hasil yang Anda butuhkan dalam sebuah cara yang berarti. Ini juga disebut desain / pemrograman Top-down.
Kode digunakan kembali
Oke, jadi terlepas dari apa yang saya katakan sebelumnya, kadang-kadang ada akhirnya menjadi alasan nanti untuk menggunakan kembali subtugas untuk hal lain. Saya sama sekali tidak mendukung "arsitektur astronot" -ism tetapi hanya dengan menulis kode yang digabungkan secara longgar, Anda mungkin mendapatkan manfaat nanti dari penggunaan kembali.
Seringkali yang menggunakan kembali berarti beberapa refactoring, yang sangat diharapkan, tetapi refactoring parameter input ke fungsi mandiri kecil JAUH lebih mudah daripada mengekstraksinya dari fungsi garis 200+ bulan setelah ditulis, yang benar-benar poin saya di sini.
Jika Anda menggunakan fungsi bersarang, menggunakannya kembali biasanya adalah masalah refactoring ke fungsi terpisah, yang lagi-lagi, itulah sebabnya saya berpendapat bahwa bersarang bukanlah cara yang harus dilakukan.