Salah eja yang disengaja untuk menghindari kata-kata yang dipesan

45

Saya sering melihat kode yang menyertakan kesalahan ejaan kata-kata umum yang disengaja menjadi lebih baik atau lebih buruk:

  • klassatau clazzuntuk kelas :Class clazz = ThisClass.class
  • kountuntuk hitungan dalam SQL:count(*) AS kount

Secara pribadi saya menemukan ini mengurangi keterbacaan. Dalam praktik saya sendiri, saya belum menemukan terlalu banyak kasus di mana nama yang lebih baik tidak dapat digunakan - itemClassatau recordTotal.

Contoh dari JavaDocs untuk Kelas menunjukkan ini di parameter:

 public <U> Class<? extends U> asSubclass(Class<U> clazz)

Apakah ini menunjukkan penggunaan yang wajar?

Nicole
sumber
9
Sebagai catatan: Dalam Python, clsadalah nama umum (pada kenyataannya, satu idiomatik) untuk variabel / argumen yang meneruskan kelas aktual (yang Anda nyatakan dengan classkata kunci dan yang semuanya merupakan turunan dari).
14
Kamu tidak suka typedef char ínt?
Jeff
14
@ muntoo Anda benar. Saya juga mendapatkan kesalahan kompilator untuk iñt. Ada rencana saya untuk dominasi dunia.
Jeff
1
Saya telah melanggar aturan ini ... dan sekarang saya merasa malu.
jmq
3
Jangan lakukan itu. Jujur saya bisa mengatakan bahwa saya belum pernah melihat ini sebelumnya, dan jika saya lakukan, saya akan segera mengganti nama. Cukup singkat jika Anda harus menggunakan nama variabel non-deskriptif ( Class c).
Cody Grey

Jawaban:

63

IMHO, ini ide yang sangat buruk. Kata-kata yang dicadangkan dicadangkan karena suatu alasan, dan melakukan hal ini mengurangi keterbacaan.

Saya juga sepenuhnya setuju dengan poin kedua Anda. Memberi nama variabel class, bahkan jika Anda bisa melakukannya, akan sama buruknya dengan memberi nama tmpatau a. Kelas macam apa? Kelas apa? Nama harus deskriptif.

Dima
sumber
15
"Kata-kata yang dicadangkan dicadangkan untuk suatu alasan" <- Ini. (Yang, ironisnya, dicadangkan.)
trycatch
16
Memberi +1 karena Anda benar. Tetapi jika Anda menulis perangkat lunak penjadwalan kelas, atau sesuatu, kelas mungkin variabel yang sah atau nama kelas ...
CaffGeek
8
Meh " Kata-kata yang dicadangkan dicadangkan karena suatu alasan ", yaitu bahwa perancang bahasa malas. Ada beberapa bahasa canggih di mana kata-kata hanya disediakan di tempat-tempat tertentu di mana mereka digunakan. Tapi Ritchie memulai tren ini ketika dia membutuhkan kompiler ringan untuk C, dan sebagian besar desainer bahasa telah mempelajarinya dari sana.
Ross Patterson
14
tidak Ross, itu karena programmer (dan pembaca pada umumnya) memiliki harapan hal-hal memiliki makna yang cukup jelas (itulah sebabnya belajar bahasa asing sering sangat sulit, semua hal dengan makna ganda, atau makna yang berbeda dari bahasa yang Anda besarkan sejak kecil di mana Anda tidak pernah melihat ambiguitas itu karena mereka adalah bagian dari warisan budaya Anda).
jwenting
3
@AlexanderMorou Tidak, dan tidak memiliki sebagian besar perancang bahasa, mereka hanya memulai dengan desain orang lain. Tetapi lihatlah Algol, Fortran, PL / I, Rexx, dan bahasa lain yang tidak berdasarkan pada C, dan Anda akan melihat bahwa tata bahasa tanpa kata-kata yang dilindungi tentu saja mungkin, hanya saja lebih sulit. Ritchie punya alasan yang bagus - orang-orang Unix merasa setiap keystroke penting, dan pada PDP-11, setiap siklus CPU menjadi masalah. Hari ini? Tidak terlalu banyak.
Ross Patterson
21

Panduan Gaya Python menyebutkan masalah ini secara khusus, dan menyarankan:

Jika nama atribut publik Anda bertabrakan dengan kata kunci yang dipesan, tambahkan satu garis bawah garis bawah pada nama atribut Anda. Ini lebih disukai daripada singkatan atau ejaan yang rusak.

Ini sepertinya aturan umum yang cukup bagus, dengan asumsi itu tidak bertentangan dengan semantik bahasa tertentu.

Ryan
sumber
7
Saya merasa ini saran yang sangat buruk dari panduan gaya. Jika nama atribut Anda sangat dekat dengan kata kunci, Anda harus menemukan nama yang lebih baik. Cukup menempelkan garis bawah pada bagian akhir tidak menambah arti dan membuatnya cenderung membingungkan orang berikutnya yang membaca kode.
Wayne Johnston
18
@Wayne: Bagaimana Anda akan menamai operasi serikat dalam struktur serikat-temukan kapan unionkata kunci (seperti dalam C)? Apakah Anda akan menyebutnya foohanya karena seharusnya tidak terlihat seperti itu union?
Fred Foo
OTOH, clsadalah nama argumen standar untuk metode kelas. Juga misalnya dalam objek Django memiliki .idatribut, yang tentu saja bertentangan dengan idfungsi bawaan.
vartec
1
@ GoloRoden Saya belum pernah mendengar ada yang mengatakan mereka "menyatukan" dua set ketika menghitung serikat. Itu bukan bagian dari istilah. "Gabung" akan lebih baik, tetapi suatu mergemetode masih membutuhkan dokumentasi yang secara eksplisit menyatakan bahwa ia menerapkan serikat pekerja dan diganti namanya karena alasan teknis semata.
Fred Foo
2
@GoloRoden Menurut Merriam-Webster itu bukan kata kerja, tetapi lihat jawaban ini .
maaartinus
18

Bau kode.

string stringVariable = "";

Kode di atas tidak memberi tahu saya apa pun tentang penggunaan variabel yang dimaksudkan.

class Klass

Permasalahan yang sama

string UserNameString = "bmackey"

Kode di atas seharusnya tidak memerlukan string kata kunci ditambahkan ke nama variabel. Jika Anda perlu mengidentifikasi jenis berdasarkan nama variabel, kode Anda terlalu panjang. Kondensasi-refactor.

P.Brian.Mackey
sumber
Itu tidak memberi tahu Anda apa-apa karena itu bukan "kode", ini adalah deklarasi variabel yang terisolasi. "Kelas" atau "klass" mungkin memberi tahu Anda semua yang perlu Anda ketahui. Misalnya, metode generik dapat menerima Class<T>parameter, dan ini masuk akal. Jadi saya tidak setuju bahwa ini bau kode.
Andres F.
5

Secara pribadi, saya pikir ini adalah opsi yang sangat valid untuk gaya kode Anda.

Itu adalah kata-kata yang dicadangkan sehingga kompiler tidak harus memutuskan apakah yang Anda maksud adalah mekanik bahasa atau variabel Anda. Dengan mengingat hal itu, itu menyiratkan bahwa mereka mengharapkan orang memiliki kebutuhan untuk variabel seperti kata yang dipesan.

Akan melalui sumber yang dibundel dengan JDK 1.6 R21, saya menemukan 917 kemunculan "clazz". Ternyata, mereka menganggap itu gaya yang bisa diterima.

Bagaimana perasaan tim Anda tentang hal itu? Jika Anda berpikir itu buruk, tetapi 9 orang lain di tim Anda berpikir itu baik, maka Anda harus menggigit peluru dan menerimanya. Selama ada komunikasi tentang apa yang baik dan apa yang tidak, dan Anda membawa masalah yang Anda lihat seperti yang Anda lihat, itu akan baik-baik saja.

Bagaimana tim Anda merasa tentang gaya kode lebih penting daripada pendapat saya, atau orang lain di posting ini . Itu berlaku untuk ini dan keputusan gaya kode lainnya yang mungkin Anda miliki.

corsiKa
sumber
1
Benar, tetapi akhirnya tim Anda akan berubah. Bertahun-tahun di jalan akan ada beberapa orang miskin melihat kode Anda penuh dengan klass dan clazzes dan berkata "WTF!".
MrFox
4
Jika Anda menggunakan keduanya klassdan clazzitu hal yang buruk. Anda harus konsisten sehingga mereka hanya perlu mempelajarinya sekali saja. Dan idealnya ini dijabarkan dalam pedoman gaya tim juga, jadi itu tidak terlalu mengejutkan.
corsiKa
Kode ditulis tidak hanya untuk orang-orang di tim Anda, tetapi untuk dibaca oleh seluruh dunia. Ketika tim Anda semua berada di bus yang melewati tebing, orang lain akan mulai membaca kode. Gunakan nama-nama yang secara lengkap dan ringkas menggambarkan variabel itu, bukan bagaimana itu direpresentasikan.
Rob K
1
Tidak, tidak. Tim Anda jauh, jauh lebih mungkin untuk memutar anggota secara perlahan seiring waktu. Anda dapat merencanakan untuk satu orang tertabrak bus, tetapi Anda tidak dapat merencanakan seluruh tim Anda ditabrak bus. Sebagian besar kode ditulis untuk mungkin selusin orang yang perlu membacanya, setengah dari mereka selama tinjauan kode.
corsiKa
4

Salah eja yang disengaja untuk menghindari kata-kata yang dipesan adalah ide yang buruk.

  • Salah ejaan sulit dibedakan dari ejaan yang benar, karena itu membuat kode lebih sulit dibaca.

  • Kesalahan mengeja sulit untuk diingat, sehingga beberapa kesalahan ejaan yang tidak konsisten cenderung bersaing dalam kode, yang membuat kode lebih sulit untuk ditulis dan lebih sulit untuk dibaca.

  • Kata-kata yang dicadangkan mengacu pada bahasa yang digunakan untuk memecahkan masalah, bukan masalah itu sendiri. Nama variabel harus menunjuk ke konsep yang terkait dengan masalah.

Oleh karena itu lebih baik untuk memilih alternatif, nama deskriptif, atau jika tidak ada alternatif yang memuaskan, untuk memenuhi syarat kata yang dipesan seperti pada:

public static Method findBenchmarkMethod(BenchmarkRecord benchmark) {
    Class<?> benchmarkedClass = ClassUtils.loadClass(benchmark.generatedClass());
    return findBenchmarkMethod(benchmarkedClass, benchmark.generatedMethod());
}
pengguna40989
sumber
3

Class clazzbaunya seperti "Saya tidak repot-repot mencoba datang dengan nama baik". Suatu variabel selalu mewakili sesuatu, dan nama yang baik menggambarkan hal itu. Saya menolak membayangkan bahwa clazzmisalnya dalam keadaan apa pun adalah nama terbaik. Apakah itu referensi ke kelas -> class_reference, adalah salinan objek kelas -> class_copy, dll. Mungkin juga menjatuhkan "class" dan hanya menggunakan kata deskriptif, misalnya

java.lang.SecurityManager.checkMemberAccess(Class<?> clazz, int which)
Parameters
    clazz -- the class that reflection is to be performed on.

Di sini clazz adalah kelas target tempat pemeriksaan dilakukan, jadi

checkMemberAccess(Class<?> target, int which)

akan lebih baik menggambarkan parameter apa yang digunakan untuk daripada yang akan pernah dilakukan clazz.

hlovdal
sumber
IMHO itu tidak lebih baik, Anda bisa menyebutnya 'classToBeAccessed` atau apa pun, tetapi nama yang lebih deskriptif hanya menunjukkan yang jelas. Saya suka nama panjang hanya jika mereka memberikan informasi yang bermanfaat.
maaartinus
1
classToBeAccessedadalah nama baik memang ( classToBeCheckedakan mungkin lebih baik).
hlovdal
1

Jika mereka menggunakan nama yang dicadangkan untuk suatu variabel, itu adalah variabel dengan nama buruk. Bahkan jika itu adalah nama yang sah, seperti perangkat lunak Kelas untuk kelas.

Variabel yang namanya buruk adalah tanda kode yang dipikirkan dengan buruk atau kode biasa - berhati-hatilah terhadap gotcha lain dalam Bagian Perangkat Lunak yang Anda pelihara.

thursdaysgeek
sumber
0

Saya pikir salah eja atau singkatan yang disengaja adalah ide yang baik jika digunakan dengan hati-hati dan konsisten .

Pertimbangkan di Jawa:

class X { public X() { } }
X x = new X();
x.getClass;  // Wha?  How does "get" help anything?
x.class;     // Best, but requires more lexer/parser work
x.klass;     // At least as good as getClass
x.clazz;     // Same

Tempat untuk menggunakan salah eja adalah tempat kata yang dicadangkan jelas merupakan kata terbaik untuk pekerjaan itu. Ada dua tempat untuk tidak menggunakan salah eja di mana Anda mungkin tergoda.

  1. Anda tidak ingin memikirkan nama baik
  2. Anda hanya ingin variabel dummy dan tidak perlu nama deskriptif

Dalam kasus pertama, cukup jelas bahwa kemalasan jarang merupakan kebijakan yang baik untuk membuat kode kualitas. Dalam kasus kedua, pilih variabel yang sangat pendek. Itulah yang dilakukan ahli matematika sepanjang waktu, dan programmer melakukan untuk indeks. Tidak ada alasan untuk membatasi diri Anda melakukan ini untuk indeks jika itu hanya variabel dummy:

boolean isMyName(String testName) { return myName.equals(testName); }
boolean isMyName(String s) { return myName.equals(s); }

Date nextMeeting(Klass klass) { return /* something */ }
Date nextMeeting(Klass k) { return /* something */ }

Anda tidak kehilangan apa pun dengan nama variabel pendek ketika metode atau struktur kode memberi tahu Anda apa yang harus ada di sana.

Rex Kerr
sumber
2
Maaf, saya tidak bisa setuju. Bagaimana tepatnya cara kerja Tweet berikutnya? Logikanya tidak jelas. Anda memaksa saya untuk mencari definisi Klass setiap kali saya membaca kode Anda karena namanya tidak ada artinya. Seandainya Anda memiliki nextMeeting (MeetingRoom meetingRoom), saya akan memiliki satu kelas yang lebih sedikit (klass? Clazz?) Definisi untuk dibaca dan dengan demikian menjadi lebih produktif. Kode dibaca jauh lebih banyak daripada yang tertulis.
MrFox
@suslik - nextMeeting(MeetingRoom r)banyak. Apa yang meetingRoommembawamu ke sana? Jika nextMeeting(int meetingRoom)saya mengerti, tetapi poin saya adalah menggunakan nama variabel pendek ketika informasi tersebut sudah tersedia dari sumber lain .
Rex Kerr
Posting saya lebih tentang keberadaan Klass di basis kode. Saya setuju dengan nama-nama variabel pendek kadang-kadang, tetapi jika metode Anda lama dan Anda saya harus terus srcolling untuk memastikan bahwa "r" adalah MeetingRoom maka itu tidak bagus juga. Saya ingin tahu apa kelemahan dari meetingRoom? Ruang horisontal? Terlalu lama mengetik?
MrFox
@suslik - Ya, Anda kehilangan konteks horisontal dengan nama variabel yang panjang. Anda kehilangan konteks vertikal dengan metode panjang, jadi yang terbaik adalah mencoba menghindarinya (tapi saya setuju jika Anda tetap melakukannya, Anda mungkin ingin nama variabel Anda menjadi pengingat yang lebih baik). Klassadalah alternatif ketika ada kata yang dipesan . Saya tidak menyarankan menggunakan salah mengeja saat ejaan asli tersedia!
Rex Kerr
0

Saya telah melihat kegunaan yang sah Class klassketika melakukan refleksi di mana Anda benar-benar bekerja dengan instance Classkelas.

Matius
sumber
2
Pertanyaannya bukanlah apakah ada kasus di mana Anda memiliki instance, tetapi apakah Anda harus menggunakan ejaan itu, atau nama yang lebih deskriptif seperti userClassatau beberapa opsi lainnya.
Nicole
2
Dalam hal demikian saya lebih suka classInstancelebih klass.
Konrad Morawski
2
@KonradMorawski: Tapi semua objek yang Anda kerjakan adalah instance, jadi classInstancecukup berlebihan. Selain itu, saya bisa membayangkan sesuatu seperti class klass; Object classInstance = klass.newInstance;.
maaartinus
0

Saya sering melihat kode yang menyertakan kesalahan ejaan kata-kata umum yang disengaja menjadi lebih baik atau lebih buruk:

klass atau clazz untuk kelas: Class clazz = ThisClass.class

kount untuk hitung dalam SQL: count (*) AS kount

Secara pribadi saya menemukan ini mengurangi keterbacaan. Dalam praktik saya sendiri, saya belum menemukan terlalu banyak kasus di mana nama yang lebih baik tidak dapat digunakan - itemClass atau recordTotal.

Namun, itu sangat umum sehingga saya tidak bisa tidak bertanya-tanya apakah saya satu-satunya? Adakah yang punya saran atau bahkan lebih baik, rekomendasi yang dikutip dari programer yang dihormati tentang praktik ini?

Untuk variabel lokal dan argumen formal, itu tidak masalah.

Nama apa pun boleh saja asalkan tidak sengaja menyesatkan atau mengganggu. Dalam contoh Anda:

public static Method findBenchmarkMethod(BenchmarkRecord benchmark) {
    Class<?> clazz = ClassUtils.loadClass(benchmark.generatedClass());
    return findBenchmarkMethod(clazz, benchmark.generatedMethod());
}

tidak masalah apakah variabel lokal tunggal adalah "clazz" atau "klass" atau "cls" atau hanya "c". Saya mungkin hanya akan menyejajarkan ungkapan:

return findBenchmarkMethod(ClassUtils.loadClass(benchmark.generatedClass()),
                           benchmark.generatedMethod());

Panjang nama variabel harus terkait dengan ruang lingkup variabel. Untuk variabel lokal dalam metode pendek (dan semuanya harus pendek), nama yang sangat pendek baik-baik saja.

kevin cline
sumber
inline Anda terlihat salah ClassUtils.loadClass(benchmark.generatedClass())=> benchmark.generatedClass()- hilang ClassUtils.loadClasssepanjang jalan
nyamuk
0

Saya pikir salah eja selalu merupakan ide yang buruk. Itu tidak baik pada pembaca Anda. Saya, misalnya, akan bertanya-tanya apakah saya melewatkan sesuatu ketika saya melihat kata itu klass. (Apakah yang mereka maksudkan class, atau apakah yang mereka maksudkan adalah bajak laut?) Setidaknya bagi saya, semua salah eja yang saya kenal menjengkelkan.

Untuk beberapa kasus, di mana kata yang dipesan benar-benar satu-satunya hal penting yang diketahui tentang variabel, saya akan menggunakan alternatif berikut:

  • Jika itu argumen fungsi, gunakan aClasssebagai ganti class.

  • Jika itu variabel lokal atau anggota, gunakan myClasssebagai ganti class.

  • Jika itu accessor, gunakan getClass()sebagai ganti class().

Tentu saja, awalan yang ditambahkan tidak ada gunanya, dan akibatnya hanya akan digunakan sebagai upaya terakhir. Tapi setidaknya itu tidak mengganggu pengurai mental pembaca Anda, dan itu adalah cara yang gagal untuk menghindari kata-kata yang dicadangkan.

cmaster
sumber
0

Satu manfaat untuk pengejaan kreatif, adalah kemampuan pencarian yang lebih baik. Saya pikir jauh lebih mudah untuk melakukan pencarian kode lengkap untuk hal-hal unik, daripada kata-kata umum, di mana terlalu sering Anda akan menemukan semua hal yang salah, dan 1000 di antaranya. Sebagai contoh, saya dulu memiliki kzpg.com. Google yang sekarang dan Anda akan melihat hanya beberapa hit. Ini unik dan karenanya sangat mudah ditemukan.

Tetapi untuk ukuran saya pikir pertanyaan ini adalah salah satu pendapat lebih dari substansi. Saya pribadi tumbuh di Forth di mana itu semua tentang kata-kata, dan banyak dari mereka. Seseorang belajar menjadi sangat kreatif untuk menyelamatkan jari-jarinya. Pada akhirnya saya memiliki sekitar 640.000 karakter, lebih atau kurang di basis sumber saya. Jadi, menjaga kata-kata pendek penting untuk menyelesaikan pekerjaan.

Pandangan elips
sumber
Tautan itu rusak sekarang.
Peter Mortensen