Bagaimana memberi nama sesuatu ketika opsi logis adalah kata kunci yang dipesan? [Tutup]

64

Kadang-kadang, nama yang paling logis untuk sesuatu (misalnya variabel) adalah kata kunci yang dipesan dalam bahasa atau lingkungan pilihan. Ketika tidak ada sinonim yang sama sesuai, bagaimana satu nama itu?

Saya membayangkan ada heuristik praktik terbaik untuk masalah ini. Ini dapat disediakan oleh pencipta atau gubernur bahasa dan lingkungan pemrograman. Misalnya, jika python.org (atau Guido van Rossum) mengatakan bagaimana menghadapinya dengan Python, itu akan menjadi pedoman yang baik dalam buku saya. Tautan MSDN tentang cara menghadapinya dalam C # akan lebih baik juga.
Atau, pedoman yang diberikan oleh influencer utama dalam rekayasa perangkat lunak juga harus berharga. Mungkin Google / Alphabet memiliki panduan gaya yang bagus yang mengajarkan kita bagaimana menghadapinya?

Berikut ini hanya sebuah contoh: dalam bahasa C #, "default" adalah kata kunci yang dipesan. Ketika saya menggunakan enum, saya mungkin ingin memberi nama nilai default "default" (analog dengan pernyataan "switch"), tetapi tidak bisa.
(C # peka huruf besar kecil, dan konstanta enum harus dikapitalisasi, jadi "Default" adalah pilihan yang jelas di sini, tapi mari kita asumsikan panduan gaya kita saat ini menentukan semua konstanta enum harus huruf kecil.)
Kita dapat mempertimbangkan kata "defaultus ", tapi ini tidak mematuhi Prinsip Terkecilnya Kekaguman . Kita juga harus mempertimbangkan "standar" dan "awal", tetapi sayangnya "default" adalah kata yang secara tepat menyampaikan tujuannya dalam situasi ini.

Pelindung satu
sumber
15
Saya akan menggunakan sesuatu seperti "default_value". Artinya tetap sama, tetapi Anda harus mengetik beberapa karakter lagi.
Mael
26
@ Arkhogg jika saya menemukan salah satu dari mereka dalam kode saya, saya akan segera mengubahnya. Kesalahan pengejaan atau pelanggaran penamaan konvensi tidak dapat diterima.
MetaFight
26
@MetaFight - kecuali di Java, memanggil variabel yang memegang kelas clazzpraktis merupakan standar de-facto. Ini pada dasarnya adalah bagian dari konvensi penamaan platform. Melakukan hal lain akan melanggar harapan bahwa orang lain mungkin membaca kode Anda, jadi hanya boleh dilakukan jika benar-benar diperlukan.
Periata Breatta
6
default sebagai nilai enum tampaknya kontra-produktif. Itu harus nama domain khusus yang menggambarkan default. Namun, harus ada metode untuk mengembalikan default.
qwerty_so
18
@AndresF. Saya tidak setuju. Saya sering merasa sangat mudah untuk berdebat dengan para desainer Jawa. Saya tidak menentang mereka. Mereka bekerja di barat liar.
MetaFight

Jawaban:

63

Untuk opsi enum, Anda harus menggunakan case title like Default. Karena C # peka huruf besar-kecil, ia tidak akan bertabrakan dengan kata kunci yang dipesan. Lihat . Panduan Penamaan Net .

Karena semua anggota publik harus menjadi judul huruf dalam .net, dan semua nama yang dipesan adalah huruf kecil, Anda seharusnya tidak benar-benar menemukan ini kecuali dengan variabel lokal (termasuk parameter). Dan penduduk setempat biasanya memiliki kata benda atau frasa sebagai nama, sehingga sangat jarang nama yang paling alami akan bertabrakan dengan kata kunci. Misalnya. defaultValuebiasanya akan menjadi nama yang lebih alami daripada default. Jadi dalam praktiknya ini bukan masalah besar.

Di C # Anda dapat menggunakan @awalan " " untuk keluar dari kata kunci yang dilindungi sehingga mereka dapat digunakan sebagai pengidentifikasi (seperti @default). Tapi ini hanya boleh digunakan jika Anda benar-benar tidak memiliki pilihan lain, yaitu jika Anda berinteraksi dengan perpustakaan pihak ketiga yang menggunakan kata kunci yang dipesan sebagai pengenal.


Tentu saja bahasa lain memiliki sintaks dan kata kunci yang berbeda dan karena itu solusi yang berbeda masalah ini.

SQL memiliki cukup banyak kata kunci, tetapi sangat umum untuk melarikan diri dari pengidentifikasi, seperti [Table]. Beberapa bahkan melakukannya untuk semua pengidentifikasi, terlepas dari apakah mereka berbenturan dengan kata kunci atau tidak. (Lagi pula, kata kunci yang berbenturan dapat diperkenalkan di masa depan!)

Powershell (dan banyak bahasa scripting lainnya) mengawali semua variabel dengan sigil seperti $ yang berarti mereka tidak akan pernah bertabrakan dengan kata kunci.

Lisp tidak memiliki kata kunci sama sekali, setidaknya tidak dalam arti konvensional.

Python memiliki konvensi yang diakui secara resmi di PEP-8 :

Selalu gunakan cls untuk argumen pertama ke metode kelas.

Jika nama argumen fungsi bentrok dengan kata kunci yang dicadangkan, umumnya lebih baik untuk menambahkan garis bawah garis tunggal daripada menggunakan singkatan atau ejaan korupsi. Dengan demikian class_ lebih baik daripada clss. (Mungkin lebih baik menghindari bentrokan semacam itu dengan menggunakan sinonim.)

Beberapa bahasa seperti Brainfuck atau Whitespace sama sekali tidak mendefinisikan kata-kata, menghindari masalah secara elegan.

Singkatnya tidak ada jawaban bebas bahasa untuk pertanyaan Anda, karena sangat tergantung pada sintaksis dan konvensi bahasa tertentu.

JacquesB
sumber
2
Namun, Anda sebaiknya tidak mengandalkan sensitivitas case saja. Meskipun tidak mungkin menjadi masalah dalam praktiknya, tidak semua bahasa .NET peka huruf besar-kecil, sehingga Anda mungkin mengalami masalah yang tidak terduga pada beberapa titik.
Vivelin
6
@Vivelin: Anda tidak boleh memiliki anggota publik atau mengetik nama yang hanya berbeda dalam kasus, karena ini dapat menyebabkan masalah untuk bahasa lain. Tetapi ini tidak terkait dengan apa yang saya sarankan, karena kata kunci bukan pengidentifikasi (dan bahasa lain akan memiliki kata kunci lain).
JacquesB
Bahkan jika sintaks @ tersedia, itu IMHO terbaik dicadangkan untuk skenario di mana kita perlu berinteraksi dengan perpustakaan bahasa tertulis dengan kata kunci yang berbeda. Bahkan di sana, saya pikir mungkin lebih baik untuk memiliki fitur bahasa agak seperti #define, tetapi operan tangan kanan akan selalu ditafsirkan sebagai pengidentifikasi case-sensitive. Itu akan memungkinkan banyak jenis konflik penamaan untuk diselesaikan (termasuk, untuk bahasa yang tidak peka terhadap kasus, impor simbol yang identik kecuali untuk kasus).
supercat
@Vivelin tidak semua bahasa .NET peka huruf besar-kecil - Saya tahu VB.NET dan Powershell; apakah ada yang lain
Zev Spitz
@ZevSpitz OP secara khusus memanggil C #, itulah sebabnya saya pikir Vivelin menggunakannya sebagai contohnya, namun seperti yang Anda katakan VB.NET tidak peka terhadap huruf besar-kecil, jadi seperti biasa, saya akan berpikir itu akan turun ke basis per bahasa . Tidak semua bahasa memiliki kata cadangan yang sama
Shaggy13spe
22

Saya akan menambahkan garis bawah (default_)

Pro:

  • sederhana
  • jelas (mengapa lagi Anda menambahkan garis bawah?)
  • konsisten
  • mudah digunakan
  • bekerja dalam semua bahasa modern yang saya tahu
  • paling dekat dengan opsi logis

Mengapa saya tidak suka solusi lain:

Persamaan Kata:

  • susah untuk dicari
  • seringkali bukan arti yang sama persis (nuansa)

Menambahkan / menambahkan kata:

  • tidak konsisten (defaultValue, defaultItem)
  • meningkatkan verbositas tanpa peningkatan keterbacaan

Mengubah huruf (klik bukan kelas):

  • tidak konsisten (clazz, klass, klazz)

Menambahkan nomor (default1):

  • menimbulkan pertanyaan untuk default2

Menambahkan / Membubuhkan surat:

  • tidak jelas (programmer harus menebak bahwa itu digunakan untuk namecollision dan bukan jalan pintas untuk sesuatu yang lain)

Melarikan Kata Kunci (@default (c #), `default` (scala))

  • hanya mungkin dalam beberapa bahasa
  • fitur yang jarang digunakan, terutama untuk kompatibilitas ke bahasa lain
  • membuatnya lebih sulit digunakan untuk pengguna api Anda (mereka harus tahu cara melakukannya dan ingat cara melakukannya)

Kapan saya tidak menggunakannya:

  • ada, konvensi lain yang banyak digunakan
  • Saya sudah tahu sinonim yang pas
  • dalam kasus enum spesifik Anda, saya akan mengikuti jawaban @ JacquesB
Siphor
sumber
7
Ini adalah solusi yang sering digunakan dalam Python. Saya tidak menganjurkannya sebagai yang paling elegan, tetapi berhasil.
fralau
1
@fralau Python ist sangat buruk - Saya benar-benar benci pengenal seperti "input"
Christian Sauer
Dalam banyak bahasa orang melihat klassuntuk variabel mana classkata yang disediakan. Saya belum pernah melihat defawlttapi itu ide yang sama. Saya lebih suka default_(dan mungkin class_jika tidak menginjak-injak konvensi yang sudah mapan dengan melakukan hal itu).
nigel222
Anda tidak menyertakan opsi untuk keluar dari kata kunci.
CodesInChaos
1
Anda membuat argumen yang masuk akal dan masuk akal, meskipun saya tidak yakin "jelas mengapa garis bawah digunakan". Saya jarang bekerja dengan frood yang tahu semua kata kunci dari bahasa tempat mereka bekerja!
Pelindung satu
18

"Default" mungkin bukan nilai enum yang bermanfaat. Ini mewakili perilaku yang dapat berubah tergantung pada konteks di mana ia digunakan.

Karena itu, jika bahasa Anda peka terhadap huruf besar-kecil, maka gunakan huruf besar untuk kata tersebut. (Default vs default)

Atau lebih baik lagi, buat upaya ekstra untuk mengetik beberapa huruf lagi dan menyebutnya DefaultValue.

Kent A.
sumber
3
Saya setuju. "Default" tidak memberikan indikasi berapa nilainya. Pertimbangkan enum ErrorHandlingLevel { Default = 0, ... }vs enum ErrorHandlingLevel { None = 0, ... }. Dalam contoh kedua, fakta bahwa Nonedefault dapat diketahui dengan menetapkan nilai enum ke 0, menggunakan xmldoc, atau secara eksplisit dalam kode. Anda mendapatkan manfaat tambahan dari mengetahui apa artinya ketika suatu objek ErrorHandlingLeveldiatur None. Bandingkan dengan memeriksa objek dengan ErrorHandlingLevelset ke default.
Harrison Paine
9

Saya akan sangat menyarankan TIDAK mengubah konvensi penamaan secara lokal (atau menambahkan karakter yang tidak berarti) untuk tujuan disambiguasi (seperti yang telah disarankan dalam posting lain). Ini menciptakan kebingungan jika niat tidak jelas dan dapat menimbulkan pertanyaan mengapa itu dinamai demikian. Itu bisa diselesaikan tanpa itu.

Dalam setiap kasus harus dimungkinkan untuk menggunakan kata dengan makna sinonim atau membuat nama lebih spesifik (atau bahkan bertele-tele). Bahkan ketika itu dapat memperkenalkan pengulangan konteks itu mungkin merupakan solusi yang lebih baik.

Misalnya, katakanlah Anda memiliki enum Modeyang harus mengekspos nilai default seperti dalam kasus Anda. Memberi nama itu default_modemungkin bukan yang terbaik karena pengulangan, tetapi menghindari ambiguitas sambil menyampaikan makna yang diinginkan.

Sopel
sumber
Anda membuat poin yang valid, tetapi saya masih tidak yakin apa yang menciptakan lebih banyak kebingungan: memiliki fragmen yang ditambahkan secara konsisten atau menggunakan kata-kata yang berbeda untuk setiap situasi. Kasus terhadap opsi sebelumnya tentu saja, bahwa situasi di mana ia akan digunakan di tempat pertama (mudah-mudahan) sangat langka sehingga konsistensi tidak dapat disimpulkan dari kode yang ada.
Pelindung satu
3

Anda harus menggunakan kata yang berbeda atau dimodifikasi, yang jelas.
Jadi ini biasanya berarti baik

  • kata yang sama sekali berbeda
  • awalan
  • akhiran

Faktor lain untuk menentukan adalah bagaimana cara menggabungkan beberapa kata dan opsi biasanya

  • allonewordnoseparator
  • words_with_underscores-or-dashes ( snake_case )
  • CapitalizationForClarityAndReadability ( CamelCase )

Saran saya adalah menggunakan awalan atau akhiran dan garis bawah / garis, misalnya

local_default, my_default, a_default, domain_specific_default
default_local, default_me, default_a, default_domain_specific

local_defaultmemiliki keuntungan bahwa semua penduduk setempat disejajarkan dan dengan demikian menonjol dengan cepat tetapi kerugiannya adalah Anda harus selalu membaca bagian kedua untuk mendapatkan nama yang unik. default_localmemiliki keunggulan sebaliknya bahwa nama variabel yang unik dengan cepat terlihat, tetapi penduduk setempat tidak selalu begitu mudah dikelompokkan secara visual.

Beberapa contoh untuk pendekatan domain_specific yang telah saya lihat adalah: vehicle_modelalih-alih modelmerupakan kata khusus; room_tableuntuk tabel SQL seperti tablekata yang disediakan.

Dua opsi lain yang saya lihat menggunakan bahasa atau skrip adalah:

  • kutipan atau backtips untuk mengelilingi nama variabel dan dengan demikian memungkinkan penggunaan kata-kata yang dipesan. Mirip dengan ini, saya bisa membayangkan beberapa bahasa memungkinkan karakter khusus seperti backspace untuk melarikan diri nama.
  • spasi dalam nama variabel.
Michael Durrant
sumber
Sebagai catatan samping yang mungkin sedikit menarik: Saya pernah melihat words_with_underscores-or-dashesdisebut dengan dua nama - snake_casesaat menggunakan garis bawah dan kebab-casesaat menggunakan tanda hubung. Saya menemukan yang terakhir lucu.
VLAZ
2

Jelas, lakukan apa yang Anda bisa untuk menghindari situasi itu. Saya telah menulis perangkat lunak sejak akhir 1970-an dan saat-saat saya benar-benar harus memalsukan kata yang dilindungi undang-undang adalah di bawah sepuluh, mungkin mendekati lima.

Ada banyak hal yang dapat Anda lakukan, seperti menggandakan huruf pertama atau terakhir ( reservedd) atau menambahkan garis bawah yang memimpin atau tertinggal ( reserved_). Apa yang sesuai akan sangat tergantung pada konvensi bahasa yang Anda gunakan, terutama yang berkaitan dengan memimpin atau mengikuti garis bawah. Juga cobalah untuk tidak melakukan hal-hal dengan kasus yang dapat salah dibaca oleh manusia (misalnya, menggunakan Reservedketika berbeda dari reserved).

Setelah Anda memilih sesuatu, taruh di pedoman koding Anda, pastikan orang tahu tentang hal itu dan itu digunakan secara konsisten. Saya bahkan menambahkan komentar pengingat sehingga pembaca tidak berpikir itu salah ketik dan tahu mereka akan melihatnya lagi:

int ccase;  // Name dodges a reserved word
Blrfl
sumber
10
Bukan downvoter, tetapi saran "menggandakan huruf pertama atau terakhir" mengirim rasa dingin di punggung saya ....
Willem van Rumpt
@ WillemvanRumpt Saya juga tidak suka melakukannya, tetapi sekali-sekali ini adalah pilihan antara melakukan senam untuk menghindari kata-kata yang dipesan yang mendorong banyak kepala menggaruk atau pengidentifikasi yang tampak aneh yang hanya meminta sedikit. .
Blrfl
6
Tidak ada penilaian yang dimaksudkan, hanya .... menggigil .... yang dingin ...;)
Willem van Rumpt
1
Postpending sebuah garis bawah lebih baik daripada huruf terakhir dua kali lipat. (Ada suara untuk classs?)
nigel222
1
Pedoman pengkodean! Itu akan menyenangkan untuk dimiliki! Poin bagus.
Pelindung satu
2

Di C #, Anda bisa menambahkan nama pengidentifikasi dengan @ . Ini memberitahu kompiler untuk memperlakukan nama sebagai nama pengidentifikasi dan bukan sebagai kata kunci yang mungkin.

enum @default {Sat, Sun, Mon, Tue, Wed, Thu, Fri}; 
Robert Stiffler
sumber
3
bertanya-tanya siapa yang akan memilih "jawaban" ini yang hanya mengulangi poin yang telah dibuat (dan disajikan jauh lebih baik) dalam jawaban terpilih sehari sebelumnya
nyamuk