Apa yang Anda lakukan ketika konvensi penamaan Anda berbenturan dengan bahasa Anda?

14

Oke, ini adalah salah satu hal kecil yang selalu mengganggu saya. Saya biasanya tidak menyingkat pengidentifikasi, dan satu-satunya waktu saya menggunakan pengidentifikasi pendek (misalnya, i) adalah untuk loop ketat. Jadi itu mengganggu saya ketika saya bekerja di C ++ dan saya memiliki variabel yang perlu dinamai operatoratau classdan saya harus bekerja di sekitarnya atau menggunakan singkatan, karena akhirnya mencuat. Peringatan: ini mungkin terjadi pada saya secara tidak proporsional karena saya banyak bekerja dalam desain bahasa pemrograman, di mana objek domain dapat mencerminkan konsep dalam bahasa host dan secara tidak sengaja menyebabkan bentrokan.

Bagaimana Anda menangani ini? Singkatan? ( op) Salah mengeja? ( klass) Sesuatu yang lain? ( operator_)

Jon Purdy
sumber
7
Selain dari namespacing mungkin kita harus mempertimbangkan mengubah konvensi penamaan kita? Maaf untuk yang sudah jelas.
Chris
1
@ Chris: Anda tidak pernah bisa mempercayai seorang programmer untuk mewujudkan yang jelas! (Meskipun dalam hal ini saya punya.)
Jon Purdy
7
Jika ada alasan untuk menyukai $varsintaks PHP , ini dia.
Joey Adams
3
@ Joey Adams: Saya tersenyum singkat ketika saya melihat pertanyaan ini dan ingat semua pertanyaan PHP bashing mengambang di sekitar SE.
Chris
3
Jelas, ubah kode sumber bahasa untuk memungkinkan konvensi penamaan saya. Ini juga memiliki manfaat "melindungi" kode saya karena hanya akan menjalankan / kompilasi pada juru bahasa / kompiler saya.
dietbuddha

Jawaban:

21
  1. Terima bahwa Anda mungkin harus membuat perubahan kecil pada konvensi penamaan Anda, seperti menambahkan huruf besar. Lebih baik menerima ini sesegera mungkin sehingga semua kode selanjutnya konsisten.

  2. Pertimbangkan untuk lebih spesifik. Kata kunci cenderung cukup luas, sehingga mempersempit classbawah untuk demonstrationClasstidak hanya bekerja di sekitar masalah tetapi juga meningkatkan keterbacaan.

Maxpm
sumber
10

Itu bukan sesuatu yang saya temui, tetapi jika saya berada dalam situasi seperti itu, saya akan mencoba menyelesaikannya dengan opsi berikut, secara berurutan.

  1. Cobalah untuk menemukan sinonim.
  2. (terutama untuk variabel) mencoba mencari awalan atau postfix
  3. (terutama untuk kelas) ubah huruf pertama menjadi huruf besar dan lupakan aturan pengkodean bahwa nama tidak boleh berbeda hanya dalam kasus. Opsi ini, saya mungkin hanya akan menggunakan jika konflik dengan kata kunci.
  4. Gunakan singkatan.
Bart van Ingen Schenau
sumber
1
Saya tidak melihat apa yang salah dengan nama yang berbeda hanya dalam kasus, terutama dalam daftar argumen di mana parameter tipe const Foo&tidak memiliki nama lengkap yang masuk akal selain foo. Memang, mungkin lebih baik untuk memberikan Foonama yang lebih deskriptif daripada foojika itu hidup di badan fungsi dan melayani tujuan yang kurang terspesialisasi.
Jon Purdy
@ Jon - Saya setuju, meskipun secara pribadi saya cenderung ke arah awalan "p_", "l_" dan "m_" daripada beragam kasus. Saya mengadopsi konvensi itu karena masalah semua-memiliki-nama-sama-jelas. Konvensi mana yang Anda gunakan untuk menangani hal ini sebagian besar tidak relevan selama Anda menggunakannya secara konsisten dalam konteks tertentu, tentu saja - pendekatan yang bervariasi-kasus tentu digunakan cukup luas sehingga sebagian besar pengembang harus mengenalinya.
Steve314
@ Jon - komentar itu berbunyi seperti saya selektif menerapkan konvensi hanya ketika saya memiliki masalah dengan nama yang sama, yang bukan itu yang saya maksud. Masalah konteks berkaitan dengan bahasa, proyek, dll. Konvensi dirancang agar masalah tidak menjadi masalah setiap kali terjadi (atau lebih tepatnya tidak), tidak untuk diterapkan secara selektif sesuai kebutuhan.
Steve314
@ Steve314: Saya mendapatkan makna Anda dari komentar pertama. Saya tidak tahu, imbuhan seperti itu selalu terasa agak terlalu dekat dengan Sistem Hungaria untuk kenyamanan saya.
Jon Purdy
@ Jon: Ini bukan aturan saya berlaku agama, tapi saya menemukan bahwa lebih mudah untuk membuat kesalahan jika dua pengidentifikasi hanya berbeda dalam kasus. Beberapa kesalahan tersebut akan terlihat oleh kompiler, beberapa jauh lebih sulit ditemukan (terutama jika kedua pengidentifikasi menyebutkan hal yang sama). Saya lebih suka memiliki satu aturan umum, dengan pengecualian kasus per kasus, daripada satu aturan buku lengkap yang mencakup semua kasus yang mungkin.
Bart van Ingen Schenau
6

Bahasa menang; Anda tidak bisa mengakali kompiler (mengabaikan kekejian seperti PL / 1 IF IF = THEN THEN THEN = ELSE ELSE ELSE = IF END, tetapi kemudian PL / 1 tidak akan membuat Anda mengajukan pertanyaan sejak awal). Pada dasarnya, Anda harus mengikuti aturan bahasa, dan Anda harus menemukan alternatif kata kunci bahasa untuk Anda gunakan sendiri - atau menemukan bahasa alternatif.

Jadi, kecuali dalam keadaan yang sangat tidak biasa, Anda beradaptasi dengan bahasa, bukan sebaliknya.

Jonathan Leffler
sumber
5

Alih-alih menyingkat bagaimana tentang pemanjangan? Jika Anda menerapkan konstruksi kelas dalam bahasa Foo, bagaimana dengan menggunakan FooClass dan foo_class? (Modulo apa pun preferensi casing Anda).

Winston Ewert
sumber
Apakah Anda akan awalan "java" pada setiap pengenal yang Anda gunakan dalam kode Java? Dan mari kita bahkan tidak menyebutkan masalah dengan awalan "C ++" pada setiap pengidentifikasi ...
Steve314
@ Steve314, Anda tidak akan menggunakan awalan java dalam kode java, Anda akan menggunakan awalan java dalam kode c ++ yang mengimplementasikan kompiler java. Selain itu, Anda hanya akan menggunakannya jika pengidentifikasi lainnya adalah kata kunci.
Winston Ewert
Oke - maksud Anda memanjang secara umum, karena lebih spesifik apa yang disebut pengenal juga. Untuk aplikasi yang berbeda, "class" dapat diubah namanya menjadi "class_taught" atau "class_of_animal" atau "classiness_value" atau apa pun. Saya setuju - Saya baru saja menemukan contoh berorientasi compiler membingungkan.
Steve314
5

Beberapa singkatan yang saya gunakan untuk class, berdasarkan frekuensi:

  • cls
  • clss
  • clazz
  • theClass
  • aClass

Jika saya tahu kelas apa yang Classdiwakilkan oleh instance, saya mungkin memasukkannya dalam nama variabel:

  • stringClass = Class.forName("java.lang.String");
Mike Clark
sumber
Belum pernah melihat 'cls' untuk itu sebelumnya. Saya kebanyakan menggunakan aClass.
Konstantin Petrukhnov
4

Dalam C dan C ++, kata kunci semuanya huruf kecil dan bahasanya peka terhadap huruf besar-kecil, jadi tekan tombol shift dari waktu ke waktu dan banyak masalah hilang.

Di Modula 2, kata kunci semuanya huruf besar - tetapi selama pengidentifikasi Anda memiliki beberapa huruf kecil perbedaannya jelas dan bentrok mustahil.

Juga, konvensi penamaan mutlak sampai batas tertentu perlu mencerminkan konvensi normal dari bahasa yang Anda gunakan, jadi saya pasti akan menulis "myClass" di Jawa di mana saya lebih mungkin menulis "My_Class" di C ++.

Pada dasarnya, Anda tidak hanya menulis untuk kompiler, tetapi apa yang orang dapat baca tergantung pada konteks dan harapan terkait.

Steve314
sumber
3
Bahkan untuk bahasa yang peka terhadap huruf besar-kecil, saya merasa telah mencampurkannya classdan Classakan merusak pembacaan kode.
Karmastan
@Karmastan - mungkin itu tergantung pada berapa banyak waktu yang Anda habiskan untuk bekerja dengan bahasa dan konvensi yang peka terhadap huruf besar-kecil. Secara pribadi, huruf besar vs. huruf kecil "C" secara visual sangat jelas - saya melihat pola penggunaan case untuk pengidentifikasi panjang lebih cepat daripada yang saya bisa membacanya.
Steve314
3

Saya tidak sering mengalami hal ini, tetapi ketika saya melakukannya cenderung tidak menjadi masalah karena saya menggunakan Delphi dan ini memungkinkan Anda untuk mengatasi masalah ini dengan menambahkan & ke pengidentifikasi. Jadi "kelas" bukan pengidentifikasi yang valid, tetapi "& kelas" adalah.

Mason Wheeler
sumber
Menarik. Saya memiliki utilitas penghasil kode yang memungkinkan string literal di mana saja pengidentifikasi dapat digunakan. Awalnya, sebagian besar pengidentifikasi untuk kode yang dihasilkan ditulis sebagai string literal untuk menghindari risiko bentrok kata kunci dengan DSL yang tumbuh (dan kaya kata kunci). Sekarang, pengidentifikasi digunakan untuk sebagian besar nama (yang mengejutkan betapa jauh lebih mudah dibaca sumbernya seperti itu), tetapi string literal selalu tersedia sebagai fallback. Saya pikir itu baik untuk pembuatan kode, tetapi penyelesaian kata kunci-clash akan menjadi ide yang buruk dalam bahasa tujuan umum - tapi mungkin saya salah.
Steve314
2

Saya akan menambahkan semacam namespacing ke nama variabel. Sebagai contoh, misalkan Anda memiliki pengguna bernama modul maka saya akan memodifikasi nama variabel operator menjadi sesuatu seperti user_operator atau userOperator.

Pemda
sumber
2
jangan gunakan "smooth", "no", atau "my" sebagai awalan
Steven A. Lowe
2
Benar. Saya memilih "Jon_Purdys_Carefully_Chosen_Identifier_Prefix_".
Steve314
1
@Steven: Lebih buruk lagi, saya melihat a, andan thedigunakan dengan mengganggu frekuensi dengan pemula siswa CS.
Jon Purdy
1
@ Jon Purdy, itu bukan salah kami! Salahkan profesor yang memutuskan untuk memberi nama instance mereka dari class People () aPerson.
Ben L
@ Jon: Konvensi penamaan tempat saya bekerja menetapkan bahwa variabel lokal harus dimulai dengan aselain dari variabel loop ketat: /
Matthieu M.
2

ubah atau sesuaikan konvensi penamaan saya

Muad'Dib
sumber