Dalam artikel Eric Lippert Ada Apa Dengan Notasi Hongaria? , ia menyatakan bahwa tujuan Notasi Hongaria (jenis yang baik) adalah untuk
memperluas konsep "tipe" untuk mencakup informasi semantik di samping informasi representasi penyimpanan.
Contoh sederhana adalah awalan variabel yang mewakili koordinat X dengan "x" dan variabel yang mewakili koordinat Y dengan "y", terlepas dari apakah variabel-variabel tersebut adalah bilangan bulat atau mengambang atau apa pun, sehingga ketika Anda secara tidak sengaja menulis xFoo + yBar
, kodenya jelas terlihat salah.
Tetapi saya juga telah membaca tentang sistem tipe Haskell, dan tampaknya di Haskell, seseorang dapat mencapai hal yang sama (yaitu "memperluas konsep tipe untuk mencakup informasi semantik") menggunakan tipe aktual yang akan diperiksa oleh kompiler untuk Anda. Jadi, dalam contoh di atas, xFoo + yBar
di Haskell sebenarnya akan gagal untuk mengkompilasi jika Anda merancang program Anda dengan benar, karena mereka akan dinyatakan sebagai jenis yang tidak kompatibel. Dengan kata lain, sepertinya sistem tipe Haskell secara efektif mendukung pemeriksaan waktu kompilasi yang setara dengan Notasi Hongaria
Jadi, apakah Hongaria Notasi hanyalah bantuan band untuk bahasa pemrograman yang sistem tipenya tidak dapat menyandikan informasi semantik? Atau apakah Notasi Hongaria menawarkan sesuatu yang melebihi apa yang ditawarkan sistem tipe statis seperti Haskell?
(Tentu saja, saya menggunakan Haskell sebagai contoh. Saya yakin ada bahasa lain dengan sistem tipe ekspresif (kaya? Kuat?) Yang serupa, meskipun saya belum menemukan satu pun.)
Untuk lebih jelasnya, saya tidak berbicara tentang memberi anotasi nama variabel dengan tipe data , melainkan dengan informasi tentang arti variabel dalam konteks program. Sebagai contoh, suatu variabel dapat berupa bilangan bulat atau mengambang atau ganda atau panjang atau apa pun, tetapi mungkin makna variabel adalah bahwa itu adalah koordinat x relatif yang diukur dalam inci. Ini adalah jenis informasi yang saya bicarakan penyandian melalui Notasi Hongaria (dan melalui jenis Haskell).
sumber
Jawaban:
Saya akan mengatakan "Ya".
Seperti yang Anda katakan, tujuan Notasi Hongaria adalah untuk menyandikan informasi dalam nama yang tidak dapat dikodekan dalam tipe. Namun, pada dasarnya ada dua kasus:
Mari kita mulai dengan kasus 2 terlebih dahulu: jika informasi itu tidak penting, maka Notasi Hongaria hanyalah suara berlebihan.
Kasus yang lebih menarik adalah nomor 1, tetapi saya berpendapat bahwa jika informasi itu penting, itu harus diperiksa, yaitu itu harus menjadi bagian dari jenis , bukan nama .
Yang membawa kita kembali ke kutipan Eric Lippert:
Sebenarnya, itu bukan "memperluas konsep tipe", itu adalah konsep tipe! The Seluruh tujuan dari jenis (sebagai alat desain) adalah untuk mengkodekan informasi semantik! Representasi penyimpanan adalah detail implementasi yang biasanya tidak termasuk dalam jenis sama sekali . (Dan khususnya dalam bahasa OO tidak boleh termasuk dalam jenis ini, karena independensi representasi adalah salah satu prasyarat utama untuk OO.)
sumber
S1
merupakan satu-satunya referensi di mana saja di alam semesta ini untukchar[]
, yang pemegangnya dapat dan akan mengubahnya kapan pun diinginkan, tetapi tidak boleh membuka kode luar, danS2
merupakan referensichar[]
yang tidak boleh diubah siapa pun, tetapi yang mungkin dibagikan dengan benda-benda yang berjanji untuk tidak mengubahnya, harusS1
danS2
dianggap secara semantik sebagai "hal yang sama"?Seluruh tujuan tipe (sebagai alat desain) adalah untuk menyandikan informasi semantik!
Saya menyukai jawaban ini dan ingin menindaklanjuti jawaban ini ...
Saya tidak tahu apa-apa tentang Haskell, tetapi Anda dapat mencapai sesuatu seperti contoh
xFoo + yBar
dalam bahasa apa pun yang mendukung beberapa bentuk keamanan jenis seperti C, C ++ atau Java. Dalam C ++ Anda bisa mendefinisikan kelas XDir dan YDir dengan operator '+' yang kelebihan beban yang hanya mengambil objek dari tipe mereka sendiri. Di C atau Java, Anda perlu melakukan penambahan menggunakan fungsi / metode add () alih-alih operator '+'.Saya selalu melihat Notasi Hongaria digunakan untuk informasi jenis, bukan semantik (kecuali sejauh semantik diwakili oleh jenis). Cara yang mudah untuk mengingat jenis variabel kembali pada hari-hari sebelum editor pemrograman "pintar" yang menampilkan jenis untuk Anda dengan satu atau lain cara tepat di editor.
sumber
xFoo + yBar
tipe yang ditentukan pengguna, juga tidak aspek OO dari C ++ diperlukan untuk contoh itu untuk bekerja.xFoo + yBar
kesalahan kompilasi (atau setidaknya kesalahan runtime) dalam hampir semua bahasa. Namun, apakah matematika dengan kelas XDir dan YDir di, katakanlah, Java atau C ++ lebih lambat dari matematika dengan angka mentah? Pemahaman saya adalah bahwa di Haskell, jenis diperiksa pada waktu kompilasi, dan kemudian pada saat runtime, itu hanya akan menjadi matematika mentah tanpa pengecekan tipe, dan karenanya tidak lebih lambat daripada menambahkan angka biasa.XCoordinate
sebagai int reguler, misalnya.Saya menyadari bahwa ungkapan "Notasi Hongaria" berarti sesuatu yang berbeda dari aslinya , tetapi saya akan menjawab "tidak" untuk pertanyaan itu. Variabel penamaan dengan tipe semantik atau komputasi tidak melakukan hal yang sama dengan mengetik gaya SML atau Haskell. Bahkan bukan bandaid. Mengambil C sebagai contoh, Anda dapat memberi nama gpszTitle variabel, tetapi variabel itu mungkin tidak memiliki cakupan global, itu mungkin bahkan bukan merupakan titik untuk string yang diakhiri dengan null.
Saya pikir notasi Hungaria yang lebih modern bahkan memiliki divergensi yang lebih besar dari sistem deduksi tipe yang kuat, karena mereka mencampur informasi "semantik" (seperti "g" untuk global atau "f" untuk bendera) dengan tipe komputasi ("p" pointer, " i "integer, dll.) Itu hanya berakhir sebagai kekacauan yang tidak suci di mana nama variabel hanya memiliki kemiripan yang samar dengan tipe komputasinya (yang berubah seiring waktu) dan semua terlihat sangat mirip sehingga Anda tidak dapat menggunakan" pertandingan berikutnya "untuk temukan variabel dalam fungsi tertentu - semuanya sama.
sumber
Notasi Hungaria diciptakan untuk BCPL, bahasa yang tidak memiliki tipe sama sekali. Atau lebih tepatnya, itu persis satu tipe data, kata itu. Sebuah kata dapat berupa pointer atau karakter atau boolean atau bilangan bulat biasa tergantung pada bagaimana Anda menggunakannya. Jelas ini membuatnya sangat mudah untuk membuat kesalahan mengerikan seperti mendereferensi karakter. Jadi notasi Hungaria diciptakan sehingga programmer setidaknya bisa melakukan pengecekan tipe manual dengan melihat kode.
C, turunan dari BCPL, memiliki tipe berbeda untuk bilangan bulat, pointer, karakter, dll. Ini membuat notasi dasar Hongaria berlebihan sampai batas tertentu (Anda tidak perlu menyandikan dalam nama variabel jika itu int atau pointer), tetapi semantik di luar level ini masih tidak dapat dinyatakan sebagai tipe. Hal ini menyebabkan perbedaan antara apa yang disebut "Sistem" dan "Aplikasi" Hongaria. Anda tidak perlu menyatakan bahwa variabel adalah int, tetapi Anda bisa menggunakan huruf-kode untuk menunjukkan apakah int adalah koordinat katakana x atau y atau indeks.
Lebih banyak bahasa modern memungkinkan definisi tipe kustom, yang berarti Anda dapat menyandikan batasan semantik dalam tipe tersebut, alih-alih dalam nama variabel. Sebagai contoh, bahasa OO tipikal akan memiliki tipe spesifik untuk koordinat-pasangan dan area, jadi Anda menghindari menambahkan koordinat x ke koordinat y.
Misalnya, dalam artikel terkenal Joels yang memuji Apps Hungarian, ia menggunakan contoh awalan
us
untuk string yang tidak aman, dans
untuk string yang aman (disandikan html), untuk mencegah injeksi HTML. Pengembang dapat mencegah kesalahan injeksi HTML dengan hanya memeriksa kode dengan hati-hati dan memastikan bahwa awalan variabel cocok. Contohnya adalah dalam VBScript, bahasa yang sekarang usang yang awalnya tidak mengizinkan kelas khusus. Dalam bahasa modern masalahnya dapat diperbaiki dengan tipe kustom, dan memang inilah yang dilakukan Asp.net denganHtmlString
kelas. Dengan cara ini kompiler akan secara otomatis menemukan kesalahan, yang jauh lebih aman daripada mengandalkan bola mata manusia. Jadi jelas bahasa dengan tipe khusus menghilangkan kebutuhan untuk "Aplikasi Hungaria" dalam hal ini.sumber
Ya, meskipun banyak bahasa yang memiliki sistem tipe cukup kuat masih memiliki masalah - kemampuan mengungkapkan jenis baru yang didasarkan pada / mirip dengan jenis yang ada.
yaitu Dalam banyak bahasa di mana kita bisa menggunakan sistem tipe lebih banyak kita tidak melakukannya karena overhead membuat tipe baru yang pada dasarnya sama dengan tipe yang ada selain nama dan beberapa fungsi konversi terlalu besar.
Pada dasarnya kita membutuhkan semacam typedef yang sangat diketik untuk membunuh notasi Hungaria sepenuhnya dalam bahasa-bahasa ini (F # style UoM juga bisa melakukannya)
sumber
Ingat, ada saat ketika IDE tidak memiliki petunjuk popup yang memberi tahu Anda apa jenis variabelnya. Ada saat ketika IDE tidak memahami kode yang mereka edit sehingga Anda tidak bisa beralih dari penggunaan ke deklarasi dengan mudah. Ada juga suatu waktu, ketika Anda tidak bisa memperbaiki nama variabel tanpa secara manual melalui seluruh basis kode, membuat perubahan dengan tangan dan berharap Anda tidak ketinggalan satu. Anda tidak dapat menggunakan pencarian & ganti karena mencari Pelanggan juga memberi Anda Nama Pelanggan ...
Kembali di hari-hari yang gelap itu, sangat membantu untuk mengetahui jenis variabel apa yang digunakan. Jika dirawat dengan baik (BESAR jika karena kurangnya alat refactoring) Notasi Hungaria memberi Anda itu.
Biaya untuk nama-nama mengerikan yang dihasilkannya saat ini terlalu tinggi tetapi itu hal yang relatif baru. Masih banyak kode yang ada sebelum perkembangan IDE yang saya jelaskan.
sumber
Benar!
Di luar bahasa yang sama sekali tidak diketik seperti Assembler, notasi Hungaria berlebihan dan menjengkelkan. Keraguan jadi ketika Anda menganggap bahwa sebagian besar IDE memeriksa keamanan jenis seperti Anda, eh, ketik.
Tambahan "i" "d" dan "?" awalan hanya membuat kode kurang mudah dibaca, dan, dapat benar-benar menyesatkan - seperti ketika "orker-sapi" mengubah jenis iaSumsItems dari Integer ke Long tetapi tidak repot-repot refactoring nama bidang.
sumber