Haruskah saya menggunakan kembali variabel?
Saya tahu bahwa banyak praktik terbaik mengatakan Anda tidak boleh melakukannya, namun, nanti, ketika pengembang yang berbeda sedang men-debug kode dan memiliki 3 variabel yang mirip dan satu-satunya perbedaan adalah bahwa mereka dibuat di tempat yang berbeda dalam kode, ia mungkin bingung. Pengujian unit adalah contoh yang bagus untuk ini.
Namun, saya tidak tahu bahwa praktek-praktek terbaik yang sebagian besar waktu menentangnya. Misalnya mereka mengatakan tidak untuk "mengganti" parameter metode.
Praktik terbaik bahkan menentang pembatalan variabel sebelumnya (di Jawa ada Sonar yang memberikan peringatan ketika Anda menetapkan null
ke variabel, bahwa Anda tidak perlu melakukannya untuk memanggil pengumpul sampah sejak Java 6. Anda tidak selalu dapat mengontrol peringatan mana yang dimatikan; sebagian besar waktu default diaktifkan.)
sumber
Jawaban:
Masalah Anda muncul hanya ketika metode Anda panjang dan melakukan banyak tugas secara berurutan. Ini membuat kode lebih sulit untuk dipahami (dan dengan demikian mempertahankan) per se. Menggunakan kembali variabel menambahkan di atas ini elemen risiko tambahan, membuat kode lebih sulit untuk diikuti dan lebih rentan kesalahan.
Praktik terbaik IMO adalah menggunakan metode yang cukup pendek yang hanya melakukan satu hal, menghilangkan seluruh masalah.
sumber
result1 = foo(); result2 = foo(); Assert.AreEqual(result1, result2);
saya tidak melihat banyak tempat di mana Anda perlu menggunakan kembali variabel dalam kasus ini.Penggunaan kembali variabel dalam suatu metode adalah tanda kuat bahwa Anda harus memperbaiki / membaginya.
Jadi jawaban saya adalah bahwa Anda tidak boleh menggunakannya kembali, karena jika Anda melakukannya maka akan jauh lebih sulit untuk memperbaikinya nanti.
sumber
Tergantung.
Beberapa variabel mungkin dibuat dengan tujuan untuk menyimpan jenis data tertentu, yang dapat berubah selama eksekusi suatu fungsi. Kode pengembalian muncul di sini, misalnya:
Nama variabel membuatnya sangat jelas apa variabel ini dimaksudkan untuk disimpan. Saya pikir penggunaan kata-kata lain seperti ini adalah mungkin, di mana variabel secara konseptual adalah sebuah wadah yang secara logis digunakan oleh contoh berbeda dari hal-hal yang sangat mirip selama berlangsungnya suatu fungsi.
Namun, secara umum, ini harus dilakukan hanya dalam keadaan di mana sangat jelas bagi pembaca kode yang mungkin. Dalam kasus apa pun, kecuali mungkin optimasi ekstrim tanpa memperhatikan keterbacaan kode, variabel harus digunakan kembali hanya karena jenisnya cocok.
Semua ini pada dasarnya mengikuti dari praktik yang baik dalam penamaan variabel. Nama harus berbicara sendiri. Jika sulit untuk menempatkan tujuan yang tepat untuk semua penggunaan kembali dalam nama pendek, yang terbaik adalah hanya menggunakan variabel yang berbeda.
sumber
Alasan terbesar saya tidak menggunakan kembali variabel (terutama dalam unit test) adalah karena ia memperkenalkan jalur kode yang tidak perlu, yang sulit untuk diuji dan di-debug. Tes unit yang baik harus independen dari tes lain dan ketika Anda menggunakan kembali variabel level kelas (misalnya) dalam fixture tes unit Anda harus memastikan untuk menyatakan keadaan mereka sebelum setiap tes. Tes unit yang baik juga mengisolasi cacat sehingga dalam teori setiap kasus uji (metode) hanya boleh menyatakan 1 perilaku untuk sistem yang diuji. Jika metode pengujian Anda ditulis seperti ini, jarang ada kebutuhan atau manfaat untuk menggunakan kembali variabel tingkat metode. Terakhir, dalam bahasa yang mendukung penutupan dan pemrosesan asinkron, sangat sulit untuk berpikir tentang apa yang sedang terjadi jika Anda menggunakan kembali variabel di seluruh metode.
sumber
Anda harus menggunakan variabel yang berbeda. Jika Anda khawatir rekan kerja Anda akan bingung, beri mereka nama yang jelas-jelas menutupi peran mereka.
Menggunakan kembali variabel kemungkinan merupakan sumber kebingungan di masa depan; lebih baik untuk menjernihkannya sekarang.
Dalam beberapa kasus, nama variabel yang sama dapat digunakan kembali; misalnya
i
dalam lingkaran penghitungan sederhana. Dalam kasus ini, tentu saja Anda harus memastikan bahwa variabel berada dalam ruang lingkup mereka sendiri.EDIT: Penggunaan kembali variabel kadang-kadang merupakan tanda bahwa Prinsip Tanggung Jawab Tunggal dilanggar. Periksa untuk melihat apakah variabel yang digunakan kembali digunakan dalam peran yang sama. Jika ya, itu mungkin tidak dapat digunakan kembali sama sekali (meskipun mungkin masih lebih disukai untuk memiliki dua variabel yang berbeda, untuk membatasi ruang lingkup variabel tersebut). Jika digunakan dalam peran yang berbeda, Anda memiliki pelanggaran SRP di tangan Anda.
sumber
Ada satu situasi di mana Anda mungkin ingin menggunakan kembali variabel terlepas dari saran hebat yang diberikan oleh jawaban lain: ketika kompiler Anda membutuhkan uluran tangan.
Dalam beberapa kasus, kompiler Anda mungkin tidak cukup pintar untuk menyadari bahwa variabel register-dialokasikan tertentu tidak lagi digunakan oleh bagian selanjutnya dari kode. Oleh karena itu tidak akan menggunakan kembali register bebas secara teoritis untuk variabel berikutnya, dan kode yang dihasilkan mungkin kurang optimal.
Perhatikan bahwa saya tidak mengetahui adanya kompiler arus utama yang gagal menangkap situasi ini dengan benar, jadi jangan pernah, pernah melakukan ini kecuali Anda tahu pasti bahwa kompiler Anda menghasilkan kode sub-optimal. Jika Anda mengkompilasi untuk sistem embedded khusus dengan kompiler khusus, Anda mungkin akan mengalami masalah ini.
sumber
Saya akan mengatakan TIDAK.
Pikirkan skenario ini: program Anda macet dan Anda perlu mencari tahu apa yang terjadi dengan memeriksa dump inti ... dapatkah Anda melihat perbedaannya? ;-)
sumber
Tidak, Anda tidak meningkatkan kode yang sedang dijalankan mesin (... kode perakitan). Biarkan menggunakan kembali memori apa pun yang digunakan kompiler untuk variabel ke kompiler. Cukup sering itu akan menjadi register, dan menggunakan kembali tidak memberi Anda apa pun. Fokus untuk membuat kode lebih mudah dibaca.
sumber
Tergantung. Dalam bahasa dinamis, di mana tipe berada pada nilai daripada variabel maka jika saya memiliki argumen yang cukup terkenal untuk fungsi yang, misalnya, adalah string. Saya perubahan dalam algoritma berarti bahwa itu selalu digunakan setelah ditafsirkan sebagai integer, kemudian, sebagai konsep pertama saya mungkin melakukan yang setara dengan
scrote = int (scrote)
Tapi saya akhirnya akan melihat untuk mengubah jenis yang dikirim ke fungsi dan perhatikan perubahan dalam tipe parameter.
sumber
Pertama, lihat lingkungan pengembangan Anda. Jika Anda memiliki masalah debugging karena Anda memiliki lima variabel dalam cakupan yang berbeda dengan nama yang identik, dan debugger tidak menunjukkan kepada Anda mana dari variabel-variabel ini yang Anda butuhkan, maka jangan gunakan lima variabel dengan nama yang sama. Ada dua cara untuk mencapai ini: Gunakan satu variabel, atau gunakan lima nama yang berbeda.
Debugger Anda juga mungkin menyulitkan untuk men-debug suatu fungsi dengan banyak variabel. Jika fungsi dengan 20 variabel lebih sulit untuk di-debug daripada satu dengan 16 variabel, maka Anda dapat mempertimbangkan untuk mengganti 5 variabel dengan satu. ("Mungkin mempertimbangkan" tidak sama dengan "harus selalu").
Tidak masalah menggunakan satu variabel di banyak tempat selama variabel tersebut selalu memiliki tujuan yang sama. Misalnya, jika sepuluh panggilan fungsi mengembalikan kode kesalahan, yang ditangani segera untuk setiap panggilan, gunakan satu variabel dan bukan 10. Tapi jangan gunakan variabel yang sama untuk hal-hal yang sama sekali berbeda. Seperti menggunakan "nama" untuk nama pelanggan, dan 10 baris kemudian menggunakan variabel yang sama untuk nama perusahaan, itu buruk dan akan membuat Anda mendapat masalah. Lebih buruk lagi, menggunakan "customerName" untuk nama pelanggan, dan 10 baris kemudian menggunakan variabel "customerName" yang sama untuk nama perusahaan.
Yang penting, tidak ada yang merupakan aturan besi. Semuanya memiliki kelebihan dan kekurangan. Jika "praktik terbaik" menyarankan satu hal, dan Anda memiliki alasan untuk mengatakan bahwa itu adalah ide yang buruk dalam situasi spesifik Anda, maka jangan lakukan itu.
sumber
Pertama, lihat lingkungan pengembangan Anda. Jika Anda memiliki masalah debugging karena Anda memiliki lima variabel dalam cakupan yang berbeda dengan nama yang identik, dan debugger tidak menunjukkan kepada Anda mana dari variabel-variabel ini yang Anda butuhkan, maka jangan gunakan lima variabel dengan nama yang sama. Ada dua cara untuk mencapai ini: Gunakan satu variabel, atau gunakan lima nama yang berbeda.
Debugger Anda juga mungkin menyulitkan untuk men-debug suatu fungsi dengan banyak variabel. Jika fungsi dengan 20 variabel lebih sulit untuk di-debug daripada satu dengan 16 variabel, maka Anda dapat mempertimbangkan untuk mengganti 5 variabel dengan satu. ("Mungkin mempertimbangkan" tidak sama dengan "harus selalu").
Tidak masalah menggunakan satu variabel di banyak tempat selama variabel tersebut selalu memiliki tujuan yang sama. Misalnya, jika sepuluh panggilan fungsi mengembalikan kode kesalahan, yang ditangani segera untuk setiap panggilan, gunakan satu variabel dan bukan 10. Ada satu masalah dengan ini: Biasanya, kompiler akan memberi tahu Anda ketika Anda menggunakan variabel yang tidak diinisialisasi. Tapi di sini, jika Anda membaca kode kesalahan setelah panggilan 6, tetapi variabel belum benar-benar berubah setelah panggilan 5, Anda akan mendapatkan data yang tidak berguna tanpa peringatan kompiler Anda. Karena variabel telah diinisialisasi, dengan data yang sekarang tidak berguna.
Yang penting, tidak ada yang merupakan aturan besi. Semuanya memiliki kelebihan dan kekurangan. Jika "praktik terbaik" menyarankan satu hal, dan Anda memiliki alasan untuk mengatakan bahwa itu adalah ide yang buruk dalam situasi spesifik Anda, maka jangan lakukan itu.
sumber
Gunakan variabel global saat Anda perlu mempertahankan konstanta status atau store. Dengan menggunakan kembali variabel, Anda hanya menggunakan kembali nama yang menunjuk ke lokasi di memori. Nama deskriptif pada inisialisasi hanya dapat memenangkan kejelasan Anda (Dengan asumsi Java dan tidak ada OCD primitif).
Kecuali Anda ke dalam kebingungan kode dengan tangan atau menjengkelkan pengembang lain.
sumber