Apakah penggunaan variabel satu huruf dianjurkan? [Tutup]

13

Apakah penggunaan variabel satu huruf didorong di Jawa? Dalam cuplikan kode atau tutorial, Anda sering melihatnya. Saya tidak bisa membayangkan menggunakan mereka didorong karena membuat kode relatif lebih sulit untuk dibaca dan saya tidak pernah melihat mereka digunakan dalam bahasa pemrograman lain!

William Edwards
sumber
3
Iya dan tidak. Sepenuhnya tergantung pada situasinya.
Zavior
1
Tidak selalu membuat kode lebih sulit dibaca. Sebagai contoh, ketika Anda menerapkan kode berdasarkan persamaan matematika, biasanya masuk akal untuk menggunakan nama variabel yang sama seperti yang digunakan dalam persamaan. (Komentar menunjuk kembali ke kertas / teks di mana persamaan asli dapat ditemukan, atau jika Anda seperti saya, Anda terkadang menyertakan kode LaTeX untuk mereka.)
jamesqf

Jawaban:

32

Penamaan yang benar itu sulit. Sangat keras. Jika Anda melihatnya dengan cara lain, Anda juga dapat menganggap ini berarti bahwa hal-hal yang disebutkan dengan benar itu penting. (Kalau tidak, mengapa Anda menghabiskan upaya penamaan itu?)

Tapi, kadang-kadang, nama-nama hal itu tidak penting. Itu sebabnya kami memiliki hal-hal seperti fungsi anonim ("lambdas"), misalnya: karena kadang-kadang tidak layak untuk menyebutkan hal-hal.

Ada banyak contoh, di mana nama variabel satu huruf (atau sangat pendek) sesuai:

  • i, j, k, lUntuk indeks lingkaran
  • kdan vuntuk kunci dan nilai dalam peta
  • nuntuk nomor (misalnya dalam Math.abs(n))
  • a, b, cUntuk sewenang-wenang objek (misalnya di max(a, b))
  • euntuk elemen dalam for eachloop generik
  • f untuk fungsi dalam fungsi tingkat tinggi
  • p untuk fungsi predikat dalam filter
  • T, T1, T2, ... untuk jenis variabel
  • E untuk variabel tipe yang mewakili tipe elemen koleksi
  • R untuk variabel tipe yang mewakili tipe hasil suatu fungsi
  • exuntuk pengecualian dalam catchklausa
  • op untuk operasi di peta atau lipat
  • menambahkan huruf suntuk menunjukkan jamak, yaitu koleksi (misalnya nsuntuk koleksi angka, xsdan ysuntuk dua koleksi acak objek)

Saya tidak pernah melihat mereka digunakan dalam bahasa pemrograman lain!

Mereka sangat umum di hampir setiap bahasa yang saya tahu (dan kemungkinan juga pada yang saya tidak tahu.) Haskell, F #, ML, Ruby, Python, Perl, PHP, C #, Jawa, Scala, Groovy, Boo, Nemerle, D, Go, C ++, C, sebut saja.

Jörg W Mittag
sumber
5
-1 Menggunakan nama variabel 1 huruf adalah pemrograman malas. Terkadang tidak apa-apa untuk menjadi malas, tetapi jika Anda bangun kdan ldalam indeks lingkaran, itu terlalu jauh (Anda seharusnya tidak memiliki banyak loop bersarang untuk memulai; ekstrak mereka ke fungsi) . Secara pribadi, saya tidak pernah menggunakan lebih dari satu variabel 1 huruf per fungsi, tetapi saya membidik untuk 0.
BlueRaja - Danny Pflughoeft
Juga, latau lendigunakan untuk panjang dan arruntuk array (misalnya:) for(var i=0; l=arr.length; i<l; i++). Selain itu, fndapat digunakan sebagai ganti f, saat Anda merujuk ke suatu fungsi.
Ismael Miguel
4
@ BlueRaja-DannyPflughoeft Saya lebih suka menganggapnya sebagai pemrograman yang efisien. Jorg mungkin bisa memperluas ketika satu huruf sesuai, bukan hanya di mana, tetapi jujur ​​saja saya membayangkan kebanyakan programmer menarik garis yang berbeda. Adapun indeks loop, saya bisa berpendapat bahwa setiap kode di mana indeks tidak perlu nama dengan nilai semantik cukup sederhana untuk membenarkan multi-level bersarang atas ekstraksi yang tidak perlu. Mereka juga dapat digunakan dalam loop terpisah untuk menghindari kemungkinan masalah pelingkupan yang diangkat oleh Nelson .
Lilienthal
2
@ Lilienthal: Kode harus efisien-untuk-dibaca, tidak efisien-untuk-menulis. Biasanya mereka adalah hal yang sama, tetapi tidak selalu, seperti dalam kasus ini.
BlueRaja - Danny Pflughoeft
@ BlueRaja-DannyPflughoeft Tidak di semua program tidak, tapi saya tidak melihat ada yang salah dengan saran Jorg. Seperti dikatakan Killian : "Apa pun yang lebih lama tidak mungkin membuat semantik menjadi lebih jelas, tetapi membutuhkan waktu lebih lama untuk membaca." Tapi ini mungkin sebagian besar masalah preferensi dan gaya pribadi.
Lilienthal
20

Jika loop Anda tidak melakukan apa-apa selain menggunakan variabel untuk menghitung

  for(int i = 0; i < 10; i++) {
     System.out.println("Stop it! I really mean it!!");
  }

maka ya, ini adalah nama terbaik yang bisa Anda gunakan. Apa pun yang lebih lama tidak mungkin membuat semantik menjadi lebih jelas, tetapi membutuhkan waktu lebih lama untuk membaca.

Jika variabel digunakan di dalam loop, nama yang bermakna dapat bermanfaat.

for(int door = 0; door < 3; door++) {
  int reward = gauge(door);
  if(reward > max) {
    max = reward;
    best = door;
  }
}

Jika variabel Anda digunakan di seluruh metode, namanya harus lebih panjang; jika digunakan di seluruh kelas, namanya lebih baik dijelaskan sendiri, kalau tidak pasti akan mengurangi kejelasan kode Anda.

Singkatnya, semakin besar cakupan variabel, semakin panjang namanya.

Kilian Foth
sumber
Jujur, saya sudah sampai pada titik di mana saya tidak akan menggunakan satu nama variabel karakter, titik. Saya mencoba menggunakan nama yang mengeja penggunaan, bahkan untuk penghitung. Saya biasanya akan menggunakan variabel bernama indexsaat iterasi di atas array, misalnya.
Michael
13
@ Michael: Menurut pendapat saya, Memprogram Jargon adalah bahasanya sendiri, itu bukan bahasa Inggris. Dan dalam bahasa itu, iadalah kata yang tepat dengan makna yang didefinisikan secara tepat, yaitu "indeks Anda tidak perlu terlalu khawatir tentang". Tapi saya kira itu masalah keakraban. Jika Anda membaca banyak Haskell, Anda akan terbiasa membaca msebagai monad , fsebagai functor , xkarena beberapa objek , xssebagai daftar xs dan sebagainya.
Jörg W Mittag
2
Hanya peringatan yang sangat besar. Nama variabel huruf tunggal OK hanya jika bahasa memiliki ruang lingkup variabel yang tepat. Anda jelas akan bertanya 'Bahasa apa yang tidak memiliki ruang lingkup yang tepat?'. Nah, butuh saya tiga jam untuk mengetahui bahwa JavaScript tidak membuat lingkup variabel dalam loop UNTUK. Cobalah dengan for for di dalam for for menggunakan nama variabel yang sama. Itu akan meledakkan pikiran Anda.
Nelson
@Nelson: Pertanyaan ini, dan jawaban ini, tentang Jawa. Jelas bahasa yang berbeda dapat memiliki pertimbangan yang agak berbeda. (JavaScript bukan bahasa yang sama dengan Jawa.)
ruakh
Saya semua untuk nama variabel satu huruf setiap kali mereka paling masuk akal, tapi saya tidak setuju itu iadalah "nama terbaik yang bisa Anda gunakan" untuk loop yang menggunakan variabel hanya untuk menghitung. Dalam hal ini, saya lebih suka melihat countdigunakan sebagai nama variabel: langsung dimengerti. for (int count = 0; count < 10; count++)atau while (count--).
Todd Lehman
4

Membaca kode dalam jawaban Kilian, saya tidak berpikir "ada loop, dan ada variabel, dan memiliki tipe int, dan itu memiliki nama, dan namanya adalah i, dan itu diinisialisasi ke 0,. .. " Saya hanya berpikir "lingkaran ..." di mana tiga titik berdiri untuk detail tidak penting yang bahkan tidak saya pikirkan. Dalam benak programmer saya, variabel itu tidak benar-benar ada, itu hanya sebuah artefak yang harus saya ketik, seperti for (;;) {} yang membuatnya menjadi loop.

Karena variabel itu bahkan tidak ada dalam pikiran saya, mengapa saya memberinya nama, di luar apa yang mutlak diperlukan?

gnasher729
sumber
Saya harus menambahkan bahwa dalam konstruksi semacam itu, saya sering tergoda untuk menggunakan bahkan tidak i, tetapi _untuk variabel yang jelas tidak berarti. Tetapi tidak semua orang akrab dengan Prolog, dan itu mungkin akan membuat lebih banyak perhatian daripada menghapus.
Kilian Foth
Anda juga perlu mempertimbangkan bagaimana variabel digunakan di dalam loop, bukan hanya di for (...)header.
@KilianFoth: itu juga digunakan di Haskell, ML, F # dan Scala, saya percaya. Dan di Ruby, meskipun _merupakan pengidentifikasi hukum seperti yang lainnya, ada perubahan baru-baru ini bahwa variabel lokal yang tidak digunakan bernama _(atau dimulai dengan _) tidak menghasilkan peringatan "variabel lokal yang tidak digunakan", meskipun Ruby biasanya memperingatkan mereka.
Jörg W Mittag
-1

Jika Anda merujuk ke huruf i, j, k sebagai indeks dalam satu lingkaran, itu adalah praktik yang umum di Jawa dan bahasa pemrograman lainnya. Meskipun ada mungkin lebih baik menggunakan untuk setiap loop gaya, seperti

for(User user: users) {
  doSomethingWithTheUser(user);
}

dari pada

for(int i=0; i<users.size(); i++) {
  doSomethingWithTheUser(users.get(i));
}

Di Jawa, gaya perulangan hanya diperkenalkan cukup baru-baru ini. Mungkin itulah sebabnya Anda lebih memperhatikannya untuk Java, karena mengulang indeks yang digunakan untuk menjadi cara yang paling umum untuk mengulang array atau daftar.

Ada beberapa kasus lain di mana huruf tunggal mungkin sesuai, seperti ketika menerapkan fungsi matematika di mana huruf tunggal seperti n, x, atau y, mungkin sudah umum. Tetapi secara umum, tidak, beri nama variabel Anda sesuatu yang bermakna.

Nick
sumber
5
"Di Jawa, gaya pengulangan itu baru saja diperkenalkan" ... seperti pada, satu dekade yang lalu? ( Java 5 dirilis pada 2004 )
meriton
1
Ya itu cukup baru. Tidak, saya belum tua. Diam. Sialan anak-anak turun dari halaman saya. Masih ada banyak aplikasi Java warisan di luar sana dari pra Jawa 5. Dan bahkan lebih banyak programmer Java yang belajar bahasa di Jawa 1.4 dan menolak untuk memperbarui cara mereka melakukan sesuatu. Dan bahkan lebih banyak sampel kode online tanggal kembali ke awal 2000-an (ya, kami memang memiliki Internet saat itu; kami hanya menyebutnya Web 2.0).
Nick