Apa manfaat tidak menggunakan notasi Hongaria?

101

Salah satu hal yang saya perjuangkan adalah tidak menggunakan notasi Hongaria. Saya tidak ingin harus pergi ke definisi variabel hanya untuk melihat tipe apa itu. Ketika sebuah proyek menjadi luas, senang bisa melihat variabel yang diawali oleh 'bool' dan tahu bahwa itu mencari benar / salah, bukan nilai 0/1 .

Saya juga melakukan banyak pekerjaan di SQL Server. Saya awali prosedur tersimpan saya dengan 'sp' dan tabel saya dengan 'tbl', belum lagi semua variabel saya di database masing-masing.

Saya melihat di mana-mana bahwa tidak ada yang benar-benar ingin menggunakan notasi Hungaria, ke titik di mana mereka menghindarinya. Pertanyaan saya adalah, apa untungnya tidak menggunakan notasi Hungaria, dan mengapa mayoritas pengembang menghindarinya seperti wabah?

user29981
sumber
39
Bahasa / IDE apa yang Anda gunakan? Di Visual Studio, Anda tidak harus pergi ke definisi untuk mengetahui jenis variabel, karena IDE memberikannya kepada Anda. Dalam bahasa di mana jenis tidak ditegakkan, seperti PHP, Anda tidak perlu tahu jenis sebagian besar waktu (karena Anda dapat menetapkan 0 atau 1 ke boolean).
Arseni Mourzenko
10
@ MainMa Saya tidak yakin itu alasan yang bagus untuk tidak mengetahui jenis nilai dalam PHP.
Rei Miyasaka
29
"Ketika proyek menjadi luas" ... seharusnya tidak masalah. Seharusnya hanya ada sejumlah kecil variabel dalam lingkup di titik mana pun: beberapa variabel kelas, dan beberapa argumen metode lainnya. Jika Anda tidak dapat mempertahankannya, maka kelasnya terlalu besar atau metodenya terlalu panjang. Notasi Hungaria diciptakan untuk pemrograman Windows C, pada dasarnya sebagai solusi untuk API Windows yang mengerikan. Tidak ada yang serupa yang disarankan atau diinginkan untuk pengembangan Unix.
kevin cline
20
apa manfaat dari tidak menggunakan notasi Hongaria "Tidak dibenci oleh rekan kerja Anda" terlintas dalam pikiran ...
Sean Patrick Floyd
25
adjHungarian nNotation vIs adjHard prepTo vRead.
dan04

Jawaban:

148

Karena niat awalnya (lihat http://www.joelonsoftware.com/articles/Wrong.html dan http://fplanque.net/Blog/devblog/2005/05/11/hungarian_notation_on_steroids ) telah disalahpahami dan telah ( ab) digunakan untuk membantu orang mengingat apa jenis variabel ketika bahasa yang mereka gunakan tidak diketik secara statis. Dalam bahasa apa pun yang diketik secara statis, Anda tidak perlu tambahan pemberat awalan untuk memberi tahu Anda apa jenis variabelnya. Dalam banyak bahasa skrip yang tidak diketik, ini bisa membantu, tetapi sering kali disalahgunakan sampai menjadi sangat sulit. Sayangnya, alih-alih kembali ke maksud semula dari notasi Hungaria, orang justru membuatnya menjadi salah satu hal "jahat" yang harus Anda hindari.

Notasi Hungaria singkatnya dimaksudkan untuk awalan variabel dengan beberapa semantik. Misalnya jika Anda memiliki koordinat layar (kiri, atas, kanan, bawah), Anda akan mengawali variabel dengan posisi layar absolut dengan " abs" dan variabel dengan posisi relatif ke jendela dengan " rel". Dengan cara itu akan jelas bagi setiap pembaca ketika Anda melewati koordinat relatif ke metode yang membutuhkan posisi absolut.

pembaruan (sebagai tanggapan terhadap komentar oleh delnan)

IMHO versi yang disalahgunakan harus dihindari seperti wabah karena:

  • itu mempersulit penamaan. Ketika (ab) menggunakan notasi Hongaria akan selalu ada diskusi tentang seberapa spesifik awalan perlu. Misalnya: listboxXYZatau MyParticularFlavourListBoxXYZ.
  • itu membuat nama variabel lebih lama tanpa membantu pemahaman untuk apa variabel itu.
  • itu semacam mengalahkan objek latihan ketika untuk menghindari awalan panjang ini disingkat menjadi singkatan dan Anda memerlukan kamus untuk mengetahui apa arti setiap singkatan. Apakah uibilangan bulat yang tidak ditandatangani? antarmuka terhitung yang tidak direferensikan? ada hubungannya dengan antarmuka pengguna? Dan hal-hal itu bisa lama . Saya telah melihat awalan lebih dari 15 karakter yang tampaknya acak yang seharusnya menyampaikan tipe var yang tepat tetapi benar-benar hanya membingungkan.
  • itu keluar dari tanggal dengan cepat. Ketika Anda mengubah jenis variabel orang selalu (lol) lupa untuk memperbarui awalan untuk mencerminkan perubahan, atau sengaja tidak memperbaruinya karena itu akan memicu perubahan kode di mana pun var digunakan ...
  • mempersulit berbicara tentang kode karena sebagai "@g." mengatakan: Nama variabel dengan notasi Hungaria biasanya sulit untuk diucapkan sup alfabet. Ini menghambat keterbacaan dan mendiskusikan kode, karena Anda tidak dapat 'mengatakan' salah satu nama.
  • ... banyak lagi yang tidak dapat saya ingat saat ini. Mungkin karena saya merasa senang tidak harus berurusan dengan notasi Hungaria yang disalahgunakan untuk waktu yang lama ...
Marjan Venema
sumber
9
@ Surfer513: Sebenarnya, saya lebih suka sufiks ketika memberi nama kontrol. Bagi saya itu jauh lebih menarik untuk menemukan semua kontrol yang berhubungan dengan subjek / aspek tertentu daripada menemukan semua kontrol edit ... Ketika saya ingin menemukan kontrol di mana pengguna dapat mengetikkan nama klien, saya akan mulai mencari client daripada txt, karena itu mungkin bukan txt (edit) tetapi memo atau richedit atau ... bahkan bisa menjadi kotak kombo untuk memungkinkan menemukannya dalam nama klien yang dimasukkan sebelumnya ...
Marjan Venema
8
@ Surfer513: Dan saat ini saya cenderung menggunakan sufiks hanya ketika membedakan antara dua kontrol yang berhubungan dengan hal yang sama. Misalnya label dan edit untuk nama klien. Dan seringkali sufiks tidak terkait dengan jenis kontrol, tetapi untuk tujuannya: ClientCaption dan ClientInput misalnya.
Marjan Venema
3
Perlu juga dicatat bahwa Intellisense di VS 2010 memungkinkan Anda untuk mencari seluruh nama, bukan hanya awal. Jika Anda memberi nama kontrol "firstNameTextBox" dan ketik "textb", itu akan menemukan kontrol Anda dan daftar.
Adam Robinson
4
'... versi yang disalahgunakan dihindari seperti plak ...' yang bisa dikatakan, dihindari sedikit kurang dari karang gigi dan gingivitis? ;-)
Ben Mosher
4
@ Marsjan: Tentu saja seorang kompiler dapat mengambil ini. Jika setiap unit diwakili oleh suatu tipe, maka Anda tidak dapat secara tidak sengaja melewati satu sama lain. Di sini, jika Anda memiliki a AbsoluteXTypedan a RelativeYType, maka Anda tidak dapat secara keliru melewati koordinat relatif Y untuk X absolut. Saya lebih suka variabel yang mewakili entitas yang tidak kompatibel dari jenis yang tidak kompatibel, daripada memiliki awalan yang tidak kompatibel. Perawatan kompiler bukan untuk awalan (atau sufiks).
Matthieu M.
74

Notasi Hongaria adalah penamaan anti-pola dalam lingkungan pemrograman modern dan bentuk Tautologi .

Itu berguna mengulangi informasi tanpa manfaat dan biaya tambahan pemeliharaan. Apa yang terjadi ketika Anda mengubah Anda intke jenis yang berbeda seperti long, sekarang Anda harus mencari dan mengganti seluruh basis kode Anda untuk mengubah nama semua variabel atau mereka sekarang secara semantik salah yang lebih buruk daripada jika Anda tidak menduplikasi jenis dalam nama.

Itu melanggar prinsip KERING. Jika Anda harus mengawali tabel database Anda dengan singkatan untuk mengingatkan Anda bahwa itu adalah sebuah tabel, maka Anda pasti tidak menamai tabel Anda secara semantik secara deskriptif. Hal yang sama berlaku untuk setiap hal lain yang Anda lakukan dengan ini. Ini hanya pengetikan ekstra dan bekerja tanpa keuntungan atau keuntungan dengan lingkungan pengembangan modern.

user7519
sumber
2
"Apa yang terjadi ketika kamu mengubah intke jenis yang berbeda seperti long..." Sederhana: <sarcasm> Jangan mengubah nama karena tidak ada yang tahu berapa banyak tempat perubahan akan beriak. </sarcasm> Jadi sekarang kamu memiliki variabel yang Nama Hongaria bertentangan dengan implementasinya. Sama sekali tidak ada cara untuk mengetahui seberapa luas efek mengubah nama akan terjadi jika variabel / fungsi memiliki visibilitas publik.
David Hammen
2
Artikel yang ditautkan ini fantastis, dan sangat layak dibaca. +1
Marty Pitt
6
@ David hanya melihat Win32 API yang penuh dengan variabel, parameter, dan bahkan nama metode yang menggunakan notasi Hungaria (yang merupakan persyaratan di MS) menunjukkan nilai 8 bit atau 16 bit ketika sebenarnya mereka semua sudah 32 bit nilai sejak diperkenalkannya Windows 95 kembali pada tahun 1994 (hampir 17 tahun yang lalu).
jwenting
2
@ Aman: Saya berpendapat bahwa itulah yang harus dilakukan tes otomatis. Bukan programmer.
Joel
2
@Secure mungkin tidak dalam aplikasi in-house, tetapi jika Anda mempertahankan API publik seperti Windows API, itu masalah besar.
jwenting
51

Wikipedia memiliki daftar kelebihan dan kekurangan dari notasi Hongaria dan dengan demikian mungkin dapat memberikan jawaban paling komprehensif untuk pertanyaan ini. Pendapat penting juga merupakan bacaan yang cukup menarik.

Manfaat tidak menggunakan notasi hungaria pada dasarnya hanya menghindari kerugiannya:

  • Notasi Hungaria berlebihan ketika pengecekan tipe dilakukan oleh kompiler. Kompiler untuk bahasa yang menyediakan pemeriksaan tipe memastikan penggunaan variabel konsisten dengan tipenya secara otomatis; pemeriksaan mata berlebihan dan tunduk pada manusia

  • Semua lingkungan pengembangan terintegrasi modern menampilkan tipe variabel sesuai permintaan, dan secara otomatis menandai operasi yang menggunakan tipe yang tidak kompatibel, membuat notasi sebagian besar usang.

  • Notasi Hongaria menjadi membingungkan ketika digunakan untuk mewakili beberapa properti, seperti dalam a_crszkvc30LastNameCol: argumen referensi konstan, memegang konten kolom LastNametipe database varchar(30)yang merupakan bagian dari kunci utama tabel.

  • Ini dapat menyebabkan inkonsistensi ketika kode dimodifikasi atau porting. Jika tipe variabel diubah, dekorasi pada nama variabel tidak akan konsisten dengan tipe baru, atau nama variabel harus diubah. Contoh yang sangat terkenal adalah WPARAMtipe standar , dan wParamparameter formal yang menyertai dalam banyak deklarasi fungsi sistem Windows. 'W' adalah singkatan dari 'word', di mana 'word' adalah ukuran kata asli dari arsitektur perangkat keras platform. Ini pada awalnya jenis 16 bit pada arsitektur kata 16-bit, tetapi diubah menjadi 32-bit pada arsitektur kata 32-bit, atau tipe 64-bit pada arsitektur kata 64-bit di versi sistem operasi yang lebih baru sambil tetap mempertahankan nama asli (jenis dasarnya adalahUINT_PTR, yaitu, bilangan bulat tak bertanda yang cukup besar untuk menampung sebuah pointer). Impedansi semantik, dan karenanya kebingungan programmer dan inkonsistensi dari platform-ke-platform, ada pada asumsi bahwa 'w' adalah singkatan dari 16-bit di lingkungan yang berbeda.

  • Sebagian besar waktu, mengetahui penggunaan variabel menyiratkan mengetahui jenisnya. Selain itu, jika penggunaan variabel tidak diketahui, itu tidak dapat disimpulkan dari jenisnya.

  • Notasi Hungaria sangat mengurangi manfaat menggunakan editor kode kaya fitur yang mendukung penyelesaian nama variabel, karena programmer harus memasukkan seluruh tipe specifier terlebih dahulu.

  • Itu membuat kode kurang terbaca, dengan mengaburkan tujuan variabel dengan tipe yang tidak perlu dan awalan pelingkupan.

  • Informasi jenis tambahan tidak cukup dapat menggantikan nama yang lebih deskriptif. Misalnya sDatabasetidak memberi tahu pembaca apa itu. databaseNamemungkin nama yang lebih deskriptif.

  • Ketika nama cukup deskriptif, informasi tipe tambahan bisa berlebihan. Misalnya firstNamekemungkinan besar string. Jadi penamaan itu sFirstNamehanya menambah kekacauan pada kode.

Saya sendiri tidak menggunakan notasi ini, karena saya tidak suka kebisingan teknis yang tidak perlu. Saya hampir selalu tahu jenis yang saya hadapi dan saya ingin bahasa yang bersih dalam model domain saya, tetapi saya menulis sebagian besar dalam bahasa yang diketik secara statis dan sangat diketik.

Falcon
sumber
1
Ini seharusnya jawaban yang benar. Ini sangat enak. +1
Saeed Neamati
Anda terlalu baik, Saeed. Saya menghargai penghargaan Anda tetapi jawaban lain untuk pertanyaan ini juga sangat bagus.
Falcon
11
Dipilih untuk satu kalimat: " Sebagian besar waktu, mengetahui penggunaan variabel menyiratkan mengetahui jenisnya. Selain itu, jika penggunaan variabel tidak diketahui, itu tidak dapat disimpulkan dari jenisnya. " - IMHO, ini adalah alasan # 1 untuk menghindari notasi Hongaria.
Daniel Pryden
19

Sebagai masalah khusus MS SQL Server:

Setiap prosedur tersimpan yang diawali dengan 'sp_' pertama kali dicari dalam database Master daripada yang dibuat. Ini akan menyebabkan keterlambatan dalam prosedur tersimpan yang dijalankan.

tsundoku
sumber
4
+1 untuk beberapa informasi yang sangat keren di sana. Saya menggunakan 'sp' sebagai awalan proc tersimpan saya, bukan 'sp_'. Tapi semua itu adalah fakta yang sangat sangat menarik dan alasan konkret untuk tidak menggunakan 'sp_' sebagai awalan proc yang tersimpan.
2
+1 Saya tidak pernah tahu ini, dan ketika saya mulai bekerja pada SQL Server, semua SP di tempat kerja saya sudah diawali sp_jadi saya hanya terjebak dengan konvensi.
Michael
Poin bagus, tapi tidak ada hubungannya dengan pertanyaan ini (Menggunakan sq dan bukan _sp). Ini seperti meninggalkan nama skema untuk objek yang tidak ada dalam skema default.
JeffO
1
Untuk Prosedur yang Disimpan Pengguna, saya menggunakan 'usp_' secara konvensional. Ini berfungsi untuk menghindari masalah yang disebutkan DAN membedakan bagi pembaca apakah sproc adalah sistem atau pengguna.
Payung
15

IMO manfaat terbesar dari tidak menggunakan bahasa Hungaria adalah fakta bahwa ia memaksa Anda untuk menggunakan nama-nama yang bermakna . Jika Anda memberi nama variabel dengan benar, Anda harus segera mengetahui jenisnya atau dapat menyimpulkannya dengan cepat dalam sistem yang dirancang dengan baik. Jika Anda perlu mengandalkan stratau blnatau lebih buruk dari semua objprefiks untuk mengetahui apa jenis variabel adalah, saya berpendapat itu menunjukkan masalah penamaan - baik nama variabel yang buruk secara umum atau terlalu generik untuk menyampaikan makna.

Ironisnya, dari pengalaman pribadi, skenario utama yang saya lihat di Hongaria digunakan adalah pemrograman "kargo-kultus" (yaitu kode lain yang menggunakannya, jadi mari kita terus menggunakannya hanya karena) atau dalam VB.NET untuk mengatasi fakta bahasanya case-insensitive (mis. Person oPerson = new Personkarena Anda tidak bisa menggunakan Person person = new Persondan Person p = new Personterlalu samar); Saya juga telah melihat awalan "the" atau "my" sebagai gantinya (seperti dalam Person thePerson = new Personatau yang jelek Person myPerson = new Person), dalam kasus tertentu.

Saya akan menambahkan satu - satunya waktu saya menggunakan Hongaria cenderung untuk kontrol ASP.NET dan itu benar-benar masalah pilihan. Saya merasa sangat jelek untuk mengetik TextBoxCustomerNameatau CustomerNameTextBoxmenentang yang lebih sederhana txtCustomerName, tetapi bahkan itu terasa "kotor". Saya merasa beberapa jenis konvensi penamaan harus digunakan untuk kontrol karena ada dapat beberapa kontrol yang menampilkan data yang sama.

Wayne M
sumber
13

Saya hanya akan fokus pada SQL Server sejak Anda menyebutkannya. Saya tidak melihat alasan untuk meletakkan 'tbl' di depan meja. Anda bisa melihat kode tSQL dan membedakan tabel dengan cara menggunakannya. Anda tidak akan pernah Select from stored_procedure.atau Select from table(with_param)suka Anda akan UDF atau Execute tblTableOrViewNamemenyukai prosedur yang tersimpan.

Tabel bisa dibingungkan dengan Tampilan, tetapi ketika sampai pada bagaimana mereka digunakan; tidak ada perbedaan, jadi apa gunanya? Notasi Hongaria dapat menghemat waktu Anda melihatnya di SSMS (di bawah tabel atau tampilan?), Tapi hanya itu saja.

Variabel dapat menimbulkan masalah, tetapi mereka harus dideklarasikan dan sungguh, seberapa jauh dari pernyataan pernyataan Anda, Anda berencana menggunakan variabel? Menggulir beberapa baris seharusnya tidak menjadi masalah besar kecuali Anda sedang menulis prosedur yang sangat panjang. Mungkin ide yang bagus untuk memecah kode yang panjang.

Apa yang Anda gambarkan menyakitkan, tetapi solusi Notasi Hongaria tidak benar-benar menyelesaikan masalah. Anda dapat melihat kode orang lain dan menemukan bahwa tipe variabel dapat berubah yang sekarang memerlukan perubahan ke nama variabel. Satu hal lagi untuk dilupakan. Dan jika saya menggunakan VarChar, Anda harus melihat pernyataan pernyataan untuk mengetahui ukurannya. Nama deskriptif mungkin akan membantu Anda lebih jauh. @PayPeriodStartDate cukup banyak menjelaskan sendiri.

JeffO
sumber
2
@Surfer: Kunci primer berbeda karena "PK" bukan tipe; "PK_TableName" mengatakan "ini adalah kunci utama untuk TableName", bukan "ini adalah TableName tipe PK". Sedangkan sisanya ... sepertinya Anda tidak benar-benar mendengarkan argumen di sini. Tolong berhenti menggunakan praktik menjijikkan ini yang hingga hari ini terus menurunkan kualitas kolektif semua kode.
Aaronaught
2
@Aaronaught, Anda menentukan satu aspek Notasi Hongaria ( en.wikipedia.org/wiki/Hungarian_notation ). Ini bukan hanya tipe, tetapi juga tujuan penggunaan. Jadi awalan dengan 'pk' untuk kunci utama sebenarnya adalah Notasi Hongaria. Saya mendengarkan argumen di sini, tetapi ada pengecualian (seperti situasi kunci utama) di mana tampaknya HN bermanfaat. Mungkin tidak. Saya masih mencoba untuk membungkus kepala saya di sekitar yang harus dan yang tidak untuk semua skenario. Saya telah belajar cukup banyak hari ini tentang hal itu dan telah memicu beberapa pemikiran hebat.
3
@Surfer: Itu tidak benar. Notasi Hungaria menjelaskan tipe (versi buruk) atau penggunaan khusus tipe tersebut (versi kurang buruk). PK juga bukan, itu bukan hanya menggambarkan sesuatu tentang tipe, itu menggambarkan perilaku . Ketika saya berbicara tentang, katakanlah, usia, itu benar-benar tidak menarik bahwa itu terjadi menjadi bilangan bulat, tetapi ketika berbicara tentang batasan database, "kunci utama untuk tabel X" adalah persis apa yang penting.
Aaronaught
4
Saya suka paragraf kedua ke terakhir Anda. Alasan perusahaan saya untuk menggunakan notasi Hongaria adalah "Ini memungkinkan kita dengan cepat melihat variabel apa yang global dan mana yang tidak." Dan kemudian Anda melihat deklarasi variabel dan ada 300 variabel per file, beberapa m * untuk modular (global), beberapa v * untuk lokal BAHWA MEREKA DEKAT DIREKSI DI TINGKAT MODULAR. "Oh, itu karena mereka hanya dimaksudkan untuk digunakan sebagai penduduk lokal, bukan modulars." facepalm
corsiKa
3
@Aaronaught: Dalam proyek saya saat ini, kami menggunakan nama tabel yang diawali dengan tbl_ . Walaupun saya bukan penggemar berat praktik ini, saya gagal melihat bagaimana ini "menurunkan kualitas kolektif semua kode" . Bisakah Anda memberi contoh?
Treb
6

Hal lain untuk ditambahkan adalah bahwa, singkatan apa yang akan Anda gunakan untuk seluruh kerangka kerja seperti .NET? Ya, sangat mudah diingat yang btnmewakili tombol dan txtmewakili kotak teks. Namun, apa yang Anda pikirkan untuk sesuatu seperti StringBuilder? strbld? Bagaimana dengan CompositeWebControl? Apakah Anda menggunakan sesuatu seperti ini:

CompositeWebControl comWCMyControl = new CompositeWebControl();

Salah satu ketidakefisienan dari notasi Hungaria adalah bahwa, dengan memiliki kerangka kerja yang lebih besar dan lebih besar, terbukti tidak hanya untuk tidak menambah manfaat tambahan, tetapi juga menambah kompleksitas bagi pengembang, karena mereka sekarang harus mempelajari awalan yang tidak standar semakin banyak.

Saeed Neamati
sumber
6

Menurut cara saya memandang berbagai hal, Notasi Hongaria adalah sebuah kludge untuk menyiasati sistem tipe yang kurang kuat. Dalam bahasa yang memungkinkan Anda untuk menentukan jenis Anda sendiri, itu relatif sepele untuk membuat jenis baru yang menyandikan perilaku yang Anda harapkan. Dalam kata-kata kasar Joel Spolsky tentang Notasi Hongaria ia memberikan contoh menggunakannya untuk mendeteksi kemungkinan serangan XSS dengan menunjukkan bahwa variabel atau fungsi tidak aman (kami) atau aman, tetapi masih bergantung pada programmer untuk memeriksa secara visual. Jika Anda memiliki sistem tipe yang dapat diperluas, Anda hanya dapat membuat dua tipe baru, UnsafeString dan SafeString, dan kemudian menggunakannya sesuai kebutuhan. Sebagai bonus, jenis penyandian menjadi:

SafeString encode(UnsafeString)

dan pendeknya mengakses internal UnsafeString atau menggunakan beberapa fungsi konversi lainnya menjadi satu-satunya cara untuk beralih dari UnsafeString ke SafeString. Jika semua fungsi output Anda hanya mengambil instance SafeString, menjadi mustahil untuk menampilkan string yang tidak terhindar [memunculkan shenanigans dengan konversi seperti StringToSafeString (someUnsafeString.ToString ()).

Harus jelas mengapa mengizinkan sistem tipe untuk kewarasan memeriksa kode Anda lebih baik daripada mencoba melakukannya dengan tangan, atau mungkin mata dalam kasus ini.

Dalam bahasa seperti C tentu saja, Anda mengacaukan bahwa int adalah int adalah int, dan tidak banyak yang dapat Anda lakukan tentang itu. Anda selalu bisa bermain game dengan struct tetapi masih bisa diperdebatkan apakah itu peningkatan atau tidak.

Adapun interpretasi lain dari Notasi Hongaria, yaitu awalan IE dengan jenis variabel, itu benar-benar bodoh dan mendorong praktik malas seperti menamai variabel uivxwFoo alih-alih sesuatu yang bermakna seperti countOfPeople.

Orclev
sumber
Bagaimana seseorang menyatakan tipe .NET atau Java untuk menggambarkan " int[]yang dapat dimodifikasi secara bebas tetapi tidak pernah dibagikan" atau " int[]yang dapat dibagikan secara bebas hanya di antara hal-hal yang tidak akan pernah memodifikasinya"? Jika suatu int[]bidang foomerangkum nilai-nilai {1,2,3}dapatkah seseorang membuatnya merangkum {2,2,3}tanpa mengetahui "tipe" int[]mana yang diwakilinya? Saya akan berpikir Java dan .NET akan menjadi jauh lebih baik jika - dengan tidak adanya dukungan tipe-sistem, mereka setidaknya mengadopsi konvensi penamaan untuk membedakan jenis-jenis tersebut.
supercat
4

Notasi Hungaria hampir sepenuhnya tidak berguna dalam bahasa yang diketik secara statis. Ini adalah fitur IDE dasar untuk menunjukkan jenis variabel dengan meletakkan mouse di atasnya, atau dengan cara lain; selain itu Anda dapat melihat apa jenisnya dengan melihat beberapa baris di tempat itu dinyatakan, jika tidak ada inferensi jenis. Inti dari inferensi tipe adalah untuk tidak memiliki suara tipe diulang di mana-mana, sehingga notasi hungaria biasanya dipandang sebagai hal yang buruk dalam bahasa dengan inferensi tipe.

Dalam bahasa yang diketik secara dinamis, kadang-kadang bisa membantu, tetapi bagi saya rasanya tidak otomatis. Anda sudah menyerahkan fungsi Anda karena dibatasi ke domain / kode domain yang tepat; jika semua variabel Anda dinamai dengan notasi hungaria, maka Anda hanya mereproduksi apa yang akan diberikan sistem tipe kepada Anda. Bagaimana Anda mengekspresikan variabel polimorfik yang dapat berupa bilangan bulat atau string dalam notasi hungaria? "IntStringX"? "IntOrStringX"? Satu-satunya tempat saya pernah menggunakan notasi hungaria adalah dalam kode assembly, karena saya mencoba untuk mendapatkan kembali apa yang akan saya dapatkan jika saya memiliki sistem tipe, dan itu adalah hal pertama yang pernah saya kodekan.

Ngomong-ngomong, aku tidak peduli dengan apa yang orang namai variabel-variabel mereka, kodenya mungkin masih tidak bisa dipahami. Pengembang membuang terlalu banyak waktu untuk hal-hal seperti gaya dan nama variabel, dan pada akhirnya Anda masih mendapatkan banyak perpustakaan dengan konvensi yang sama sekali berbeda dalam bahasa Anda. Saya sedang mengembangkan bahasa simbolis (yaitu: bukan berbasis teks) di mana tidak ada nama variabel, hanya pengidentifikasi unik, dan nama yang disarankan untuk variabel (tetapi sebagian besar variabel masih tidak memiliki nama yang disarankan karena tidak ada nama yang masuk akal untuk mereka); saat mengaudit kode yang tidak dipercaya, Anda tidak dapat bergantung pada nama variabel.

Longpoke
sumber
Ini juga sangat tidak berguna untuk sebagian besar bahasa yang diketik secara dinamis!
James Anderson
2
untuk IDE bahkan lebih buruk daripada pengkodean manual karena artinya penyelesaian kode diperlambat secara dramatis. Jika Anda memiliki 100 variabel integer, ketikkan int <alt-spasi> (misalnya) memunculkan 100 item untuk digulir. Jika yang Anda butuhkan adalah intVeryLongVariableName, penyelesaian kode Anda menjadi bermasalah. Tanpa hungaria, Anda cukup mengetikkan <alt-spasi> dan hanya memiliki 1 atau 2 opsi.
jwenting
3

Seperti biasa dalam kasus seperti itu, saya akan memposting jawaban sebelum saya membaca jawaban dari peserta lain. 

Saya melihat tiga "bug" dalam visi Anda: 

1) Jika Anda ingin mengetahui jenis variabel / parameter / atribut / kolom Anda dapat mengarahkan mouse Anda atau mengkliknya dan itu akan ditampilkan, di sebagian besar IDE modern. Saya tidak tahu alat apa yang Anda gunakan, tetapi terakhir kali saya dipaksa untuk bekerja di lingkungan yang tidak menyediakan fitur ini pada abad ke-20, bahasanya COBOL, oops tidak itu Fortran, dan bos saya tidak mengerti mengapa saya pergi. 

2 / Jenis dapat berubah selama siklus pengembangan. Bilangan bulat 32-bit dapat menjadi bilangan bulat 64-bit di beberapa titik, untuk alasan yang baik yang tidak terdeteksi pada awal proyek. Jadi, mengubah nama intX menjadi longX atau membiarkannya dengan nama yang menunjuk ke tipe yang salah adalah karma buruk. 

3) Apa yang Anda minta sebenarnya adalah redundansi. Redundansi bukanlah pola atau kebiasaan desain yang sangat baik. Bahkan manusia pun enggan terlalu banyak redundansi. Bahkan manusia pun enggan terlalu banyak redundansi. 

Oqaqiq
sumber
Saya mengerti IDE lanjutan / modern, dan saya sepenuhnya setuju dengan Anda. Tapi bagaimana dengan desain database? Katakanlah Anda memiliki kolom, atau parameter prosedur tersimpan. Trik melayang-layang tidak benar-benar bekerja dengan hal semacam itu. Anda harus melihat tabel / definisi proc yang disimpan. Apa yang kamu lakukan untuk itu?
3

Saya percaya sangat membutuhkan hungaria adalah gejala .
Gejala terlalu banyak variabel global ... atau memiliki fungsi terlalu lama untuk dipertahankan .

Jika definisi variabel Anda tidak terlihat, biasanya, Anda mendapat masalah.
Dan jika fungsi Anda tidak mengikuti konvensi yang mudah diingat , ada lagi, masalah besar.

Itu ... cukup banyak alasan mengapa banyak tempat kerja membuangnya, saya kira.

Itu berasal dari bahasa yang membutuhkannya .
Pada saat bonanza variabel global . (karena kurangnya alternatif)
Ini membantu kami dengan baik.

Hanya menggunakan nyata yang kita miliki untuk hari ini adalah Joel Spolsky satu .
Untuk melacak beberapa atribut tertentu dari variabel, seperti keamanannya .

( mis. "Apakah variabel safeFoobarmemiliki lampu hijau untuk disuntikkan ke dalam query SQL?
- Seperti namanya safe, ya")

Beberapa jawaban lain berbicara tentang fungsi editor yang membantu melihat jenis variabel saat Anda mengarahkannya. Dalam pandangan saya, mereka juga agak bermasalah untuk kewarasan kode . Saya percaya mereka di mana hanya dimaksudkan untuk refactoring , karena banyak fitur lainnya juga, (seperti fungsi lipat) dan tidak boleh digunakan pada kode baru.

ZJR
sumber
2

Saya pikir alasan untuk tidak menggunakan notasi Hongaria telah dibahas dengan baik oleh poster lain. Saya setuju dengan komentar mereka.

Dengan database saya menggunakan notasi Hungaria untuk objek DDL yang jarang digunakan dalam kode, tetapi jika tidak bertabrakan dalam ruang nama. Terutama ini turun ke indeks awalan dan menyebutkan batasan dengan jenisnya (PK, Inggris, FK, dan IN). Gunakan metode yang konsisten untuk memberi nama objek-objek ini dan Anda harus dapat menjalankan beberapa validasi dengan menanyakan metadata.

BillThor
sumber
Saya sering menemukan ini menjadi kasus ketika saya memiliki tabel id. Jika saya memiliki TABLE SomeStringById(int somestringId, varchar somestring)indeks itu juga akan secara logis SomeStringByIdtetapi itu menyebabkan tabrakan. Jadi saya menyebutnya idx_SomeStringById. Kemudian, untuk mengikutinya, saya akan melakukannya idx_SomeStringByValuehanya karena konyol memiliki yang idx_satu dan bukan yang lain.
corsiKa
1

alasan itu dihindari adalah karena sistem hungarian yang melanggar KERING (awalan adalah persis jenis yang kompiler dan (yang baik) IDE dapat berasal)

aplikasi awalan OTOH hungarian dengan penggunaan variabel (mis. scrxMouse berkoordinasi pada layar, ini bisa berupa int, pendek, panjang atau bahkan jenis khusus (typedefs bahkan memungkinkan Anda untuk mengubahnya dengan mudah))

kesalahpahaman sistem adalah apa yang menghancurkan Hongaria sebagai praktik terbaik

ratchet freak
sumber
2
Saya harus tidak setuju - apa yang menghancurkan Hongaria sebagai "praktik terbaik" adalah bahwa itu tidak pernah dekat dengan praktik terbaik (atau bahkan baik).
Jerry Coffin
2
@haylem: Saya sudah melihat artikel, dan kertas asli Simonyi, dan membaca kodenya. Setiap cara Anda melihatnya, itu ide buruk yang seharusnya tidak pernah melihat cahaya hari.
Jerry Coffin
1
Itu tidak selalu melanggar KERING dalam bahasa yang dinamis; itu hanya tidak otomatis. KERING tidak selalu baik; mis: makro C
Longpoke
3
IMO apa yang "menghancurkan" Hongaria adalah fakta bahwa bahkan "niat" tidak berguna dibandingkan dengan menggunakan nama deskriptif , meskipun untuk bersikap adil ketika Hongaria dibuat, tidak ada gerakan untuk memiliki kode yang dapat dibaca ...
Wayne Molina
1
@Wayne M: "nama deskriptif" mudah untuk dikatakan ketika kompiler pada dasarnya akan memungkinkan Anda untuk menggunakan esai untuk nama variabel. Ketika panjang nama-nama identifier benar-benar terbatas pada, nilai yang cukup sewenang-wenang rendah (saya pikir batas umum adalah delapan atau sepuluh karakter tidak yang sangat lama; Saya ingat bahwa Borland Turbo C 2 bahkan memiliki pilihan konfigurasi untuk panjang maksimum nama pengidentifikasi!), penyandian informasi yang berguna dalam sebuah nama hanya sedikit lebih rumit ...
sebuah CVn
1

Katakanlah kita memiliki metode seperti ini (dalam C #):

int GetCustomerCount()
{
    // some code
}

Sekarang dalam kode kita menyebutnya seperti ini:

var intStuff = GetCustomerCount();
// lots of code that culminates in adding a customer
intStuff++;

The int tidak memberitahu kita sangat banyak. Fakta bahwa sesuatu adalah int tidak memberi tahu kita apa yang ada di dalamnya. Sekarang anggap saja, kita menyebutnya seperti ini:

var customerCount = GetCustomerCount();
// lots of code that culminates in adding a customer
customerCount++;

Sekarang kita bisa melihat apa tujuan dari variabel tersebut. Apakah penting jika kita tahu itu int?

Namun, tujuan asli bahasa Hongaria adalah agar Anda melakukan sesuatu seperti ini:

var cCustomers = GetCustomerCount();
// lots of code that culminates in adding a customer
cCustomers++;

Ini bagus selama Anda tahu apa yang dimaksud dengan c . Tetapi Anda harus memiliki tabel standar awalan, dan semua orang harus mengetahuinya, dan setiap orang baru harus mempelajarinya untuk memahami kode Anda. Sedangkan customerCountatau countOfCustomerscukup jelas pada pandangan pertama.

Bahasa Hongaria memiliki beberapa tujuan dalam VB sebelum Option Strict Onada, karena dalam VB6 dan sebelumnya (dan dalam VB. NET dengan Option Strict Off) VB akan memaksa jenis, sehingga Anda dapat melakukan ini:

Dim someText As String = "5"
customerCount = customerCount + someText

Ini buruk, tetapi kompiler tidak akan memberi tahu Anda. Jadi, jika Anda menggunakan bahasa Hongaria, setidaknya Anda akan memiliki beberapa indikator tentang apa yang terjadi:

Dim strSomeText As String = "5"
intCustomerCount = intCustomerCount + strSomeText  // that doesn't look right!

Di .NET, dengan pengetikan statis, ini tidak perlu. Dan bahasa Hongaria terlalu sering digunakan sebagai pengganti penamaan yang baik. Lupakan orang Hongaria dan pilih nama yang baik saja.

Kyralessa
sumber
1

Saya menemukan banyak argumen yang bagus untuk menentang, tetapi saya tidak melihat: ergonomi.

Di masa lalu, ketika semua yang Anda miliki adalah string, int, bool dan float, karakter sibf sudah cukup. Tetapi dengan string + pendek, masalah dimulai. Gunakan seluruh nama untuk awalan, atau str_name untuk string? (Sementara nama hampir selalu bersifat string - bukan?) Ada apa dengan kelas jalanan? Nama menjadi lebih lama dan lebih lama, dan bahkan jika Anda menggunakan CamelCase, sulit untuk menentukan di mana tipe-awalan berakhir dan di mana nama-variabel dimulai.

 BorderLayout boderLayoutInnerPanel = new BorderLayout ();
 panelInner.addLayout (borderLayoutInnerPanel);

Oke - Anda bisa menggunakan garis bawah, jika Anda belum menggunakannya untuk sesuatu yang lain, atau menggunakan CamelCase jika Anda menggunakan garisbawahi begitu lama:

 BorderLayout boderLayout_innerPanel = new BorderLayout ();
 panel_inner.addLayout (borderLayout_innerPanel);

 Border_layout boder_layoutInner_panel = new Border_layout ();
 panelInner.add_layout (border_layoutInner_panel);

Ini mengerikan dan jika Anda melakukannya akibatnya, Anda akan melakukannya

 for (int iI = 0; iI < iMax-1; ++iI)
     for (int iJ = iI; iJ < iMax; ++iMax) 
          int iCount += foo (iI, iJ); 

Entah Anda akan berakhir menggunakan awalan yang tidak berguna untuk kasus sepele, seperti variabel lingkaran atau count. Kapan Anda baru saja menggunakan short atau long untuk counter? Jika Anda membuat pengecualian, Anda akan sering kehilangan waktu, berpikir perlu awalan atau tidak.

Jika Anda memiliki banyak variabel, mereka biasanya dikelompokkan dalam browser objek yang merupakan bagian dari IDE Anda. Sekarang jika 40% dimulai dengan i_ untuk int, dan 40% dengan s_ untuk string, dan mereka diurutkan berdasarkan abjad, sulit untuk menemukan bagian signifikan dari nama.

Pengguna tidak diketahui
sumber
1

Satu tempat di mana saya masih secara teratur menggunakan sufiks Hungaria atau analog adalah dalam konteks di mana data semantik yang sama hadir dalam dua bentuk yang berbeda, seperti konversi data. Ini mungkin dalam kasus di mana ada beberapa unit pengukuran, atau di mana ada beberapa bentuk (misalnya, String "123" dan bilangan bulat 123).

Saya menemukan alasan yang diberikan di sini untuk tidak menggunakannya memaksa untuk tidak memaksakan Hongaria pada orang lain, tetapi hanya sedikit sugestif, untuk memutuskan praktik Anda sendiri.

Kode sumber suatu program adalah antarmuka pengguna dengan sendirinya - menampilkan algoritma dan metadata ke pengelola - dan redundansi dalam antarmuka pengguna adalah suatu kebajikan, bukan dosa . Lihat, misalnya, gambar-gambar dalam " Desain Hal-Hal Sehari-hari ", dan lihatlah pintu-pintu berlabel "Dorong" yang terlihat seperti Anda menariknya, dan pada keran bir para operator meretas ke kontrol reaktor nuklir penting karena entah bagaimana "melayang di atas mereka di IDE "tidak cukup baik.

The "just hover in a IDE" bukan alasan untuk tidak menggunakan bahasa Hongaria - hanya alasan yang mungkin tidak berguna bagi sebagian orang. Jarak tempuh Anda mungkin berbeda.

Gagasan bahwa Hongaria membebankan beban perawatan yang signifikan ketika jenis variabel berubah konyol - seberapa sering Anda mengubah jenis variabel? Selain itu, mengubah nama variabel mudah:

Cukup gunakan IDE untuk mengganti nama semua kejadian. -Gander, membalas Goose

Jika bahasa Hongaria benar-benar membantu Anda dengan cepat mendapatkan sepotong kode dan mempertahankannya dengan andal, gunakan saja. Jika tidak, jangan. Jika orang lain memberi tahu Anda bahwa Anda salah tentang pengalaman Anda sendiri, saya sarankan mereka yang salah.

Ed Staub
sumber