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?
sumber
Jawaban:
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:
listboxXYZ
atauMyParticularFlavourListBoxXYZ
.ui
bilangan 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.sumber
AbsoluteXType
dan aRelativeYType
, 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).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
int
ke jenis yang berbeda sepertilong
, 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.
sumber
int
ke jenis yang berbeda sepertilong
..." 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.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:
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.
sumber
Sebagai masalah khusus MS SQL Server:
sumber
sp_
jadi saya hanya terjebak dengan konvensi.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
str
ataubln
atau lebih buruk dari semuaobj
prefiks 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 Person
karena Anda tidak bisa menggunakanPerson person = new Person
danPerson p = new Person
terlalu samar); Saya juga telah melihat awalan "the" atau "my" sebagai gantinya (seperti dalamPerson thePerson = new Person
atau yang jelekPerson 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
TextBoxCustomerName
atauCustomerNameTextBox
menentang yang lebih sederhanatxtCustomerName
, 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.sumber
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.
atauSelect from table(with_param)
suka Anda akan UDF atauExecute tblTableOrViewName
menyukai 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.
sumber
Hal lain untuk ditambahkan adalah bahwa, singkatan apa yang akan Anda gunakan untuk seluruh kerangka kerja seperti .NET? Ya, sangat mudah diingat yang
btn
mewakili tombol dantxt
mewakili kotak teks. Namun, apa yang Anda pikirkan untuk sesuatu sepertiStringBuilder
?strbld
? Bagaimana denganCompositeWebControl
? Apakah Anda menggunakan sesuatu seperti ini: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.
sumber
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:
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.
sumber
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 suatuint[]
bidangfoo
merangkum 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.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.
sumber
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.
sumber
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
safeFoobar
memiliki 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.
sumber
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.
sumber
TABLE SomeStringById(int somestringId, varchar somestring)
indeks itu juga akan secara logisSomeStringById
tetapi itu menyebabkan tabrakan. Jadi saya menyebutnyaidx_SomeStringById
. Kemudian, untuk mengikutinya, saya akan melakukannyaidx_SomeStringByValue
hanya karena konyol memiliki yangidx_
satu dan bukan yang lain.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
sumber
Katakanlah kita memiliki metode seperti ini (dalam C #):
Sekarang dalam kode kita menyebutnya seperti ini:
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:
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:
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
customerCount
ataucountOfCustomers
cukup jelas pada pandangan pertama.Bahasa Hongaria memiliki beberapa tujuan dalam VB sebelum
Option Strict On
ada, karena dalam VB6 dan sebelumnya (dan dalam VB. NET denganOption Strict Off
) VB akan memaksa jenis, sehingga Anda dapat melakukan ini: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:
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.
sumber
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.
Oke - Anda bisa menggunakan garis bawah, jika Anda belum menggunakannya untuk sesuatu yang lain, atau menggunakan CamelCase jika Anda menggunakan garisbawahi begitu lama:
Ini mengerikan dan jika Anda melakukannya akibatnya, Anda akan melakukannya
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.
sumber
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:
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.
sumber