Saya mencari di forum, tetapi saya tidak dapat menemukan jawaban mengapa itu harus dihindari, hanya mengapa itu bukan peluru perak. Jadi saya tidak berpikir pertanyaan ini adalah duplikat.
Apakah ada alasan VALID mengapa saya harus menghapus Sistem Hungaria yang saya gunakan?
Sejauh ini saya melihat manfaat berikut dalam menggunakannya:
- Penamaan variabel yang konsisten
- Anda melihat jenis tanpa mencari (Intellisense sudah mati / mengindeks separuh waktu, jadi itu masih alasan yang sah)
- Semantik masih bisa dimasukkan ke bagian kedua dari nama
Dan berikut kerugiannya:
- Itu mengganggu beberapa orang (tidak tahu kenapa)
- Jika tipe diubah, tipe tersebut mungkin tidak cocok dengan penamaan variabel (Saya rasa itu bukan alasan yang valid, tipe jarang diubah, dan Anda memiliki "ganti nama semua")
Jadi kenapa:
vector<string> vecCityNames;
wstring strCity = L"abc";
//more code here
vecCityNames.push_back(strCity);
lebih buruk dari:
vector<string> cityNames;
wstring city = L"abc";
//more code here
cityNames.push_back(city);//Are we pushing back int on a queue? Float on a stack? Something else?
vectCityNames
menjadivectStringCityNames
begitu banyak untuk argumen yang konsisten Anda, dan ini "pertanyaan" lebih dari kata-kata kasar dari apa pun, Anda memiliki pikiran Anda dibuat, ini harus ditutup.cityNames.push_back(city)
cukup jelas. Ini adalah daftar nama kota dan Anda menambahkannya.Jawaban:
Saya dulu menggunakannya (bertahun-tahun yang lalu) dan saya tidak lagi. Alasan utama adalah itu berlebihan dalam bahasa OO dengan pengetikan yang kuat (C ++, Java) yang kebetulan saya gunakan sebagian besar karir saya. Dalam bahasa-bahasa ini, jika saya mendefinisikan tipe saya dengan baik, kompiler dapat dan akan menegakkan keamanan tipe untuk saya. Jadi setiap awalan penamaan hanyalah kekacauan yang membuat nama lebih panjang, sehingga lebih sulit untuk dibaca dan dicari.
Dalam setiap program OO yang ditulis dengan baik, sebagian besar variabel Anda adalah (referensi untuk) tipe yang ditentukan pengguna. Jika Anda awali ini dengan tag umum yang sama (seperti
o
untuk "objek"), Anda tidak akan mendapat manfaat darinya, hanya kekurangannya. Namun, jika Anda awalan dengan tag jenis khusus, Anda masuk ke labirin mencoba menemukan singkatan yang berbeda untuk seribu jenis dengan nama yang sering sama *, dan ingat untuk mengubahnya semua ketika suatu jenis atau namanya berubah (yang merupakan tidak jarang sama sekali dalam program yang terpelihara dengan baik).Tentu saja, ini tidak berlaku untuk bahasa non-OO, dan mungkin tidak berlaku untuk bahasa yang diketik dengan lemah dan / atau dinamis (saya tidak punya pengalaman dengan ini, selain dari C). Baik untuk editor / IDE suboptimal tanpa IntelliSense yang dapat digunakan (atau setara lokalnya). Dan ini hanya 2 sen saya. Jadi, jika notasi Hongaria berfungsi untuk tim dan proyek Anda, lakukan saja. Yang penting adalah menyetujui ini (juga gaya pengkodean yang konsisten pada umumnya) sebelum proyek dimulai, dan tetap konsisten setiap saat.
* Hanya daftar pendek dari proyek kami saat ini: kita memiliki
Charge
,ChargeBreakdown
,ChargeCalculator
,ChargeDAO
,ChargeDTO
,ChargeLineHelper
,ChargeMaps
,ChargePair
danChargeType
, antara lain. Selain itu kami juga memilikiContract
s,Countrie
s,Checkout
s,Checkin
s ... dan ini hanya huruf C, dalam sebuah proyek yang mungkin bahkan tidak akan disebut "cukup ukuran" oleh OP.Penafian: Saya sebenarnya orang Hongaria, jadi saya percaya saya bisa berbicara tentang masalah ini dengan otoritas ;-)
sumber
iPos
ataufAmount
mungkin dapat ditoleransi, tetapi cobalah bekerja pada basis kode di mana setiap variabel objek diberi awalan enam huruf berlebihan yang hanya memberi tahu Anda bahwa itu adalah "penunjuk ke struct".char[]
dipegang oleh aStringBuilder
), dan referensi ke instance yang mungkin tidak bermutasi, tetapi dapat dibagikan dengan hal-hal yang tidak akan bermutasi (misalnyachar[]
dimiliki olehString
, yang dapat dibagi di antara beberapaString
kejadian). Kedua bidang adalah tipe yang samachar[]
, tetapi keduanya memiliki hal-hal yang sangat berbeda. Banyak bug terkait-mutabilitas berasal dari ...Kenapa itu
std::vector<string> vecCityNames;
buruk?Masalah dengan notasi Hungaria seperti yang biasanya digunakan itu adalah, jika profil menunjukkan bahwa nama kota lebih baik disimpan dalam a
std::deque
, semua nama variabel yang merujuk ke objek jenis itu tiba-tiba akan memiliki nama yang menyesatkan.Apakah Anda kemudian akan mengganti nama semua variabel Anda? Pernahkah Anda mencoba melakukan itu dalam proyek besar? Dengan bantuan Murphy (dan orang itu sangat membantu di sana) seseorang di suatu tempat pasti akan menggunakan variabel yang disebut sesuatu seperti
deqCityNames
, membuat perubahan Anda merusak bangunan, membuat Anda duduk berjam-jam mengutak-atik kode yang, selama setengah dekade, tidak ada yang berani bahkan melihat pada, karena takut digigit oleh binatang buas.Dari apa yang saya ketahui, bagaimanapun, cara Charles Simonyi datang dengan bahasa Hongaria, awalannya menunjukkan variabel penggunaan semantik , daripada tipe sintaksisnya . Yaitu, awalan yang tepat untuk daftar nama kota Anda, apa pun jenisnya diterapkan, mungkin akan menjadi
listCityNames
(ataulstCityNames
, jikalist
tidak cukup samar untuk Anda).Tapi saya menganggap awalan itu cukup berlebihan, karena jamak ("nama") sudah menyampaikan bahwa itu adalah sekelompok kota. Intinya: Ketika Anda memilih pengidentifikasi Anda dengan hati-hati, notasi Hungaria jarang diperlukan. OTOH, cara yang biasa digunakan itu, dalam jangka panjang, benar-benar merusak kode.
sumber
typedef
ini adalah alat yang sangat undervaluedvecCityNames
kedeqCityNames
dalam beberapa ratus file dan Anda melakukan hal yang sama.Untuk alasan apa pun, jawaban yang ada di sini tampaknya menari di sekitar alasan untuk notasi Hongaria, tanpa menyatakannya langsung. Notasi Hungaria berguna untuk menambahkan informasi jenis (dalam arti teoretis jenis ) ketika akan sulit untuk melakukannya dalam bahasa itu sendiri . Seperti yang terjadi, biasanya tidak sulit untuk menggunakan C ++ atau sistem tipe Java sedemikian rupa sehingga notasi Hungaria (seperti biasanya dijelaskan) benar-benar berlebihan, dan ini mungkin yang menyebabkan reaksi balik terhadapnya - ia menambahkan kerja programmer untuk mempertahankan anotasi tersebut di semua variabel naes kami, tetapi memberikan nilai tambahan yang kecil hingga tidak sama sekali (dan bahkan dapat menyebabkan kerusakan, karena kode terlihat lebih berantakan).
Di sisi lain, jika seseorang membatasi penggunaan notasi Hungaria untuk mengetik informasi (sekali lagi, dalam jenis pengertian teoritis ) yang tidaksecara alami dienkapsulasi oleh bahasa, maka itu bisa sangat berguna. Sebagai contoh, C dan C ++ meneruskan referensi array sebagai tipe pointer, tetapi referensi array dan pointer memiliki operasi berbeda yang harus dilakukan terhadap mereka: array dapat diindeks di luar elemen pertama, sedangkan pointer tidak boleh. Ini adalah informasi yang berguna yang hilang ke sistem ketik segera setelah array diteruskan ke fungsi sebagai argumen. Dengan demikian, dalam grup kami kami telah mengadopsi anotasi nama-variabel dalam kode C dan C ++ untuk membedakan apakah variabel pointer sebenarnya adalah pointer ke elemen tunggal, atau pointer ke array. Mengadopsi konvensi ini telah sebagian bertanggung jawab atas pengurangan besar dalam terjadinya masalah korupsi memori di basis kode kami.
sumber
dw
vscb
..) Bukan karena bentuk aslinya akan kurang membantu dalam bahasa OO: Indeks masih merupakan indeks, bahkan jika disimpan dalam tipe kelas daripada built-in.Alasannya mengganggu saya adalah karena sedikit kecepatan pada setiap pengenal tunggal yang memperlambat pemindaian visual saya terhadap kode. Ini mungkin karena Anda tahu saya harus membaca teks seperti ini.
sumber
Benci adalah kata yang terlalu kuat, IMO. Anda dapat menulis kode dengan cara apa pun yang Anda inginkan; Saya lebih suka tidak menggunakan notasi Hongaria dalam kode saya sendiri, dan diberi pilihan saya juga lebih suka tidak harus membacanya atau bekerja dengannya dalam kode orang lain.
Anda bertanya mengapa beberapa orang menganggap notasi Hongaria mengganggu. Saya tidak bisa berbicara untuk orang lain, tetapi alasan yang membuat saya kesal adalah:
Itu jelek. Hongaria mengambil nama-nama yang masuk akal dan menambahkan apa yang ada pada suatu kode. Setelah Anda menginternalisasi kode ini, saya yakin itu masuk akal, tetapi bagi yang belum tahu itu hanya terlihat seperti seseorang melepaskan kode C ++ pada kode sumber saya.
Itu berlebihan. Deklarasi variabel menetapkan jenisnya; Saya tidak merasa perlu mengulang informasi itu dalam nama variabel. Ini tidak benar di setiap bahasa: di Perl, misalnya, sigils seperti @ atau $ prepended ke nama variabel pada dasarnya menentukan jenis variabel, jadi Anda tidak punya pilihan selain menggunakannya.
Ini memecahkan masalah yang tidak saya miliki. Metode dan fungsi tidak boleh terlalu lama sehingga Anda harus berusaha keras untuk menemukan deklarasi variabel atau parameter lokal, dan mereka tidak boleh melibatkan begitu banyak variabel sehingga Anda kesulitan melacak apa. Mendeklarasikan variabel lokal yang dekat dengan kode yang menggunakannya juga membantu dalam hal ini. Kompiler C di masa lalu mensyaratkan bahwa semua variabel lokal dideklarasikan pada awal fungsi, tetapi batasan itu telah dihapus sejak lama.
Itu tidak lengkap. Notasi Hungaria diciptakan untuk bahasa (BCPL) yang tidak memiliki sistem tipe, dan kemudian digunakan secara luas dalam bahasa (C) yang memiliki jumlah jenis asli yang cukup terbatas. IMO, tidak bekerja dengan baik dengan bahasa seperti C ++ atau Java yang memiliki sistem tipe yang luas. Mengapa saya ingin menggunakan awalan untuk menunjukkan tipe variabel yang merupakan tipe asli, seperti char [], tetapi bukan yang merupakan kelas? Bergantian, jika saya mulai menciptakan awalan seperti
vec
untuk kelas, saya akan berakhir dengan hierarki besar awalan yang sejajar dengan hierarki kelas saya. Jika itu menarik bagi Anda, Anda dipersilakan untuk itu; hanya memikirkannya membuat saya sakit kepala.Ini ambigu , setidaknya seperti yang saya mengerti. Apa perbedaan antara
szFoo
danpszFoo
? Yang pertama adalah string yang diakhiri nol, dan yang kedua adalah pointer ke string yang diakhiri nol. Tetapi dalam C atau C ++, sejauh yang saya tahu, setiap variabel string secara efektif adalah pointer, jadi apakah mereka sama atau tidak? Yang mana yang harus saya gunakan? Jawaban sebenarnya sebenarnya tidak masalah - intinya adalah bahwa saya tidak dapat membedakan jawaban menggunakan notasi yang seharusnya membantu saya menghindari pertanyaan-pertanyaan semacam ini. Deklarasi variabel, di sisi lain, harus jelas karena itulah yang digunakan kompilator.Itulah hal-hal yang mengganggu saya tentang notasi Hongaria. Meskipun sebagai sebuah kelompok, saya pikir mereka tidak sepenuhnya menjelaskan mengapa Hongaria sebagian besar telah ditinggalkan. Berikut adalah tiga alasan terbesar mengapa kebanyakan programmer tidak menggunakan bahasa Hongaria:
Tidak ada alasan kuat untuk menggunakannya. Lihat item 3 dan 4 di atas. Saya mungkin bisa hidup dengan gangguan jika Hongaria menawarkan keuntungan besar daripada tidak menggunakan Hongaria, tapi saya tidak melihatnya, dan tampaknya kebanyakan orang lain juga tidak. Mungkin hal terbaik tentang bahasa Hongaria adalah bahwa itu adalah konvensi yang banyak digunakan, dan jika Anda tetap menggunakan standar, Anda dapat mengharapkan programmer lain dengan keterampilan yang sama untuk dapat memahami notasi.
Meningkatnya pengaruh perusahaan yang bukan Microsoft. Mungkin adil untuk mengatakan bahwa sebagian besar programmer yang mengadopsi notasi Hongaria melakukannya karena itulah cara Microsoft menulis kode, dan seringkali lebih mudah mengikuti arus. Perusahaan seperti Google dan Apple memiliki pengaruh yang jauh lebih besar sekarang daripada yang mereka lakukan di masa lalu, dan lebih banyak programmer daripada sebelumnya yang mengadopsi gaya perusahaan-perusahaan itu dan yang lain yang kebanyakan menghindari Hongaria. (Hanya adil untuk menunjukkan bahwa Anda masih melihat beberapa sisa, misalnya Google dan Apple sering menggunakan awalan 'k' untuk nama konstan.)
Microsoft sendiri telah meninggalkan Hongaria. Jika Anda memeriksa bagian Konvensi Penamaan Umum Microsoft dari panduan kodingnya, Anda akan menemukan bahwa kata itu tertulis dengan huruf tebal: Jangan gunakan notasi Hongaria.
Karenanya, satu alasan yang sah untuk berhenti menggunakan notasi Hongaria adalah:
Popularitas notasi Hungaria telah berkurang ke titik bahwa konvensi tidak lagi membantu. Jauh lebih sedikit pemrogram yang menggunakan atau bahkan memahami bahasa Hongaria akhir-akhir ini, dan oleh karena itu konvensi ini kurang efektif dalam menyampaikan informasi yang seharusnya. Jika Anda menemukan cara yang berguna untuk menulis kode di proyek pribadi Anda sendiri, maka ada sedikit alasan untuk berhenti. Namun, jika Anda menulis kode sebagai bagian dari tim yang tidak menggunakan bahasa Hungaria, ini dapat menjadi penghalang antara Anda dan anggota tim lainnya alih-alih strategi komunikasi yang sukses.
sumber
szFoo
danpszFoo
"? Yang satuchar*
, yang lainchar**
, butuh waktu 0,25 detik untuk mengatakan perbedaannya. Cobalah untuk mengalahkannya dengan Intellisense.pnFoo
mungkin akanint*
, tidakint**
, jadi Anda harus tahu bahwa itusz
juga berarti pointer. Saya yakin itu bukan masalah besar untuk jumlah terbatas jenis yang telah menetapkan awalan Hongaria, tetapi dalam setiap proyek besar jumlah jenis didefinisikan dalam ribuan. Saya tidak tahu tentang Intellisense, tetapi IDE terus meningkat selama 25 tahun terakhir, dan saya berharap tren itu akan terus berlanjut.Jika saya memberi nama semua variabel saya setelah karakter dari The Simpsons, itu juga konsisten, tetapi apakah ini menguntungkan?
Ini adalah satu-satunya alasan yang valid, berdasarkan pada kelemahan satu alat spesifik ...
Itu tidak bermanfaat; Anda hanya mengklaim tidak adanya kelemahan ( besar-besaran ).
sumber
IDE sepele akan memberi tahu saya apa jenis variabel ketika saya mengarahkan mouse padanya. Jadi mengapa repot-repot menggandakan informasi itu? Pada dasarnya, Sistem Notasi Hongaria adalah pelanggaran KERING, dengan semua jebakan yang terkait dengannya. Ketika informasi itu mudah diakses dalam lingkungan modern, tidak ada alasan untuk membayar harga itu.
Konsistensi bukanlah keuntungan dalam dirinya sendiri. Tidak menyebut mereka dengan tipe juga konsisten. Anda hanya akan memiliki inkonsistensi jika hanya beberapa variabel yang memiliki tipe mereka dalam nama. Dan mengemas semantik menjadi bagian kedua hanyalah "Ya, itu tidak terlalu buruk.", Semua orang dapat menggunakan seluruh nama untuk semantik. Anda tidak memiliki kelebihan nyata yang terdaftar.
sumber
Poin lain dengan bentuk tradisional notasi Hungaria adalah mereka biasanya awalan. ada 2 masalah imho di sini:
1) Pembaca manusia biasanya lebih suka informasi yang paling penting, dalam sebagian besar bentuk bahasa Hongaria informasi yang dikodekan bisa dibilang kurang penting daripada nama itu sendiri.
2) Prefek menyortir efek leksikal, jadi jika misalnya Anda akan menggunakan awalan untuk menunjukkan antarmuka atau kelas dan IDE Anda menyediakan daftar ini, kelas / antarmuka terkait akan dipisahkan dalam daftar ini.
sumber
Jelas, ini tergantung pada pendapat, jadi akan sulit untuk bekerja dengan fakta di sini. Secara pribadi, saya menemukan bahwa argumen untuk notasi Hungaria berjalan agak tipis dalam bahasa berorientasi objek yang diketik dengan kuat. Dalam pengalaman saya, aplikasi OO cenderung menangani kompleksitas dengan menjaga kelas tetap koheren dan ringkas, dan hal yang sama dapat dikatakan tentang fungsi. Ini berarti bahwa semua hal lain dianggap sama, Anda berakhir dengan:
Sekarang, jika Anda ingin menggunakan notasi Hongaria, Anda harus memutuskan apakah akan menerapkannya di seluruh papan, atau hanya menggunakannya untuk jenis dan kelas istimewa tertentu (seperti kelas perpustakaan inti). Yang terakhir tidak masuk akal bagi saya, dan yang pertama mengarah pada "labirin mencoba menemukan singkatan yang berbeda untuk seribu jenis yang berbeda" yang dirujuk oleh Péter Török. Ini berarti bahwa ada overhead yang signifikan dalam mempertahankan daftar singkatan, dan biasanya "penamaan variabel yang konsisten" keluar jendela.
Poin kedua tentang metode yang lebih pendek berarti bahwa dalam kebanyakan kasus, Anda tidak harus melalui ratusan baris kode untuk memeriksa jenis variabel apa. Penamaan variabel sedikit lebih hati-hati akan menghilangkan beberapa pertanyaan Anda yang lain - misalnya
cityName
vs adilcity
. Saya berharap itucityName
bukan pelampung :)Mengenai mengapa itu mengganggu orang - lagi, ini mungkin karena terbiasa atau tidak. Tetapi sebagai seseorang yang tidak terbiasa dengan itu, saya dapat memberi tahu Anda bahwa penggunaan notasi Hongaria merusak aliran kode untuk mata saya, membuatnya lebih sulit untuk dibaca dengan cepat. Sebagai rangkuman, saya tidak mengatakan bahwa itu tidak pantas (walaupun saya belum membahas beberapa kekurangannya, dalam hal refactoring, dll), saya mengatakan bahwa upaya ini tidak bermanfaat, untuk bahasa OO yang diketik dengan kuat.
sumber
Saya tidak tahu dalam konteks C ++ tetapi di dunia Java / C # saya lebih suka memiliki nama yang bermakna yang menyampaikan bahasa domain atau konteks daripada memberi tahu saya bahwa itu
strFirstName
adalah String; harus jelas bahwa itu adalah string, atau nama harus dire-refored untuk menyampaikan maksud yang lebih baik. Jika Anda memerlukan awalan untuk mengetahui jenis pekerjaan Anda, saya berpendapat bahwa penamaan Anda tidak konsisten, tidak cukup deskriptif, atau benar-benar salah. Dalam bahasa modern saya selalu lebih suka nama yang lebih panjang yang tidak meninggalkan ambiguitas daripada nama yang tidak jelas atau ambigu.Satu-satunya waktu saya menggunakan bahasa Hongaria adalah untuk kontrol ASP.NET, dan itu lebih dari itu IA) tidak harus mengetikkan sesuatu yang sangat panjang seperti
CustomerFirstNameTextBox
versustxtCustomerFirstName
, dan B) Jadi Intellisense akan mengurutkan semua jenis kontrol. Saya merasa "kotor" bahkan melakukan itu, saya hanya belum menemukan cara yang lebih baik.sumber
Ini benar-benar semua tentang preferensi pribadi, tidak peduli sekeras apa pun seseorang mencoba merasionalisasi pilihan mereka. Saya pribadi tetap berpegang pada aturan "When in Rome ..." dan menggunakan bahasa Hongaria dalam kode yang banyak menyebut Windows API. Untuk kode platform-independent, saya cenderung mengikuti gaya C ++ Standard Library.
sumber
Jawabannya ada pada pertanyaan ini: Tolong beri tahu saya cara memberi nama variabel berikut:
Tambahkan ke string konstan ini, pointer ke ini dan pointer konstan ke ini.
sumber
szFoo
,wczFoo
,strFoo
,(w)strFoo
,strFoo
,bstrFoo
,bstrFoo
Saya sangat tidak menyukai bentuk notasi Hongaria yang Anda gambarkan. Alasannya? Tidak ada gunanya 90% dari waktu.
Misalnya, sedikit kode (setara C ++. Sebenarnya ditulis dalam Delphi) dari proyek lawas yang terpaksa saya tanggung:
... pRecord adalah variabel, ini bertipe TRecordList.
TRecordList *pRecords[10];
Ini adalah kelas yang terdiri dari orioerty bernama FooMember yang menunjuk ke fFooMember ... atau mFooMember tergantung pada apakah itu "bidang" atau "anggota" (petunjuk: mereka adalah hal yang sama)
Masalah?
fFooMember
bisa jadi sesuatu seperti FooMember_ karena kita akan selalu mengaksesnya melalui properti publik FooMember. pRekam? Sudah cukup jelas itu adalah petunjuk dari fakta bahwa Anda melakukan dereferensi di semua tempat. TRecordList? Kapan Anda bisa membingungkan nama jenis dan objek jenis itu? Kompiler akan meneriaki Anda, dan tipe digunakan hampir di semua tempat objek (kecuali untuk properti / metode statis)Sekarang, ada satu tempat di mana saya menggunakan notasi hungaria. Ini terjadi ketika berhadapan dengan banyak variabel UI yang akan memiliki nama yang sama dengan variabel UI lain atau variabel biasa.
Misalnya, jika saya memiliki formulir untuk Nama Depan Anda di atasnya.
Saya akan memiliki kelas bernama FirstNameForm. Di dalamnya, lblFirstName dan txtFirstName untuk masing-masing label dan kotak teks. Dan properti FirstName publik untuk mendapatkan dan menetapkan nama di kotak teks.
Ini juga bisa diselesaikan dengan menggunakan FirstNameLabel dan FirstNameTextBox tapi saya merasa perlu waktu lama untuk mengetik. Terutama dengan sesuatu seperti GenderDropDownList dan semacamnya.
Jadi pada dasarnya, notasi hungaria, paling tidak, menjengkelkan pada tingkat sistematis dan kasus terburuk berbahaya (seperti jawaban yang diberikan tentang masalah dengan refactoring dan konsistensi).
sumber