Apakah praktik yang buruk untuk memberi nama variabel yang tidak digunakan dengan garis bawah tunggal?

44

Seringkali ketika sintaks bahasa mengharuskan saya untuk memberi nama variabel yang tidak pernah digunakan, saya akan menyebutkannya _.

Dalam pikiran saya, ini mengurangi kekacauan dan membuat saya fokus pada variabel yang berarti dalam kode. Saya menemukan itu tidak mengganggu sehingga menghasilkan efek "tidak terlihat, keluar dari pikiran".

Contoh umum di mana saya melakukan ini adalah penamaan subqueries di SQL.

SELECT *
FROM
(
    SELECT *
    FROM TableA
    JOIN TableB
        ON TableA.ColumnB = TableB.ColumnB
    WHERE [ColumnA] > 10
) _ --This name is required, but never used here
ORDER BY ColumnC

Contoh lain adalah variabel loop yang tidak digunakan.

array = [[] for _ in range(n)] # Defines a list of n empty lists in Python

Saya menggunakan teknik ini dengan sangat hemat, hanya ketika saya merasa bahwa nama deskriptif tidak menambahkan kode apa pun, dan dalam beberapa hal menghilangkannya dengan menambahkan lebih banyak nama untuk diingat. Dalam beberapa hal saya melihatnya sebagai mirip dengan varkata kunci dalam C #, yang saya juga menggunakan hemat.

Rekan kerja saya tidak setuju. Mereka mengatakan bahwa memiliki nama karakter tunggal (alfabet) lebih baik daripada _.

Apakah aku salah? Apakah praktik yang buruk untuk melakukan ini?

Kris Harper
sumber
4
Saya pikir nama variabel harus mengikuti teori informasi, yaitu panjangnya adalah probabilitas timbal balik log penggunaannya (variabel umum memiliki nama pendek). Satu huruf abjad sepertinya cara yang salah untuk pergi.
dan_waterworth
2
@dan_waterworth Penggunaan karakter tunggal atau ganda sebagai alias tabel adalah praktik yang cukup umum dalam skrip SQL. Karena Anda biasanya harus menulis banyak [table].[column]pengenal, itu membantu keterbacaan banyak untuk hanya digunakan [T].[column]. Itu tergantung pada skrip tentunya. Pilih sedikit seperti itu baik-baik saja, tetapi jika skrip itu sangat besar, saya mungkin menggunakan nama yang lebih deskriptif.
CodexArcanum
5
Saya lebih suka Anda menggunakan "dummy". Ini menjerit kepada saya bahwa mereka ada di sana karena bahasa membutuhkan variabel yang tidak memiliki konteks semantik di luar beberapa baris ini. _ tidak membaca dengan baik untuk manusia. (salah satu alasan saya membenci PERL - Saya tidak bisa mengetik atau membacanya)
Chris Cudmore
1
Catatan: Apa yang Anda namai ada tabel turunan , bukan subquery.
Nick Chammas
2
Kata kunci var di c # tidak memiliki makna ini, itu hanya deklarasi variabel normal di mana jenis disimpulkan.
Francesco De Vittori

Jawaban:

60

Semua nama harus bermakna. Jika _itu adalah standar terkenal di perusahaan Anda atau di komunitas yang lebih luas, maka itu akan bermakna sebagai "nama yang tidak penting". Jika tidak, saya akan mengatakan itu adalah praktik yang buruk. Gunakan nama deskriptif untuk apa yang Anda rujuk, terutama karena nama itu mungkin penting di masa depan.

Telastyn
sumber
13
+1. dummyakan lebih baik, joined_abakan lebih baik.
Blrfl
5
+1, Ada konvensi tempat saya bekerja untuk menggunakan '_' untuk variabel yang tidak digunakan. Saya pikir ini adalah konvensi yang bagus, tetapi saya setuju dengan jawaban ini untuk kasus OP. Idealnya, basis kode harus terlihat seolah-olah ditulis oleh satu orang.
dan_waterworth
20
"_" adalah standar terkenal dengan Python.
Neil G
2
Jika perusahaan Anda menggunakan Perl, sebaliknya, menggunakan $ _ dapat menyebabkan perilaku yang terkadang mengejutkan.
Plutor
2
Dalam prolog, garis bawah menunjukkan bahwa variabel tersebut akan anonim dan karenanya tidak digunakan.
Ivan
44

Saya akan mengatakan bahwa ini adalah praktik yang dapat diterima. Ini adalah contoh langka di mana saya akan menganggap mayoritas salah dan perlu memperbarui pengetahuan mereka tentang ide-ide pemrograman baru-baru ini. Dalam banyak bahasa, terutama bahasa fungsional berbasis ML seperti Haskell dan OCaml, sangat umum digunakan _sebagai variabel "tidak digunakan". Bahkan Lua, yang tidak menawarkan dukungan bahasa eksplisit untuk itu, mendorong penggunaan _sebagai pengganti dengan konvensi.

Beberapa bahasa (Haskell, Lua, dan DI berpikir dari atas kepala saya) juga menawarkan konvensi di mana variabel yang mengarah dengan garis bawah tidak menghasilkan peringatan kompiler tentang "variabel lokal yang tidak digunakan" yang membuat _nama variabel terpendek yang tidak terpakai. Anda dapat menggunakan sesuatu seperti _unusedtetapi saya setuju dengan Anda bahwa itu hanya membuat kekacauan.

CodexArcanum
sumber
Dalam kasus spesifik SQL, saya telah mempertimbangkannya dan rekan kerja mungkin benar di sini. Saya sangat umum menggunakan huruf kapital tunggal untuk alias tabel (dan sering R (hasil) untuk subselect). Saya pikir menggunakan *in dalam seleksi adalah hal yang sangat buruk, karena jika tabel mengubah hasil-hasil Anda juga berubah secara tak terduga. Jadi saya biasanya perlu alias karakter tunggal untuk mengidentifikasi kolom yang saya pilih. Jika Anda berhenti menggunakan *, Anda berhenti membutuhkan nama "tidak digunakan".
CodexArcanum
11
Sebenarnya, setidaknya dalam Haskell, _adalah pola, bukan variabel. Ini perbedaan yang halus, tetapi itu berarti bahwa Anda dapat menggunakannya beberapa kali dalam sesuatu seperti (x, _, _) = ..., sedangkan mencoba mengikat variabel yang sama beberapa kali akan menjadi kesalahan.
hammar
12

Dalam Python _dapat diterima. Namun itu dapat bertentangan dengan gettextalias _().

Konvensi umum lainnya adalah dummy, unused; sendiri atau sebagai awalan.

Beberapa alat analisis kode mengetahui konvensi ini dan tidak akan mengeluarkan peringatan variabel yang tidak digunakan:

  • PyLint untuk _ataudummy
  • PyDev untuk variabel apa pun yang dimulai dengan _, unusedataudummy
vartec
sumber
2
Juga, menggunakan _untuk variabel dummy di python akan berbenturan dengan _nilai yang dikembalikan terakhir. Misalnya, dalam penerjemah, jika Anda melakukannya 5*5pada baris 1; maka pada baris 2 _akan memiliki nilai 25. Namun jika Anda kemudian mengatur x,_ = (3,'not used'), Anda akan menemukan bahwa _sekarang not usedbukan nilai yang dikembalikan terakhir sampai Anda del _. Anda mungkin tidak boleh menggunakan _nilai terakhir yang dikembalikan dalam kode nyata; tetapi sering berguna dalam penerjemah ketika mencoba hal baru.
dr jimbob
4
Nah, _karena nilai yang dikembalikan terakhir hanya berfungsi di shell interaktif.
vartec
Hal yang sama berlaku untuk Lua. Menggunakan _ adalah praktik standar
sylvanaar
11

Tergantung pada ekosistem di mana kode ini akan hidup. Jika _standar yang diterima untuk menunjukkan "variabel dummy" / "output yang tidak digunakan", maka dengan segala cara, tetaplah menggunakannya. Jika tidak, cari tahu apa dan gunakan itu.

Beberapa bahasa pemrograman (mis. Haskell) bahkan memiliki pengidentifikasi 'khusus' ini dibangun ke dalam sintaks mereka untuk tujuan yang Anda sebutkan.

tammmer
sumber
5

Hati-hati, _ sudah memiliki makna intrinsik dalam beberapa bahasa

Dengan Python:

9.6. Variabel Pribadi dan Referensi Kelas-lokal

masukkan uraian tautan di sini "Instan" contoh variabel yang tidak dapat diakses kecuali dari dalam suatu objek tidak ada dalam Python. Namun, ada konvensi yang diikuti oleh sebagian besar kode Python: nama diawali dengan garis bawah (misalnya _spam) harus diperlakukan sebagai bagian non-publik dari API (apakah itu fungsi, metode atau anggota data) . Ini harus dianggap sebagai detail implementasi dan dapat berubah tanpa pemberitahuan.

Ada juga penyebutan lain dalam PEP 8 (Style Guide for Python Code):

Deskriptif: Gaya Penamaan

_single_leading_underscore: indikator "penggunaan internal" lemah. Misalnya dari M impor * tidak mengimpor objek yang namanya dimulai dengan garis bawah.

Dalam C #:

Ini umumnya digunakan untuk menandai variabel pribadi yang memiliki properti publik / internal. Tetapi praktik ini pada umumnya dipandang rendah pada hari-hari ini .

Dalam JavaScript:

Ada perpustakaan yang disebut underscore.js yang menggunakan garis bawah sebagai awalan untuk ekstensi prototipe non-standar.

Contoh:

var object = { some:'stuff' };
var newObject = _.clone(object);

Yang mengarahkan saya ke poin saya. Apa yang salah dengan konvensi variabel placeholder klasik.

var i, j, k, l; // iterator placeholders
var x, y, z, xx, yy, zz // value placeholders
var foo, bar, bas, fixx, buzz, qux, etc... // demonstration placeholders

Mengapa menggunakan konvensi khusus yang mungkin disalahtafsirkan oleh sebagian orang ketika sudah ada banyak konvensi umum yang sudah tersedia?

Evan Plaice
sumber
Di Scala: ini adalah simbol wildcard / placeholder, tetapi sebagai placeholder Anda hanya bisa merujuknya sekali .
Rex Kerr
@RexKerr Menarik. Silakan mengeditnya menjadi jawaban jika Anda mau. Saya akan tetapi saya tidak akrab dengan scala.
Evan Plaice
Sebuah komentar harus dilakukan. Siapa pun yang menggunakan Scala akan tahu, dan siapa pun yang tidak menggunakan Scala mungkin tidak akan memiliki kompatibilitas Scala di bagian atas daftar alasan mereka untuk / tidak melakukan sesuatu.
Rex Kerr
Saya pikir menggunakan salah satu placeholder "konvensi" untuk variabel yang tidak digunakan akan menjadi praktik yang buruk karena itu akan membuat saya berpikir, pertama, "mengapa orang ini tidak menyebut nama ini dengan lebih baik ??" dan setelah beberapa saat saya kemudian akan menemukan itu karena variabel tidak digunakan.
igorsantos07
@ igorsantos07 Saya sepenuhnya setuju. Preferensi saya adalah memberi nama deskriptif, bahkan untuk variabel sementara. Inti dari jawaban ini adalah untuk menunjukkan mengapa garis bawah bukanlah pilihan yang baik untuk konvensi penamaan; karena maknanya yang sudah ada sebelumnya dalam banyak bahasa.
Evan Plaice
2

Saya menggunakan "dummy" untuk hal semacam itu. Atau "omong kosong", jika saya hanya menguji sesuatu :) Beri nama variabel Anda untuk menggambarkan apa itu. Jika mereka dummy, variabel yang tidak digunakan, beri nama demikian.

Phillip Schmidt
sumber
0

Saya menganggapnya sebagai latihan yang buruk karena

  • Anda seharusnya tidak memiliki variabel tak terlihat dalam kode Anda. Jika menurut Anda sebaiknya alasannya mungkin bisa dibahas.

  • bahasa Go menggunakan kata kunci ini untuk menunjukkan bahwa tidak ada variabel yang menjadi tujuan salah satu dari beberapa pengembalian fungsi. Jika bahasa Anda tidak memiliki banyak pengembalian, itu tidak diperlukan. Konvensi penamaan Anda akan merugikan Anda pada hari Anda akan menggunakan bahasa menggunakan _ sebagai notasi bahasa standar.

(Saya tidak tahu Python: apakah konstruksi ini benar-benar diperlukan?)

Denys Séguret
sumber
2
Jika Anda menggunakannya untuk memfilter beberapa pengembalian, maka itu hanya konsekuensi untuk menggunakannya juga untuk argumen fungsi dummy. Faktanya, tidak ada banyak perbedaan antara keduanya: dalam bahasa fungsional pencocokan pola, Anda dapat menulis let (a,b,_) = f(x,y,z)dengan baik let f(x,y,_) = (g(x),h(x),g(y)), atau apa pun. - Dan, ya, sering berguna untuk memiliki parameter dummy: bukan sebagai satu-satunya definisi fungsi, tetapi untuk fungsi polimorfik atau yang dengan definisi pola-cocok alternatif, sering kali merupakan hal yang wajar untuk dilakukan.
leftaround sekitar
1
Poin kedua Anda bertentangan dengan poin utama Anda: di Go, itu pada dasarnya berarti sama dengan "Saya tidak menggunakan nilai ini".
Casey Kuball
0

Ini mungkin valid secara sintaksis, dan mungkin OK sebagai bagian dari standar.

Dengan mengatakan itu, itu adalah sesuatu yang saya akan meminta seseorang untuk berubah dalam tinjauan kode. Saya juga tidak akan pernah memasukkannya ke dalam standar pengkodean, dan akan mencoba untuk menghapusnya dari yang sudah ada. Hanya saja lebih sulit dibaca, dan tidak super bermakna.

Alan Delimon
sumber
0

Saya pikir itu salah karena:

1) Lebih sulit dilihat karena tidak banyak piksel.

2) Jika ada lebih dari satu _, bagaimana Anda tahu yang mana? - atau bahwa pengembang baru telah 'mengikuti aturan' dan mempertahankan penggunaannya dalam lingkup yang sangat lokal?

3) Ini adalah praktik yang tidak bermanfaat. Menggunakan nama variabel satu huruf adalah sekolah yang sangat tua (yaitu pendidikan awal saya!). Saya akan melihat mereka ... dan kemudian melihat komentar ditambahkan untuk mengatakan apa yang kode lakukan dan itu praktik buruk di dunia saat ini. Saya menggunakan nama variabel panjang sebanyak mungkin sehingga semua orang, terlepas dari tingkat pemrograman atau keakraban dengan kode bisa "membacanya" hampir seperti bahasa Inggris. Menggunakan 1 nama huruf adalah praktik yang sangat umum dengan kode lama dan dengan programmer lama (sekali lagi, termasuk saya) tetapi itu tidak membuatnya ok.

bermutu rendah
sumber
9
"bagaimana Anda tahu yang mana" Anda tidak : itu intinya, Anda tidak menggunakan variabel. Jadi tidak masalah jika _sudah digunakan dalam lingkup luar; bahwa seseorang kemudian akan dibayangi (atau apa pun bahasa Anda dalam kasus seperti itu), tetapi tidak satupun dari mereka yang benar-benar digunakan.
leftaroundtentang
0

Untuk menghindari tabrakan namespace, dan memungkinkan untuk debugging, kalau-kalau nama variabel adalah satu-satunya petunjuk Anda, mungkin lebih baik untuk menyebutnya "bergabung_ab_unused".

Terinspirasi oleh Birfl.

Hack Saw
sumber
0

Ya, ini adalah praktik buruk karena dua alasan:

  1. Membuat awalan variabel yang tidak digunakan dengan garis bawah bukanlah standar yang diterima secara luas. Ini kemungkinan akan diabaikan "belum tahu".
  2. Saya telah melihat beberapa orang membuat awalan variabel anggota pribadi dengan garis bawah, dan standar Anda akan sangat membingungkan orang-orang seperti itu.
Jim G.
sumber
0

Apa yang Anda coba lakukan adalah kode dalam versi SQL yang lebih bagus yang tidak memiliki masalah memaksa Anda untuk menciptakan nama untuk sesuatu yang tidak berguna.

Garis bawah hampir tidak terlihat, jadi sepertinya Anda menggunakan bahasa itu. Jika hanya spasi putih yang dapat digunakan sebagai pengidentifikasi, itu akan sempurna, bukan?

Tetapi Anda tidak menggunakan bahasa yang berbeda, dan apa yang Anda lakukan bukanlah cara yang bersih untuk membuat ekstensi bahasa.

Kaz
sumber
0

Itu tergantung pada bahasanya. Di java , ya ini buruk dan bisa menjadi tren berbahaya untuk ditambahkan ke kode Anda, terutama karena alat yang menggunakan refleksi tidak menangani garis bawah dengan sangat baik, karena mereka berada di luar konvensi penamaan variabel java. Dalam python , ini juga buruk tetapi tidak seburuk itu. Dalam clojure , ini 100% oke, dan pada kenyataannya, itu idiomatis untuk menggunakan _'s sebagai pemegang tempat dalam pernyataan let.

Ingatlah bahwa setiap bahasa memiliki seluruh sintaks dan rangkaian idiomnya sendiri, jadi Anda harus mengevaluasi baik / buruk dalam hal idiom ini, daripada dalam istilah absolut.

jayunit100
sumber
5
Saya tidak setuju bahwa ini adalah praktik buruk dengan python. Ini adalah konvensi yang dipahami secara luas
Daenyth
0

Ini akan buruk di perl, yang menggunakan $ _ (dan kadang-kadang _) sebagai variabel khusus.

Secara umum, saya akan tinggal jauh dari itu hanya karena _ tampaknya menjadi bahasa yang dapat ditentukan. Jika saya melihat kode Anda, saya akan di dokumentasi mencari apa _ itu, sampai saya menyadari itu hanya boneka. Tidak ada yang salah dengan DUMMY, $ DUMMY, terserah.

Homolka yang kaya
sumber
0

Saya akan menghindari garis bawah pada awal vars kecuali Anda yakin mereka tidak cenderung menunjukkan sesuatu yang lain dalam bahasa tertentu atau kerangka kerja yang banyak digunakan. Misalnya, dalam Python, garis bawah ganda cenderung menunjukkan var ajaib. Di JQuery dan pustaka JS lainnya, garis bawah tunggal cenderung mengindikasikan fallback var untuk namespace yang ditimpa. Ini juga merupakan konvensi penamaan populer untuk menyertakan file yang pada gilirannya cenderung membawa ke kode yang menangani menyertakan dalam bentuk var.

Erik Reppen
sumber