Saya menggunakan fungsi sebagian sebagai cara untuk mendokumentasikan kode. Memanggil fungsi dengan nama yang berarti membuatnya lebih mudah untuk memahami kode. Dalam beberapa kasus, bahkan fungsi dengan satu baris pun masuk akal.
Misalnya, dalam "Kode Bersih", Robert C. Martin memberikan contoh berikut: Yang mana yang lebih Anda sukai? Ini:
// Check to see if the employee is eligible for full benefits
if ((employee.flags & HOURLY_FLAG) &&
(employee.age > 65))
Atau ini?
if (employee.isEligibleForFullBenefits())
Saya tidak selalu setuju dengannya, tetapi dalam hal ini saya setuju. Kode harus dapat dibaca, tidak hanya ketika Anda menulisnya dan Anda tahu setiap detailnya, tetapi juga pada jam 9 malam ketika Anda harus memperbaiki bug dalam kode orang lain. Menatap kondisi yang panjang dan mencoba mencari tahu semua negatif ganda tidak dianjurkan. Jika Anda bisa menuliskan nama saja (tidak hanya syarat, tapi setiap kode yang Anda tulis), itu menjadi jauh lebih sederhana.
Saya tidak pernah menyesal memasukkan sesuatu ke dalam fungsi, dan jika Anda khawatir tentang kinerja, maka profillah terlebih dahulu.
Ada kesalahpahaman luas bahwa panggilan fungsi hanya boleh dilakukan untuk menghindari segmen kode yang berulang. Aturan praktis saya adalah bahwa setiap unit kerja logis harus dibuat menjadi suatu fungsi, bahkan ketika itu hanya digunakan di satu tempat. Ini biasanya mengarah pada keterbacaan yang lebih baik, dan memungkinkan Anda untuk menulis kode self-documenting, di mana nama fungsi menggantikan komentar dan Anda tidak perlu menulis komentar tambahan menjelaskan apa yang Anda lakukan.
sumber
Jika digunakan di lebih dari satu tempat, dan
lalu jadikan fungsi atau metode. Potongan panjang kode berulang, dalam pengalaman saya, secara alami akan jatuh ke dalam salah satu kategori ini (biasanya yang pertama, tetapi kemudian kategori tumpang tindih banyak;). Tentu saja, apa pun yang ada di antarmuka juga merupakan fungsi / metode dalam dirinya sendiri.
sumber
float x
,int y
dandouble density
, kemudian atur perhitungan itu sebagai fungsi C bisa lebih rumit daripada sekadar mengulang kode, karena Anda harus menemukan cara untuk mengeluarkan ketiga nilai. Jika perhitungan berulang itu sendiri sepele, terkadang lebih baik membiarkannya saja.Hampir selalu, terutama jika setiap duplikat mewakili operasi yang sama dari sudut pandang konseptual. Jika dilakukan dengan cara yang sama, tetapi pada tipe yang berbeda, buat implementasi generik.
Satu-satunya alasan yang tidak dapat saya pikirkan adalah salah satu pemeliharaan: kadang-kadang mungkin lebih nyaman untuk menghindari menciptakan ketergantungan antara hal-hal yang terpisah, bahkan dengan biaya duplikasi.
sumber
Pencarian untuk " refactoring " akan membawa Anda ke banyak sumber daya untuk "praktik terbaik" industri untuk proses yang sangat umum ini. Artikel yang agak terkenal, Once and Only Once adalah referensi sejarah hebat yang menjelaskan apa yang oleh sebagian orang dianggap sebagai "praktik terbaik" untuk masalah yang dikemukakan oleh pertanyaan Anda. Juga, konsep yang lebih umum dikenal sebagai Don't Repeat Yourself (DRY) . Untuk rangkaian jawaban yang sangat mendalam untuk pertanyaan Anda, bacalah buku klasik Martin Fowler yang hebat, Refactoring: Meningkatkan Desain Kode yang Ada , yang mencakup beberapa saran paling dikenal untuk refactoring , yang secara intuitif Anda coba capai !
sumber
Jika kode tersebut tepat diulang di lebih dari satu tempat dan bagian yang diulang tidak akan berubah dalam waktu dekat maka saya memecahnya menjadi suatu fungsi.
sumber
Itu tergantung pada sifat kohesi kode yang diulang. Jika bagian berulang kode melakukan fungsi tertentu, maka itu adalah kandidat yang sangat baik untuk dijadikan metode, sebagian karena prinsip KERING , sebagian karena jika fungsi perlu dioptimalkan atau diperbaiki, maka hanya ada satu bagian kode untuk ditangani.
Jika asosiasi itu kebetulan, lebih baik mengulang kode daripada membuatnya menjadi metode. Jika Anda perlu menambahkan sesuatu ke tengah-tengah salah satu urutan kode untuk memenuhi salah satu penggunaan potongan itu, jika itu dalam suatu metode, perubahan yang Anda buat dapat memengaruhi penggunaan lain dari metode itu.
Lihat artikel Wikipedia tentang konsep kohesi kode .
sumber
Anda harus membedakan antara fungsi-fungsi dalam pengertian pemrograman terstruktur dan metode kelas.
Dalam contoh Anda, apa yang telah Anda perlihatkan adalah metode yang karenanya tidak boleh dikodekan secara in-line.
Anda mungkin harus memvalidasi string untuk melihat apakah itu angka atau tidak, dalam hal ini, Anda menggunakan fungsi dan sebagian besar jawaban sebelumnya berlaku.
Perbedaan ini penting khususnya dalam proyek-proyek besar.
Sebisa mungkin, berusaha untuk memisahkan aturan bisnis (yang merupakan metode) dari algoritma komputasi (yang merupakan fungsi pemrograman murni).
sumber