Saya mendukung awalan yang dilakukan dengan baik .
Saya pikir (Sistem) Notasi Hungaria bertanggung jawab atas sebagian besar "rap buruk" yang didapatkan oleh awalan.
Notasi ini sebagian besar tidak ada gunanya dalam bahasa yang sangat diketik misalnya dalam C ++ "lpsz" untuk memberi tahu Anda bahwa string Anda adalah pointer panjang ke string nul terminated, ketika: arsitektur tersegmentasi adalah sejarah kuno, string C ++ oleh pointer konvensi umum ke nul-terminated array ar, dan itu tidak terlalu sulit untuk mengetahui bahwa "customerName" adalah string!
Namun, saya menggunakan awalan untuk menentukan penggunaan variabel (pada dasarnya "Apps Hungarian", meskipun saya lebih suka menghindari istilah Hungaria karena memiliki hubungan yang buruk dan tidak adil dengan System Hungarian), dan ini adalah penghemat waktu yang sangat berguna dan pendekatan pengurangan bug .
Saya menggunakan:
- m untuk anggota
- c untuk konstanta / readonlys
- p untuk pointer (dan pp untuk pointer ke pointer)
- v untuk volatile
- s untuk statis
- i untuk indeks dan iterator
- e untuk acara
Di mana saya ingin memperjelas jenisnya , saya menggunakan sufiks standar (mis. Daftar, ComboBox, dll).
Ini membuat programmer sadar akan penggunaan variabel setiap kali mereka melihat / menggunakannya. Arguably case yang paling penting adalah "p" untuk pointer (karena perubahan penggunaan dari var. Ke var-> dan Anda harus lebih berhati-hati dengan pointer - NULLs, pointer aritmatika, dll), tetapi yang lainnya sangat berguna.
Misalnya, Anda dapat menggunakan nama variabel yang sama dalam berbagai cara dalam satu fungsi: (di sini contoh C ++, tetapi berlaku sama untuk banyak bahasa)
MyClass::MyClass(int numItems)
{
mNumItems = numItems;
for (int iItem = 0; iItem < mNumItems; iItem++)
{
Item *pItem = new Item();
itemList[iItem] = pItem;
}
}
Anda bisa lihat di sini:
- Tidak ada kebingungan antara anggota dan parameter
- Tidak ada kebingungan antara indeks / iterator dan item
- Penggunaan satu set variabel yang terkait jelas (daftar item, pointer, dan indeks) yang menghindari banyak jebakan nama generik (samar) seperti "menghitung", "indeks".
- Awalan mengurangi pengetikan (lebih pendek, dan bekerja lebih baik dengan pelengkapan otomatis) daripada alternatif seperti "itemIndex" dan "itemPtr"
Poin bagus lain dari iterators "iName" adalah bahwa saya tidak pernah mengindeks array dengan indeks yang salah, dan jika saya menyalin sebuah loop di dalam loop lain, saya tidak perlu refactor salah satu variabel indeks loop.
Bandingkan contoh sederhana yang tidak realistis ini:
for (int i = 0; i < 100; i++)
for (int j = 0; j < 5; j++)
list[i].score += other[j].score;
(yang sulit dibaca dan sering mengarah ke penggunaan "i" di mana "j" dimaksudkan)
dengan:
for (int iCompany = 0; iCompany < numCompanies; iCompany++)
for (int iUser = 0; iUser < numUsers; iUser++)
companyList[iCompany].score += userList[iUser].score;
(yang jauh lebih mudah dibaca, dan menghilangkan semua kebingungan tentang pengindeksan. Dengan lengkapi-otomatis dalam IDE modern, ini juga cepat dan mudah untuk diketik)
Manfaat berikutnya adalah cuplikan kode tidak memerlukan konteks apa pun untuk dipahami. Saya dapat menyalin dua baris kode ke email atau dokumen, dan siapa pun yang membaca cuplikan itu dapat membedakan antara semua anggota, konstanta, pointer, indeks, dll. Saya tidak perlu menambahkan "oh, dan berhati-hatilah karena 'data' adalah sebuah pointer ke sebuah pointer ", karena itu disebut 'ppData'.
Dan untuk alasan yang sama, saya tidak perlu mengalihkan pandangan dari satu baris kode untuk memahaminya. Saya tidak perlu mencari melalui kode untuk menemukan apakah 'data' adalah lokal, parameter, anggota, atau konstan. Saya tidak perlu memindahkan tangan saya ke mouse sehingga saya bisa mengarahkan kursor ke 'data' dan kemudian menunggu tooltip (yang kadang-kadang tidak pernah muncul) muncul. Jadi programmer dapat membaca dan memahami kode secara signifikan lebih cepat, karena mereka tidak membuang waktu mencari naik dan turun atau menunggu.
(Jika Anda tidak berpikir Anda membuang waktu untuk mencari-cari pekerjaan, temukan beberapa kode yang Anda tulis setahun yang lalu dan belum melihatnya. Buka file dan lompat setengah jalan tanpa membacanya. Lihat caranya jauh Anda dapat membaca dari titik ini sebelum Anda tidak tahu apakah ada anggota, parameter atau lokal. Sekarang lompat ke lokasi acak lain ... Ini adalah apa yang kita semua lakukan sepanjang hari ketika kita tunggal melangkah melalui kode orang lain atau mencoba memahami cara memanggil fungsi mereka)
Awalan 'm' juga menghindari notasi "IMHO-" yang jelek dan bertele-tele, dan ketidakkonsistenan yang dijaminnya (bahkan jika Anda berhati-hati biasanya akan berakhir dengan campuran 'data->' ini dan 'data' di kelas yang sama, karena tidak ada yang mengeja ejaan nama yang konsisten).
Notasi 'ini' dimaksudkan untuk menyelesaikan ambiguitas - tetapi mengapa ada orang yang dengan sengaja menulis kode yang bisa ambigu? Ambiguitas akan menyebabkan bug cepat atau lambat. Dan dalam beberapa bahasa 'ini' tidak dapat digunakan untuk anggota statis, jadi Anda harus memperkenalkan 'kasus khusus' dalam gaya pengkodean Anda. Saya lebih suka memiliki aturan pengkodean tunggal yang berlaku di mana-mana - eksplisit, tidak ambigu dan konsisten.
Manfaat utama terakhir adalah dengan Intellisense dan pelengkapan otomatis. Coba gunakan Intellisense pada Formulir Windows untuk menemukan acara - Anda harus menggulir melalui ratusan metode kelas dasar misterius yang tidak perlu Anda panggil untuk menemukan acara tersebut. Tetapi jika setiap acara memiliki awalan "e", mereka secara otomatis akan terdaftar dalam grup di bawah "e". Dengan demikian, awalan berfungsi untuk mengelompokkan anggota, const, peristiwa, dll dalam daftar intellisense, menjadikannya lebih cepat dan mudah untuk menemukan nama yang Anda inginkan. (Biasanya, suatu metode mungkin memiliki sekitar 20-50 nilai (lokal, params, anggota, consts, peristiwa) yang dapat diakses dalam cakupannya. Tetapi setelah mengetikkan awalan (saya ingin menggunakan indeks sekarang, jadi saya ketik 'i. .. '), saya hanya diberi 2-5 opsi pelengkapan otomatis.' Pengetikan ekstra '
Saya seorang programmer yang malas, dan konvensi di atas menghemat banyak pekerjaan. Saya dapat kode lebih cepat dan saya membuat kesalahan jauh lebih sedikit karena saya tahu bagaimana setiap variabel harus digunakan.
Argumen menentang
Jadi, apa yang kontra? Argumen umum terhadap awalan adalah:
"Skema awalan buruk / jahat" . Saya setuju bahwa "m_lpsz" dan sejenisnya dipikirkan dengan buruk dan sepenuhnya tidak berguna. Itu sebabnya saya menyarankan menggunakan notasi yang dirancang dengan baik yang dirancang untuk mendukung kebutuhan Anda, daripada menyalin sesuatu yang tidak pantas untuk konteks Anda. (Gunakan alat yang tepat untuk pekerjaan itu).
"Jika saya mengubah penggunaan sesuatu, saya harus mengganti namanya" . Ya, tentu saja, itulah yang dimaksud dengan refactoring, dan mengapa IDE memiliki alat refactoring untuk melakukan pekerjaan ini dengan cepat dan tanpa rasa sakit. Bahkan tanpa awalan, mengubah penggunaan variabel hampir pasti berarti namanya harus diubah.
"Awalan hanya membingungkan saya" . Seperti halnya setiap alat sampai Anda belajar bagaimana menggunakannya. Setelah otak Anda terbiasa dengan pola penamaan, itu akan menyaring informasi secara otomatis dan Anda tidak akan keberatan jika awalannya ada lagi. Tetapi Anda harus menggunakan skema seperti ini selama satu atau dua minggu sebelum Anda benar-benar menjadi "fasih". Dan saat itulah banyak orang melihat kode lama dan mulai bertanya-tanya bagaimana mereka berhasil tanpa skema awalan yang baik.
"Saya hanya bisa melihat kode untuk menyelesaikan masalah ini" . Ya, tetapi Anda tidak perlu membuang waktu mencari di tempat lain dalam kode atau mengingat setiap detail kecil ketika jawabannya tepat di tempat mata Anda sudah fokus.
(Sebagian) informasi itu dapat ditemukan dengan hanya menunggu tooltip untuk memunculkan variabel saya . Iya. Jika didukung, untuk beberapa jenis awalan, ketika kode Anda dikompilasi dengan bersih, setelah menunggu, Anda dapat membaca deskripsi dan menemukan informasi yang akan disampaikan oleh awalan secara instan. Saya merasa bahwa awalan adalah pendekatan yang lebih sederhana, lebih dapat diandalkan, dan lebih efisien.
"Ini lebih banyak mengetik" . Betulkah? Satu karakter lagi? Atau apakah itu - dengan alat penyelesaian otomatis IDE, ini akan sering mengurangi pengetikan, karena setiap karakter awalan mempersempit ruang pencarian secara signifikan. Tekan "e" dan tiga acara di kelas Anda muncul di intellisense. Tekan "c" dan lima konstanta terdaftar.
"Saya bisa menggunakan this->
bukan m
" . Ya, Anda bisa. Tapi itu hanya awalan yang jauh lebih jelek dan lebih verbose! Hanya saja ia membawa risiko yang jauh lebih besar (terutama dalam tim) karena bagi penyusunnya adalah opsional , dan karenanya penggunaannya sering tidak konsisten. m
di sisi lain singkat, jelas, eksplisit dan bukan opsional, jadi jauh lebih sulit untuk membuat kesalahan menggunakannya.