Apakah notasi Sistem Hongaria masih merupakan praktik yang bermanfaat? [Tutup]

23

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?
Coder
sumber
4
jika intellisense mati, kode Anda tidak valid. Jika tidak valid, mengapa menganggap bahwa nama variabel sudah benar?
Bubblewrap
6
@Bubblewrap: Kebanyakan implementasi intellisense rawa selama 3 detik sesekali, bahkan pada kode yang valid. Dan kadang-kadang mereka tidak berfungsi sama sekali, meskipun kompilasi kode dan tautan. Kita berbicara tentang proyek-proyek berukuran cukup.
Coder
9
seharusnya tidak vectCityNamesmenjadi vectStringCityNamesbegitu 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.
8
Apa yang Anda anggap sebagai alasan "sah"?
Adam Lear
15
Saya tidak berpikir contoh kedua Anda membingungkan dalam cara komentar Anda menunjukkan itu. Arti cityNames.push_back(city)cukup jelas. Ini adalah daftar nama kota dan Anda menambahkannya.
Chris Burt-Brown

Jawaban:

62

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 ountuk "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, ChargePairdan ChargeType, antara lain. Selain itu kami juga memiliki Contracts, Countries, Checkouts, Checkins ... 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 ;-)

Péter Török
sumber
"Pengetikan yang kuat" - Jika C ++ memiliki sistem tipe yang benar-benar kuat, Anda tidak perlu memasukkan tipe dalam nama variabel sebagai peretasan.
Michael Burge
19
@MichaelBurge: Itulah intinya. Anda tidak harus melakukannya. Karena itu benar.
DeadMG
8
+1 untuk poin tentang tipe yang ditentukan pengguna. Menggunakan variabel bernama iPosatau fAmountmungkin 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".
2
Saya akan membuat pengecualian untuk GUI di mana Anda perlu menyimpan pegangan untuk setiap kontrol selain nilainya, jadi teks dan hText daripada harus memikirkan nama yang berbeda untuk kotak entri. Terutama penting pada sistem di mana pegangannya hanya int, bukan tipe khusus.
Martin Beckett
1
Saya berpendapat bahwa tempat utama di mana Jawa seharusnya merekomendasikan penggunaan notasi Hungaria adalah untuk membedakan antara referensi ke instance yang mungkin dimutasi tetapi tidak pernah dibagi (misalnya char[]dipegang oleh a StringBuilder), dan referensi ke instance yang mungkin tidak bermutasi, tetapi dapat dibagikan dengan hal-hal yang tidak akan bermutasi (misalnya char[]dimiliki oleh String, yang dapat dibagi di antara beberapa Stringkejadian). Kedua bidang adalah tipe yang sama char[], tetapi keduanya memiliki hal-hal yang sangat berbeda. Banyak bug terkait-mutabilitas berasal dari ...
supercat
35

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 menjadilistCityNames(ataulstCityNames, jikalisttidak 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.

sbi
sumber
6
@ Kode: Jenis ini digunakan di seluruh proyek, dan semua variabel jenis ini akan memiliki awalan. Anda harus mengganti nama bukan satu variabel global, tetapi ratusan variabel lokal.
sbi
7
Anda harus menambahkan tautan ke posting blog Joel Spolsky di mana ia menawarkan penjelasannya mengapa menggunakan tipe variabel untuk menghasilkan pemberitahuan Hongaria adalah kesalahpahaman tentang apa itu semua. Hormat Anda baik, tetapi beberapa orang mungkin mencari sesuatu yang lebih otoritatif dan Anda dapat menggunakannya untuk mendukung kasus Anda. joelonsoftware.com/articles/Wrong.html
Shane Wealti
2
@Coder: Sayangnya, typedefini adalah alat yang sangat undervalued
sbi
4
@ Shane: Saya telah menuliskan pendapat saya sendiri tentang masalah ini. Jika itu cocok dengan pendapat Joel, maka itu tidak masalah bagi saya, karena saya menghargai pendapatnya meskipun kebetulan saya tidak setuju dengan beberapa di antaranya. Tapi saya melihat tidak perlu untuk menarik "otoritas" lain untuk mendukung pendapat saya sendiri ketika itu didasarkan pada lebih dari satu dekade pengalaman susah payah. Sangat menyenangkan bahwa Anda telah memposting tautan itu, meskipun, selalu baik untuk melihat pendapat orang lain untuk dibandingkan.
sbi
4
Dahulu kala, saya adalah pria CVS untuk toko, dan salah satu pengembang top mengubah inisial (operasi ganti kelamin, dll., Dan nama depannya serta namanya tidak memiliki inisial yang sama). Setiap kali dia menyentuh file (atau yang serupa), dia mengubah semua inisialnya menjadi bentuk baru. Saya menemukan ini sangat menjengkelkan, karena kami memiliki segala macam perubahan kecil dalam fitur historis, dan sulit untuk mengetahui apa yang sebenarnya telah diubah dan mengapa. Ubah vecCityNameske deqCityNamesdalam beberapa ratus file dan Anda melakukan hal yang sama.
David Thornley
15

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.

Aidan Cully
sumber
Apa yang membuat Hungaria gagal adalah bahwa itu disalahgunakan (oleh tim WinAPI) untuk menyandikan tipe sintaksis variabel , bukan makna semantiknya . (Pikirkan dwvs cb..) Bukan karena bentuk aslinya akan kurang membantu dalam bahasa OO: Indeks masih merupakan indeks, bahkan jika disimpan dalam tipe kelas daripada built-in.
sbi
1
+1 untuk menunjukkan bahwa argumen sebenarnya di sini adalah tentang teori tipe. Notasi Hungaria adalah teknik untuk menambah sistem tipe dengan informasi tambahan, dan dengan demikian harus dibandingkan dan dikontraskan dengan teknik lain untuk menambah sistem tipe (mis. Templat, typedef, dll.), Daripada dibahas tentang keunggulan estetika (atau ketiadaan).
Daniel Pryden
1
Pertanyaannya secara khusus tentang "Sistem Hungaria", duplikasi sia-sia dari tipe yang dinyatakan, tanpa informasi semantik tambahan. Mungkin ada kasus untuk menggunakan konsep asli "Hungaria notation" dari tag semantik untuk memberikan informasi di luar yang diizinkan oleh sintaks bahasa (dalam beberapa bahasa, termasuk C, meskipun bukan C ++ di mana Anda dapat melakukannya dengan lebih andal dengan tipe yang ditentukan pengguna ), tapi bukan itu pertanyaannya.
Mike Seymour
10

Itu mengganggu beberapa orang (tidak tahu kenapa)

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.

dfan
sumber
9

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:

  1. 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.

  2. 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.

  3. 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.

  4. 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 vecuntuk 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.

  5. Ini ambigu , setidaknya seperti yang saya mengerti. Apa perbedaan antara szFoodan pszFoo? 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:

  1. 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.

  2. 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.)

  3. 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.

Caleb
sumber
"Apa bedanya antara szFoodan pszFoo"? Yang satu char*, yang lain char**, butuh waktu 0,25 detik untuk mengatakan perbedaannya. Cobalah untuk mengalahkannya dengan Intellisense.
Coder
2
@ Kode, pnFoomungkin akan int*, tidak int**, jadi Anda harus tahu bahwa itu szjuga 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.
Caleb
8

Sejauh ini saya melihat manfaat berikut dalam menggunakannya:

  • Penamaan variabel yang konsisten

Jika saya memberi nama semua variabel saya setelah karakter dari The Simpsons, itu juga konsisten, tetapi apakah ini menguntungkan?

  • Anda melihat jenis tanpa mencari (Intellisense sudah mati / mengindeks separuh waktu, jadi itu masih alasan yang sah)

Ini adalah satu-satunya alasan yang valid, berdasarkan pada kelemahan satu alat spesifik ...

  • Semantik masih bisa dimasukkan ke bagian kedua dari nama

Itu tidak bermanfaat; Anda hanya mengklaim tidak adanya kelemahan ( besar-besaran ).

Michael Borgwardt
sumber
6

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.

DeadMG
sumber
4
"IDE akan dengan sepele memberi tahu saya apa jenis variabel ketika saya mengarahkan mouse padanya.", Di hello world, ya. Pada proyek yang lebih besar saya menemukan fitur ini sangat tidak dapat diandalkan / lambat. ctrl + space, ctrl + space, ctrl + space, ctrl + space, ctrl + space, no go ...
Coder
3
Dapatkan IDE baru. Atau SSD, yang bekerja dengan sangat baik. Atau cukup sertakan tajuk yang tidak perlu.
DeadMG
1
Bahkan jika IDE terlalu lambat ketika menunjukkan tipe variabel, atau jika itu tidak mampu melakukan itu, metode / fungsi harus disimpan pendek, sehingga deklarasi variabel tidak akan pernah sangat jauh dari penggunaannya.
Kevin Panko
6

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.

jk.
sumber
2

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:

  • Lebih banyak kelas / tipe
  • Metode yang lebih pendek

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 cityNamevs adil city. Saya berharap itu cityNamebukan 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.

Daniel B
sumber
1

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 strFirstNameadalah 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 CustomerFirstNameTextBoxversus txtCustomerFirstName, dan B) Jadi Intellisense akan mengurutkan semua jenis kontrol. Saya merasa "kotor" bahkan melakukan itu, saya hanya belum menemukan cara yang lebih baik.

Wayne Molina
sumber
0

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.

Nemanja Trifunovic
sumber
0

Jawabannya ada pada pertanyaan ini: Tolong beri tahu saya cara memberi nama variabel berikut:

char * nullTerminatedString;
wchar * nullTerminatedWideString;
string stlString;
wstring stlWideString;
CString mfcString;
ComString BSTR;
_bstr_t atlString;

Tambahkan ke string konstan ini, pointer ke ini dan pointer konstan ke ini.

Jaywalker
sumber
3
szFoo, wczFoo, strFoo, (w)strFoo, strFoo, bstrFoo,bstrFoo
Coder
0

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:

pRecords[0]->FooMember=10;

... 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? fFooMemberbisa 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).

Earlz
sumber