Apakah pengidentifikasi pendek buruk? [Tutup]


26

Apakah pengidentifikasi pendek buruk? Bagaimana panjang pengidentifikasi berkorelasi dengan pemahaman kode? Apa faktor lain (selain pemahaman kode) yang bisa dipertimbangkan ketika datang ke penamaan pengidentifikasi?

Hanya untuk mencoba untuk menjaga kualitas jawaban atas, mohon perhatikan bahwa ada beberapa penelitian tentang subjek sudah!

Edit

Penasaran bahwa semua orang tidak berpikir panjang itu relevan atau cenderung lebih suka pengidentifikasi yang lebih besar, ketika kedua tautan yang saya berikan menunjukkan pengidentifikasi besar berbahaya!

Tautan Rusak

Tautan di bawah ini menunjuk pada penelitian tentang masalah ini, tetapi sekarang sudah rusak, saya sepertinya tidak memiliki salinan kertas itu, dan saya tidak ingat apa itu. Saya meninggalkannya di sini kalau-kalau ada orang lain yang tahu.


5
Titik data. Identifier pendek favorit saya adalah :, seperti pada :(){ :;:& };:- Saya akan mengatakan kebanyakan orang berpikir itu sangat buruk. ;)

@ Allenec: Bom Fork cenderung.
Josh K

Lihat pertanyaan tentang stackoverflow ini ada komentar tentang Praktek Pemrograman buku yang harus dibaca oleh setiap programmer.
slu

1
Hanya karena nama yang lebih panjang harus dihindari bukan berarti Anda harus melakukan upaya ekstra untuk mempersingkat mereka demi pendeknya.
JeffO

1
@cessor Lucu bahwa sesuatu yang dimaksudkan untuk penelitian ditutup sebagai opini. Sayangnya, saya setuju, mengingat jawaban yang diterimanya.
Daniel C. Sobral

Jawaban:


67

"Aturan" terbaik yang pernah saya dengar adalah bahwa panjang nama harus proporsional dengan panjang ruang lingkup variabel. Jadi indeks ibaik-baik saja jika tubuh loop adalah beberapa baris panjang, tapi saya suka menggunakan sesuatu yang sedikit lebih deskriptif jika bisa lebih panjang dari garis 15ish.


6
Saya belum pernah mendengar hal seperti itu, dan saya tidak berpikir prinsip ini akan meningkatkan keterbacaan kode.
NimChimpsky

8
@ Nim: Saya setuju. Bahkan dalam satu forlingkaran pendek , saya akan memberi nama indeks, customerCounteratau sesuatu. Dibutuhkan sedikit usaha ekstra dan membuat kode Anda jauh lebih baik. Menggunakan variabel pendek untuk cakupan pendek kedengarannya seperti alasan untuk malas.
Tidak ada yang

2
Hmm, ini bukan aturan atau pedoman bagi saya tetapi cara membuat Anda berpikir panjang dan dalam konteks itu masuk akal. Saya tentu tidak berpikir itu alasan untuk malas (meskipun saya akan setuju bahwa beberapa orang mungkin menganggapnya demikian). Identifier saya jauh lebih sering daripada tidak (tanda-tanda diajarkan pascal sejak awal) kecuali sekarang ketika saya sampai ke hal-hal seperti query LINQ dan ekspresi lambda di mana 1, 2, atau 3 pengidentifikasi karakter (biasanya mengetik inisial) tampaknya masuk akal bagi saya .
Murph

33
+1 Jujur saja nama "deskriptif" hanyalah derau dalam lima baris untuk loop; Saya pikir sebagian besar orang memiliki pemahaman yang cukup baik tentang apa yang Anda lakukan dengan "i". Saya telah menggunakan nama deskriptif dalam loop bersarang, tetapi mereka memiliki cakupan yang lebih panjang.
Jeremy

18
+1 - Menggunakan idan jadalah nama umum yang setiap pengembang harus dapat memahami IMO.
TheCloudlessSky

48

Setiap variabel harus memiliki makna, dan namanya adalah bagian dari makna itu. Dan bagian yang sangat penting, karena membantu pembaca untuk memahami apa itu tanpa menggali lebih dalam algoritma. i, jJelas untuk digunakan sebagai indeks, mereka pendek, tetapi sangat informatif. bntjelek, closeatau closeButtonbermakna. Jadi pendek atau panjang bukan kriteria yang paling penting untuk nama variabel, itu harus bermakna. Makna sangat tergantung pada konteksnya. Misalnya, Anda dapat memberikan nama yang sangat pendek seperti nke variabel string lokal yang digunakan dalam blok kecil kode, katakan 10 baris dan merujuk ke nama properti ( vuntuk nilai adalah contoh lain).

Jadi nama variabel harus informatif dan tidak masalah mereka pendek atau panjang .


2
+1, dan hanya untuk dicatat, tutup dan tutupTombol juga tidak sama. Tutup adalah kata kerja, dan dengan demikian, harus menjadi nama fungsi atau metode. Sementara closeButton adalah kata benda, dan seharusnya, tentu saja, menjadi nama tombol yang memicu fungsi tutup.
CaffGeek

close adalah kata sifat, misalnya close = true;)
Armand

13

Saya akan menggunakan pengenal yang menggambarkan variabel, terlepas dari panjangnya.

Kasus-kasus i, j dan k ada di dalam diri mereka sendiri sehingga ada di mana-mana mereka menggambarkan diri, Anda secara otomatis tahu itu adalah indeks lingkaran. Anda juga bisa mengatakan hal yang sama untuk:

foreach loop (Strings s : myString)

Namun, IDE sekarang menyediakan alat penyelesaian kode sehingga satu-satunya efek negatif dari pengidentifikasi deskriptif yang sangat panjang dan telah dihapus.

Saya akan dengan senang hati menambahkan dan menambahkan kata ke pengidentifikasi, jika diperlukan untuk menjelaskan tujuan variabel.


3
BTW, penggunaan i, j dan k untuk indeks loop kembali 50 + tahun ke FORTRAN. Variabel yang dimulai dengan huruf I sampai N secara default bertipe INTEGER. Variabel yang dimulai dengan huruf lain secara default REAL. Ini secara alami menyebabkan penggunaan I, J, dan K untuk indeks for-loop. (Konvensi FORTRAN mungkin muncul dari penggunaan variabel-variabel ini yang digunakan dalam persamaan matematika sebelum itu.)
tcrosley

2
Makalah kedua yang saya tautkan menunjukkan bahwa pengidentifikasi deskriptif yang sangat panjang mengurangi kemampuan seseorang untuk memahami kode, bertentangan dengan komentar "satu-satunya efek samping negatif".
Daniel C. Sobral

3
Efek samping negatif nyata dari pengidentifikasi sangat panjang adalah dalam keterbacaan. Sekilas sulit untuk mengetahui apakah dua pengidentifikasi sangat panjang sama atau berbeda, dan mungkin sulit untuk memilih semua elemen ekspresi dengan pengidentifikasi sangat panjang.
David Thornley

tcrosley - Saya menambahkan itu hanya karena itu berasal dari Fortran bukan alasan untuk melanjutkan latihan seperti itu. Saya sangat tidak menyarankan penggunaan counter iterator / loop yang disebut "i", "j", "k", dll. Ini kemalasan intelektual yang biasa. Di mana-mana <> bagus.
cepat,

9

Mereka tidak seburuk pengidentifikasi yang menyesatkan. Saya tidak keberatan kode debugging di mana pengidentifikasi hanya satu huruf, tetapi saat konvensi penamaan yang berbeda datang ke gambar itu menjadi menjengkelkan. Misalnya, jika di suatu tempat Anda melihat strPersonID, dan kemudian di tempat lain yang Anda lihat s_EmployeeID, maka membingungkan untuk mengetahui apakah keduanya adalah string dan apakah ada perbedaan. Juga jika variabel disalin-paste ( pmapIntString = new std::map<int,int>) dan benar-benar salah, saya akan khawatir.

Ketika sampai pada saya, saya menambahkan komentar dalam kode untuk variabel penting yang digunakan dan mencoba mempertahankan standar yang diberikan dalam pedoman pengembangan. Jika tidak ada standar maka saya mencoba untuk mempertahankan konvensi penamaan yang sama di seluruh kode.


5

Aku berjuang...

Saya selalu menggunakan nama deskriptif sebagai pengidentifikasi, tetapi akhir-akhir ini saya menggunakan pengidentifikasi yang sangat singkat.

Saya pikir, itu tergantung pada konteks kode:

  • Jika fungsi penulisan Anda kompleks (algoritme), SELALU gunakan pengidentifikasi pendek (karakter tunggal adalah yang terbaik)
  • Saat menulis nilai Parameter untuk fungsi menggunakan nama deskriptif.

Saya kira itu tergantung pada seberapa padat kodenya. Terkadang memiliki nama sebenarnya membuatnya lebih sulit untuk dibaca.

Kadang-kadang tanpa nama itu benar-benar samar!


1
Namun, jika Anda menulis algoritma yang kompleks, tidakkah Anda ingin pengidentifikasi lebih deskriptif bagi orang yang melihat kode Anda untuk pertama kalinya?
Maks.

Kapan pengidentifikasi karakter tunggal sesuai?
Amir Afghan

1
Dulu saya juga berpikir begitu, tapi saya benar-benar menemukan ini bukan masalahnya, cobalah sendiri. Ambil algoritma yang kompleks dan coba dengan nama deskriptif vs variabel huruf tunggal.
Darknight

1
Saya setuju tetapi hanya untuk formula yang lebih panjang, karena mereka cenderung terlalu lama, dan bahkan kemudian Anda bisa menggunakan fungsi (nama fungsi) untuk menggambarkan apa bagian dari formula itu.
Emile Vrijdags

1
Jika kompleks, dan memiliki pola, pola-pola tersebut harus dipecah menjadi fungsi
CaffGeek

3

Pemikiran saya adalah bahwa mereka tidak buruk dalam diri mereka tetapi mereka tidak informatif kecuali mereka sangat standar.

Jadi variabel loop menjadi i, j dan k sangat standar sehingga tidak ada alasan untuk tidak menggunakannya jika Anda membuat loop diindeks.

Tempat lain yang akan saya gunakan pengidentifikasi yang sangat singkat adalah ketika saya mendeklarasikan variabel sementara yang akan keluar dari ruang lingkup dalam beberapa baris waktu - variabel sementara dari loop foreach, misalnya. Jika tidak akan dirujuk ke tempat lain maka mudah bagi siapa saja yang membaca kode untuk melihat deklarasi dan mengikuti apa yang digunakan untuk itu. Jika itu akan digunakan untuk lebih dari lima atau enam baris, saya akan mencari untuk memberikan nama yang lebih jelas.

Di luar itu saya mencoba menggunakan pengidentifikasi panjang informatif - terutama di tingkat kelas saya ingin pengidentifikasi yang dapat Anda baca dan mendapatkan ide untuk variabel apa. Jika mereka terlalu lama (dan saya memang melihat kode kadang-kadang dengan empat atau lima kata dirangkai untuk pengidentifikasi) Saya cenderung menganggap itu sebagai bau kode - jika saya perlu banyak teks untuk membedakan variabel saya apakah mereka sebenarnya kelompok yang dapat lebih baik disimpan dalam hashmap atau daftar? Bisakah saya membuat semacam objek untuk memodelkan data ini dengan lebih akurat? Kadang-kadang Anda tidak bisa tetapi pengidentifikasi yang sangat panjang adalah indikator bahwa ada sesuatu yang layak dilihat di sini.


3

Saya sangat setuju dengan jawaban yang lain di sini, tetapi saya ingin menunjukkan satu faktor lain yang saya pikir sering diabaikan. Nama yang baik seringkali merupakan nama yang idiomatis terhadap kode. Ini bisa pada level bahasa, level algoritma atau beberapa idiom internal untuk basis kode yang ada. Intinya adalah bahwa meskipun nama tersebut tidak berarti apa-apa bagi seseorang yang tidak tahu domain kode, itu mungkin masih nama terbaik dalam konteks yang diberikan.


3

Memberi nama variabel selalu merupakan latihan dalam menyeimbangkan keunikan dan kelengkapan. Panjang nama terkait dengan keduanya, dengan cara yang berbeda. Nama yang lebih panjang lebih mudah dibuat unik; nama-nama panjang sedang cenderung lebih komprehensif daripada nama-nama yang terlalu pendek atau terlalu panjang.

Sebuah nama variabel yang sangat singkat hanya berguna jika memiliki sejarah yang membuatnya dipahami (misalnya, i, j, & kuntuk indeks; dxuntuk jarak sepanjang sumbu) atau lingkup yang cukup kecil untuk semua referensi untuk terlihat sekaligus (misalnya , temp). Nama variabel terburuk di dunia adalah hal-hal seperti t47. ("Apa artinya itu dan mengapa itu berbeda dari t46?") Syukurlah gaya penamaan sebagian besar keluar dengan FORTRAN, tetapi di sinilah keinginan untuk nama-nama variabel yang lebih panjang berakar.

Seperti yang ditunjukkan makalah asli Anda, nama yang terlalu panjang juga sulit dibaca, karena perbedaan internal yang halus dapat terlewatkan ketika melihat kode. (Perbedaan antara DistanceBetweenXAxisAbscissae& DistanceBetweenYAxisAbscissaesangat sulit untuk diambil dengan cepat.)

Seperti yang ditunjukkan NoteToSelf sebelumnya, persyaratan untuk keunikan nama bergantung terutama pada cakupan nama yang harus unik. Indeks loop 5-garis bisa i; indeks dari catatan aktif yang diteruskan dari fungsi ke fungsi lebih baik memiliki nama yang lebih deskriptif.

Variabel lokal ke fungsi dapat memiliki nama deskriptif kecil seperti deltaXtanpa masalah. Variabel delta X statis dalam modul harus memiliki nama yang membedakan deltaX ini dari deltaX lain di modul yang sama, membuatnya lebih lama. Dan variabel delta X global harus dibuat unik di semua modul dan semua modul lain yang mungkin dibuat, mungkin dengan menggabungkan nama modul ke nama deskriptif lainnya. Ini adalah salah satu dari banyak masalah dengan global; untuk menjadi unik, nama-nama itu harus cukup panjang untuk membuatnya sulit dibaca.


2

Sebaliknya, saya pikir pengidentifikasi panjang lebih buruk daripada pengidentifikasi pendek (kecuali jika Anda berurusan dengan konstanta). Menggunakan TheVariableThatHoldsTheCapacityOfMyContainerClassmembuat kode Anda jauh lebih rentan terhadap kesalahan daripada menggunakan Capacity.


1
Anda akan senang mengetahui bahwa salah satu penelitian yang saya tautkan mendukung alasan Anda, jika bukan karena alasan yang sama. ;-)
Daniel C. Sobral

1
Sangat mudah untuk salah membaca pengidentifikasi yang sangat panjang, mungkin membingungkan mereka atau mungkin gagal untuk menyadari bahwa keduanya sama.
David Thornley

2
TheVariableThatHoldsTheCapacityOfMyContainerClass lebih besar dari yang saya anggap "panjang" - sepuluh kata terlalu panjang untuk CamelCase untuk membantu; Anda membutuhkan ruang untuk membuatnya bisa dibaca.
Richard Gadsden

1
Tentu, tetapi ini adalah manusia jerami. Contoh nama panjang Anda menambahkan kata-kata tetapi tidak ada informasi. Pertimbangkan kasus di mana Anda memiliki banyak variabel yang berkaitan dengan berbagai bentuk kapasitas. Maka Anda benar-benar ingin nama yang membedakan tujuan, seperti initalCapacity, atau finalCapacity.
Charles E. Grant

2
@ Maxm, var total = Capacity + Capacity2; Apa yang Capacitymengandung, dan apa yang Capacity2mengandung? Untuk apa mereka digunakan? Harus mencari petunjuk konteks membuang waktu. Sedangkan jika itu ditulis seperti yang var totalStorageCapacity = truckCapacity + trailerCapacity;saya tahu apa yang kita bicarakan.
CaffGeek

2

Di, dan dari diri mereka sendiri, pengidentifikasi pendek tidak buruk. Tujuan memilih nama baik (pendek atau panjang) adalah untuk kejelasan kode. Memilih pengidentifikasi dalam layanan kejelasan kode lebih penting daripada memenuhi beberapa persyaratan panjang minimum. Secara umum apa artinya ini adalah menulis nama yang sedikit lebih lama bermakna.


1 Anda sudah mengatakannya dengan sangat baik, saya tidak dapat menemukan kata-kata saya ketika saya sudah menulis jawabannya :-)
ComputerSaysNo

1

Pengamatan yang saya miliki selama bertahun-tahun dan kurang hari ini dibandingkan 10 atau 15 tahun yang lalu. Programmer yang tidak bisa mengetik adalah orang yang akan bertarung melawan Anda dengan penamaan variabel. Mereka adalah orang-orang dengan semua nama variabel 1-3 huruf.

Jadi saran saya adalah menggunakan nama yang bermakna seperti yang dikatakan banyak komentator dan kemudian belajar mengetik. Saya telah mempertimbangkan untuk menambahkan tes pengetikan ke wawancara, hanya untuk melihat di mana orang-orang berada, tetapi saya mulai melihat jauh lebih sedikit orang yang tidak mengetik karena komputer menjadi bagian besar masyarakat.


2
Sebenarnya saya tidak melihat korelasi seperti itu. Jika apa pun tampaknya orang-orang dari bahasa OO pergi untuk pengidentifikasi panjang, dan orang-orang dari bahasa fungsional pergi untuk yang pendek. Itu mempertanyakan dugaan bahwa OO membantu pemodelan. :-)
Daniel C. Sobral

Jangan lupa bahwa nama-nama itu tidak hanya perlu diketik tetapi juga dibaca. Menggunakan pengidentifikasi terlalu lama sebenarnya dapat mengurangi keterbacaan banyak. Menggunakan apa pun kecuali idalam satu lingkaran seperti for (int i=0; i<dst.size(); ++i) dst[i] += src[i]harus dilarang oleh hukum.
maaartinus

1

Makalah pertama yang Anda tautkan terlihat menarik, tetapi kesimpulannya adalah bahwa mereka tidak menemukan bukti signifikan untuk atau menentang hipotesis bahwa "petunjuk dasar", termasuk nama variabel yang bermakna, membantu dalam pemahaman kode. Tatapan waktu yang digunakan sebagai proksi untuk pemahaman kode yang menarik, tetapi bukan slam dunk.

Aku khawatir kertas kedua itu konyol. Masalah pertama adalah bahwa contoh-contoh nama panjang yang mereka berikan sangat panjang, tidak memberikan informasi tambahan. Saya pikir kita semua bisa sepakat bahwa membuat nama variabel lebih lama hanya untuk membuatnya lebih lama itu bodoh. Contoh mereka memberi nama variabel distance_between_abscissae daripada dx adalah manusia jerami.

Lebih penting lagi, percobaan mereka adalah ujian menghafal sederhana daripada pemahaman. Ini menguji kemampuan subjek untuk mengisi potongan-potongan nama variabel yang hilang ketika disajikan dalam daftar tanpa konteks. Ya, nama yang lebih panjang lebih sulit untuk dihafal, tetapi ketika saya mengkode saya tidak menghafal nama variabel, saya menggunakannya untuk memberikan konteks. Saya kira Anda bisa berpendapat bahwa kesulitan mengingat variabel panjang membuat kode lebih sulit untuk ditulis, tetapi kode dibaca jauh lebih sering daripada yang tertulis, jadi kegiatan mana yang harus dioptimalkan?


Perhatikan bahwa makalah kedua menyatakan dengan jelas bahwa "Delapan nama yang digunakan dalam delapan pertanyaan diekstraksi dari kode produksi." Juga, mereka tidak menguji untuk menghafal saja, tetapi untuk kebenaran juga.
Daniel C. Sobral

1

Salah satu metrik utama saya untuk menentukan apakah suatu baris kode dapat dibaca atau tidak adalah seberapa banyak konteks lain dari baris lain harus dibaca untuk benar-benar memastikan bahwa Anda memahami apa yang dilakukan oleh baris tersebut.

Sangat mudah untuk mengatakan bahwa "siapa pun harus dapat memahami bahwa i, j dan k adalah variabel loop". Dan seringkali itu sangat jelas. Tetapi saya masih mencoba untuk tetap rendah hati dan profesional dalam hal ini dan berasumsi bahwa mudah membuat kesalahan saat pemrograman. Jadi jika saya mengulang melalui array dari Grobbles saya akan memberi nama variabel grobbleIndex. Saya juga bisa menerima saya sebagai singkatan dari indeks. Ketika Anda menggunakan ij dan k lebih sulit untuk menemukan kesalahan seperti menggunakan indeks yang salah dengan array yang salah dan seterusnya. Dan itu semakin buruk ketika Anda memiliki lingkaran dalam.

PS. Pada saat saya menulis jawaban ini, saya sedang mengkode beberapa javascript pada laptop mini 10 "dengan layar split vertikal dalam vim dan saya masih meluangkan waktu untuk memberi nama variabel loop saya, barisIndex dan kolomIndex.


0

Dalam beberapa aplikasi, variabel pendek tidak bisa menjelaskan data dalam variabel. Pendek atau panjang tidak relevan. Menggunakan variabel yang lebih lama tidak membuat kode Anda lebih lambat. Tentu ini lebih banyak usaha mengetik nama variabel panjang tapi setidaknya orang yang membaca kode 6 bulan kemudian (yang mungkin Anda) akan dapat melihat apa yang terjadi tanpa perlu membuat jejak dengan asumsi itu bahkan mungkin.


0

Saya pikir idealnya adalah bahwa nama harus deskriptif kecuali ...

Gagasan bahwa nama dapat (mungkin harus) lebih pendek - dan dengan implikasi kurang deskriptif - jika mereka memiliki ruang lingkup yang terbatas hanya satu alasan untuk menyimpang dari yang ideal.

Secara pribadi saya sering menggunakan nama pendek untuk sejumlah kecil entitas yang direferensikan berulang kali. Subrutin khusus aplikasi yang sering disebut, misalnya.


-2

Saya tidak akan pernah menggunakan nama pengenal dengan kurang dari 4-5 karakter, misalnya variabel loop mungkin Index atau jIndex atau kIndex tergantung berapa banyak loop batin yang saya butuhkan untuk menyelesaikan sesuatu, tetapi untuk nama lain katakanlah "kunci" yang akan saya gunakan "String LKey" atau "int LKey", "L" untuk lokal jika itu adalah variabel metode atau "F" untuk variabel kelas privat, semua pengidentifikasi lainnya seperti yang disebutkan sebelumnya sebelum saya harus menjelaskan alasan keberadaannya dalam nama itu, jika tidak, lingkup "pengidentifikasi" tidak berguna kan ?!


5
Informasi tambahan apa yang "indeks" berikan bahwa "saya" tidak? Nama variabel panjang yang tidak memberi tahu Anda apa pun lebih buruk daripada yang satu karakter.
Anon.

2
Setelah baru-baru ini menulis beberapa hal yang bekerja pada kisi 3d saya punya banyak variabel bernama x, y dan z. Mengingat konteksnya, mereka deskriptif sempurna.
Loren Pechtel
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.