Apakah notasi Hongaria merupakan solusi untuk bahasa dengan pengetikan statis yang kurang ekspresif? [Tutup]

28

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 + yBardi 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).

Ryan C. Thompson
sumber
Pascal - walaupun jika Anda mencoba dan menambahkan tipe XCood dan YCoord yang Anda tetapkan dalam Pascal Anda hanya akan mendapatkan peringatan kompiler IIRC
mcottle
1
blog.moertel.com/articles/2006/10/18/… adalah artikel tentang melakukan sesuatu yang sangat mirip dengan "apps hungarian" di sistem tipe di Haskell.
Logan Capaldo
1
F # memiliki fitur gaya ini juga.
Rangoric
Itu tautan artikel yang sangat bagus (The moertel.com) yang menunjukkan dengan tepat hal yang saya pikirkan: menggunakan sistem tipe untuk mengubah kerentanan keamanan string-interpolasi dan semacamnya menjadi kesalahan waktu kompilasi. Terima kasih untuk tautannya.
Ryan C. Thompson
Saya pikir banyak OO terjebak dengan notasi Hungaria untuk semantik, karena hari ini Anda mungkin akan menulis: Foo.Position.X + Bar.Position.Y.
Pieter B

Jawaban:

27

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:

  1. Informasi itu penting.
  2. Informasi itu tidak penting.

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:

memperluas konsep "tipe" untuk mencakup informasi semantik di samping informasi representasi penyimpanan.

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

Jörg W Mittag
sumber
C, di mana notasi Hongaria adalah AFAIK paling banyak digunakan, bukan bahasa OO.
Péter Török
4
@ PéterTörök: OO adalah pola desain, bukan fitur bahasa, meskipun bahasa modern dirancang untuk membuatnya mudah sedangkan C tidak.
Jan Hudec
3
@ PéterTörök: Saya menulis cukup banyak kode berorientasi objek di dataran C. Saya tahu apa yang saya bicarakan.
Jan Hudec
1
Meskipun mungkin benar bahwa informasi penting harus tertanam dalam tipe variabel daripada namanya, ada banyak hal penting yang harus dikatakan, tetapi sistem tipe mana yang tidak bisa diungkapkan. Sebagai contoh, jika S1merupakan satu-satunya referensi di mana saja di alam semesta ini untuk char[], yang pemegangnya dapat dan akan mengubahnya kapan pun diinginkan, tetapi tidak boleh membuka kode luar, dan S2merupakan referensi char[]yang tidak boleh diubah siapa pun, tetapi yang mungkin dibagikan dengan benda-benda yang berjanji untuk tidak mengubahnya, harus S1dan S2dianggap secara semantik sebagai "hal yang sama"?
supercat
1
@supercat - Anda menggambarkan tipe keunikan.
Jack
9

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 + yBardalam 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.

BHS
sumber
Berorientasi objek tidak diperlukan atau tidak cukup untuk bahasa untuk memungkinkan xFoo + yBartipe yang ditentukan pengguna, juga tidak aspek OO dari C ++ diperlukan untuk contoh itu untuk bekerja.
Luc Danton
Anda benar itu bukan OO itu tipe keamanan. Saya mengedit jawaban saya.
BHS
Hmm. Ini adalah poin yang baik bahwa Anda bisa membuat xFoo + yBarkesalahan 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.
Ryan C. Thompson
Dalam C ++, pengecekan tipe akan dilakukan pada waktu kompilasi juga, dan konversi dan semacamnya akan dioptimalkan jauh pada kebanyakan kasus. Java tidak melakukannya juga, karena tidak memungkinkan kelebihan operator dan semacamnya - jadi Anda tidak dapat memperlakukan XCoordinatesebagai int reguler, misalnya.
cao
5

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.

Bruce Ediger
sumber
4

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 usuntuk string yang tidak aman, dan suntuk 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 dengan HtmlStringkelas. 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.

JacquesB
sumber
2

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)

jk.
sumber
2

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.

mcottle
sumber
1
Jika saya tidak salah, ini adalah jawaban lain yang membahas berbagai jenis notasi Hungaria daripada yang ditanyakan OP.
MatrixFrog
2
Jawaban ini menjelaskan apa yang disebut "Sistem Hongaria", di mana awalannya menunjukkan "tipe" tingkat bahasa. Pertanyaannya bertanya tentang "Aplikasi Hungaria", di mana kata "type" belum disalahpahami dan berarti tipe semantik . Sistem Hungaria hampir secara universal dikutuk akhir-akhir ini (dan memang benar; ini adalah bastardisasi tujuan sebenarnya dari pernyataan Hongaria). Aplikasi Hongaria, bagaimanapun, bisa menjadi hal yang baik.
cao
Editor yang mampu mencari sCustomer tanpa mengambil sCustomerName (vi dan emacs adalah 2 contoh) telah ada sejak tahun 70-an.
Larry Coleman
@Larry, mungkin, tetapi Anda tidak bisa menjalankannya pada sistem yang saya pemrograman pada '80 -an
mcottle
@cHAo, Tidak, tidak - Maksud saya mencoba menjelaskan mengapa orang menaruh informasi tambahan ke dalam nama variabel secara umum. Saya dengan rajin menghindari menyebutkan versi notasi Hongaria. Mungkin contoh yang saya berikan di bagian "mengapa pencarian & penggantian tidak berfungsi pada kode sumber" tampak seperti "Sistem Hongaria" tetapi itu tidak dimaksudkan untuk itu. Saya telah menghapus "s" utama untuk menghindari kebingungan.
mcottle
0

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.

James Anderson
sumber
9
Respons Anda menunjukkan bahwa Anda tidak memahami perbedaan antara "Aplikasi" asli Hungaria dan bastardisasi bodoh yang disebut "Sistem" Hongaria. Baca joelonsoftware.com/articles/Wrong.html
Ryan Culpepper