Apakah Anda awalan nama variabel dengan singkatan dari tipe variabel? (Notasi Hongaria) [ditutup]

37

Dalam pekerjaan saya saat ini, tidak ada pedoman pengkodean. Semua orang cukup banyak kode sesuai keinginannya. Itu bagus, karena perusahaannya kecil.

Namun, seorang pria baru-baru ini mengusulkan untuk selalu menggunakan Notasi Hongaria. Sampai sekarang, sebagian dari kita menggunakan semacam Notasi Hongaria, sebagian dari kita tidak. Anda tahu, ini adalah perusahaan teknik, jadi gaya pengkodean tidak terlalu penting asalkan algoritmenya bagus.

Secara pribadi, saya merasa bahwa singkatan tipe kecil ini agak berlebihan. Nama yang dipikirkan dengan baik biasanya memberikan pesan yang sama. (Selanjutnya, sebagian besar kode kami harus dijalankan pada beberapa DSP aneh, di mana konsep suka boolatau floattidak ada pula).

Jadi, bagaimana perasaan Anda tentang Notasi Hongaria? Apakah Anda menggunakannya? Mengapa?

bastibe
sumber
Lihat juga: programmers.stackexchange.com/questions/14789/…
Kramii Reinstate Monica
7
Bahasa pemrograman apa yang Anda gunakan?
Larry Coleman
3
Sebenarnya itu tidak baik - Anda harus memiliki standar pengkodean (formal atau sebaliknya), menurut saya tidak pernah baik - baik saja ... tetapi orang lain mungkin tidak setuju.
Murph
@Larry: Kami kebanyakan menggunakan C dan C ++, dengan segelintir Assembler dan Lua di sana-sini.
bastibe
11
@Paperflyer, standar pengkodean / aturan bukan untuk pelanggan, mereka untuk tim pengembangan. Kecuali Anda yakin pengembang yang sama akan menjadi staf selamanya (tidak realistis), saya sangat percaya Anda harus menetapkan dan mengikuti standar pengkodean. Ini mengarah ke sistem yang lebih dapat dipelihara, membuat anggota staf baru lebih cepat, dan lebih konsisten. Yang sedang berkata, saya setuju bahwa notasi Hongaria telah terbukti berlebihan, dan lebih merupakan peninggalan masa lalu. Nama yang dipikirkan dengan baik lebih penting, terutama dengan IDE yang jauh lebih kuat yang digunakan saat ini.
Mark Freedman

Jawaban:

77

Ketika kebanyakan orang mengatakan "Notasi Hongaria" mereka sebenarnya berbicara tentang " Sistem Hongaria ".

Sistem Hongaria sama sekali tidak berguna dan harus dihindari. Tidak perlu menyandikan tipe variabel dalam nama itu. Namun, Sistem Hongaria sebenarnya adalah kesalahpahaman dari bahasa Hongaria " asli " yang asli: Aplikasi Hongaria.

Di Apps Hungarian, Anda tidak menyandikan "tipe" di nama variabel, Anda menyandikan "jenis" variabel. Jadi tidak nWidth, tetapi pxWidthatau emWidth(masing-masing untuk "lebar dalam piksel" atau "lebar dalam ems). Tidak strNamekecuali sNameatau usName(masing-masing untuk "nama aman" atau "nama tidak aman" - berguna ketika menerima input dari pengguna: string tidak aman).

Secara pribadi, saya biasanya tidak peduli dengan baik. Kecuali jika saya melakukan sesuatu yang secara eksplisit mengubah "jenis" suatu nilai (misalnya, saya telah menggunakan awalan "px" dan "em" di masa lalu karena membuat kesalahan pxArea = emWidth * emHeighttampak jelas).

Lihat juga, artikel Joel, " Membuat Kode yang Salah Terlihat Salah ."

Dean Harding
sumber
2
Lihatlah tulisan Simonyi tentang masalah ini: Dia adalah pembuat asli bahasa Hongaria, dan versinya adalah yang berguna. msdn.microsoft.com/en-us/library/aa260976(v=vs.60).aspx
Michael Kohne
1
Harus ada beberapa cara untuk memasukkan unit dalam tipe khusus jika Anda benar-benar membutuhkannya (sama untuk string yang aman / tidak aman). Namun, saya dapat melihat bahwa Anda bisa mengalami masalah kinerja melakukan itu (Anda tidak ingin membungkus float di kelas, misalnya). Dalam F # ini memperkenalkan fitur unit ukuran, yang pada dasarnya menambahkan informasi tipe tambahan ke ganda, hanya untuk tujuan ini.
Scott Whitlock
1
Dalam menangani kode input pengguna saya merasa berguna untuk awalan data pengguna dengan rawyaiturawUsername
zzzzBov
1
@ Hemat opsi lain adalah typedef yang sangat diketik
jk.
1
@ JBR: Apakah Anda benar-benar membaca jawabannya? Dalam "Apps Hungarian", sini bukan untuk stringatau sesuatu, tetapi untuk "safe" (atau saya juga pernah mendengar "safe string").
31

kata kerjaAnda kata kerjaHarus adverbTidak pernah kata kerjaGunakan kata sifatHunarian nounNotation, prepositionIndo kata kerjaAkibat kolektifuntukunun adverb segala sesuatuJadi perbandingan kata sifatBerbanding kata sifatBerkat infinitif terlalu tinggi untuk kata kerjaBaca.

nyengir
sumber
6
Membuatku tersenyum ... kesedihan, tapi "to" adalah preposisi, bukan infinitif. "membaca" adalah infinitif.
DrAl
@ral tentu saja, itu ada di daftar lucu, bukan orang aneh tata bahasa: D
smirkingman
1
Itu luar biasa, membuat saya tertawa. :)
Corv1nus
26

Pertama:

Anda tahu, ini adalah perusahaan teknik, jadi gaya pengkodean tidak terlalu penting asalkan algoritmenya bagus.

Gaya pengkodean menjadi masalah terlepas dari perusahaan. Ya, algoritme harus baik, tetapi kode harus dipelihara oleh semua orang, bukan hanya pengembang asli. Memiliki standar pengkodean yang mencakup elemen gaya perlu beberapa cara untuk mencapainya. Saya tidak mengatakan semua kode harus identik dalam gaya - itu akan menjadi kontra produktif, tetapi harus ada tingkat konsistensi.

Sekarang ke notasi Hongaria:

Meskipun memiliki kegunaannya, dengan IDE modern yang mendukung perilaku tipe IntelliSense, tidak perlu menyertakan jenis variabel dalam namanya. Informasi ini tersedia untuk Anda dengan cara lain. Lebih buruk lagi dapat membuat kode lebih sulit untuk dibaca jika Anda harus mengubah jenis variabel di masa depan.

ChrisF
sumber
21

Jangan gunakan itu. Itu berlebihan dan membuat kode lebih sulit dibaca.

kode kode
sumber
8
Ini lebih buruk daripada "berlebihan". Untuk beberapa situasi kompleks, sulit untuk mendapatkan yang benar. Secara khusus, setiap kelas yang Anda tentukan di aplikasi Anda perlu singkatan. Setelah mendefinisikan 20 atau lebih kelas, Anda kehabisan singkatan satu huruf. Apa sekarang? Campuran satu huruf dan dua huruf? Bagaimana dengan referensi kompleks ke elemen struktur data? Pointer ke array pemetaan daftar ke pemetaan dari bilangan bulat ke string? Bagaimana singkatan itu bisa membantu?
S. Lott
13

Banyak perdebatan tentang (Sistem) Notasi Hongaria tergantung pada bidang pekerjaan. Saya dulu sangat tegas di sisi "tidak mungkin!", Tetapi setelah bekerja selama beberapa tahun di sebuah perusahaan di mana ia digunakan untuk pengembangan tertanam saya dapat melihat beberapa keuntungan dari itu dalam aplikasi tertentu dan sudah pasti tumbuh pada saya .

Sistem Hongaria

Dari apa yang bisa saya katakan, Sistem Hongaria cenderung banyak digunakan di bidang tertanam. Dalam aplikasi PC, kompiler akan menangani banyak masalah yang terkait dengan perbedaan antara (misalnya) nilai string, integer dan floating point. Pada platform yang tertanam dalam, Anda lebih sering khawatir tentang perbedaan antara bilangan bulat 8-bit yang tidak ditandatangani, bilangan bulat bertanda 16-bit dll. Kompilator (atau bahkan serat dengan aturan MISRA ditegakkan) tidak selalu mengambil ini. Dalam hal ini memiliki nama variabel seperti u8ReadIndex, s16ADCValuedapat bermanfaat.

Aplikasi Hungaria

Aplikasi Hungarian memiliki keuntungan yang pasti dalam hal aplikasi PC / Web, misalnya menawarkan perbedaan visual antara string 'tidak aman' dan string 'aman' (yaitu yang dimasukkan oleh pengguna dan yang telah melarikan diri atau membaca dari sumber daya internal atau apa pun ). Kompiler tidak memiliki pengetahuan tentang perbedaan ini.

Apa gunanya?

Penggunaan (Sistem atau Aplikasi) Hongaria adalah tentang membuat kode yang salah terlihat salah .

Jika Anda menyalin string yang tidak aman langsung ke string yang aman tanpa melarikan diri, itu akan terlihat salah jika Anda menggunakan Apps Hungarian.

Jika Anda mengalikan integer yang ditandatangani dengan integer yang tidak ditandatangani, kompiler akan (sering kali secara diam-diam) mempromosikan yang ditandatangani menjadi (yang kemungkinan besar) yang tidak ditandatangani, mungkin mengakibatkan kesalahan: Sistem Hongaria membuat ini terlihat salah.

Dalam kedua situasi ini, (Aplikasi / Sistem) notasi Hongaria cenderung membuat ulasan kode formal lebih cepat karena ada kurang merujuk kembali ke jenis variabel.

Secara keseluruhan

Secara keseluruhan, pendapat saya adalah yang paling penting adalah Anda memiliki standar pengkodean. Apakah itu menggunakan Sistem Hungaria, Aplikasi Hungaria atau tidak adalah masalah preferensi pribadi atau kelompok, seperti pilihan jenis indentasi dll. Namun, ada keuntungan yang pasti bagi seluruh tim pengembangan yang bekerja dengan preferensi yang sama.

DrAl
sumber
Anda harus memperjelas bahasa apa yang Anda bicarakan. Karena Anda bekerja dengan pengembangan yang disematkan, saya asumsikan Anda menggunakan C? Bahasa Hongaria memang masuk akal dalam bahasa C, tetapi tidak dalam bahasa yang lebih modern.
JacquesB
9

Tujuan Notasi Hongaria adalah untuk menyandikan informasi ke dalam pengidentifikasi yang tidak dapat dikodekan dalam sistem tipe. Pendapat saya sendiri adalah bahwa jika informasi ini cukup penting untuk dikodekan, maka itu cukup penting untuk dikodekan dalam sistem tipe, di mana ia dapat diperiksa dengan benar. Dan jika informasi itu tidak penting, lalu mengapa Anda ingin mengacaukan kode sumber Anda dengannya?

Atau, lebih tepatnya: ketik informasi yang termasuk dalam sistem tipe. (Catatan: itu tidak harus menjadi sistem tipe statis . Selama itu menangkap kesalahan ketik, saya tidak peduli ketika menangkapnya.)

Beberapa jawaban lain menyebutkan Unit Ukur sebagai penggunaan Notasi Hongaria yang dapat diterima. (Saya agak terkejut bahwa belum ada yang menyebutkan NASA Mars Climate Orbiter, karena itu sepertinya muncul setiap saat dalam diskusi tentang Notasi Hongaria).

Berikut ini contoh sederhana dalam F #:

[<Measure>] type m
[<Measure>] type ft

let someLength      = 48.15<m>
let someOtherLength = 16.2342<ft>

someLength + someOtherLength
// someLength + someOtherLength
// -------------^^^^^^^^^^^^^^^
// error FS0001: The unit of measure 'ft' does not match the unit of measure 'm'.

Lihat, Bu, jangan orang Hongaria!

Jika saya adalah untuk menggunakan Hungaria Notasi bukan jenis di sini, itu tidak akan membantu saya sedikit:

let mSomeLength       = 48.15
let ftSomeOtherLength = 16.2342

mSomeLength + ftSomeOtherLength
// > val it : float = 64.3842

Kompiler membiarkannya lurus. Saya sekarang mengandalkan manusia untuk menemukan apa yang pada dasarnya adalah kesalahan tipe. Bukankah itu untuk tipe checker?

Lebih baik lagi, menggunakan bahasa pemrograman Frink :

someLength      = 48.15m
someOtherLength = 16.2342ft

someLength + someOtherLength
// 53.09818416 m (length)

// Wanna know the answer in a good old fashioned American unit?
someLength + someOtherLength -> yd
// 58.06888031496062992

// Are you an astrophysicist?
someLength + someOtherLength -> parsec
// 1.7207949554318336148e-15

// ... or a fundmentalist Christian who refuses to use units invented 
// less than 2000 years ago?
someLength + someOtherLength -> biblicalcubits
// 95.893563822870765006

Jadi, secara ringkas: Saya tidak suka Notasi Hongaria. Anda seharusnya tidak pernah menggunakannya.

Yang sedang berkata, saya pikir menggunakan Notasi Hongaria adalah ide yang baik. Tunggu apa?

Iya nih! Dalam kasus khusus ini , Anda menyebutkan:

Selain itu, sebagian besar kode kami harus dijalankan pada beberapa DSP aneh, di mana konsep seperti bool atau float tidak ada

Tapi itu justru satu-satunya kasus penggunaan masuk akal untuk Hungaria Notasi!


PS: Dengan sepenuh hati saya merekomendasikan untuk melihat Frink. Manualnya berisi beberapa lelucon kentut yang paling mengagumkan yang pernah ada. Ini juga bahasa yang cukup keren :-)

Jörg W Mittag
sumber
Saya akan memilih ini 50 kali jika saya bisa.
Larry Coleman
1
Argumen yang sangat menarik! Saya mungkin hanya mencobanya di proyek saya saat ini. typedef meter float...
bastibe
6

Itu tidak masuk akal dalam bahasa berorientasi objek - semuanya adalah jenis yang jelas ketika mencoba menggunakannya.

billy.bob
sumber
6

Satu-satunya tempat di mana Sistem Hongaria diperingatkan adalah dengan bahasa yang diketik dengan lemah seperti C. Ini sangat penting dengan C karena tidak ada objek eksplisit (ia memiliki struct, tetapi semua fungsi di luar struct). Dalam sesuatu yang diketik lebih kuat seperti C ++, Java, dan C # itu tidak membantu, dan bahkan membuat segalanya menjadi lebih buruk. Perubahan kode, dan jauh lebih mudah untuk mengubah jenis daripada mengubah semua tempat Anda menggunakan nama variabel. Ini juga pekerjaan yang tidak perlu yang cenderung diabaikan.

Jika Anda memiliki unit pengukuran, mungkin membantu untuk menyandikannya dalam nama - tetapi pada akhirnya itu juga bisa menjadi noise tambahan. Misalnya, kami akan mendeklarasikan satuan ukuran standar untuk hal-hal berbeda yang kami kerjakan dalam kode kami. Sebagai contoh, apakah kita menggunakan gradien atau derajat, meter atau kaki, bingkai atau milidetik? Setelah standar ditetapkan untuk kode, setiap kali kami membaca dalam satu unit ukuran, kami selalu segera mengonversi ke unit standar ukuran untuk kode.

Saran saya : mulailah dengan poin rasa sakit Anda saat ini dan pilih standar yang masuk akal untuk bagian kode itu. Menentukan standar pengkodean terlalu kontraproduktif. Ada banyak nilai dalam memiliki nama variabel dan bidang yang menguraikan apa yang mereka wakili, dan sebagian besar waktu Anda dapat menyimpulkan jenis dari konsep dengan aman.

Berin Loritsch
sumber
1
Sebenarnya, IDE yang baik (atau plugin) biasanya memiliki kemampuan refactoring yang sangat kuat yang dapat mengubah nama variabel dengan mudah.
bastibe
4
Dimengerti, tetapi derau tambahan dalam kontrol versi untuk perubahan nama juga tidak membantu. Anggap saja nilai tambah tidak membenarkan biaya perawatan.
Berin Loritsch
akan tergantung pada bahasa serta beberapa memiliki dukungan langsung untuk UoM yang diketik dengan stong atau yang diketik dengan stong
jk.
6

Heck, TIDAK!

Jangan gunakan notasi Hungaria atau notasi lainnya. Sebagai pemrogram, kita tidak boleh menggunakan "notasi" untuk nama variabel kita.

Apa yang harus kita lakukan adalah memberi nama variabel kita dengan baik :

  • Hindari nama yang terlalu umum. Jangan zberi nama saat itu adalah variabel kelas yang mewakili objek bernama, katakanlah, tagihan telepon. Sebut phoneBillatau PhoneBill.
  • Hindari nama yang terlalu spesifik. Ketika ada sesuatu yang jelas tanpa informasi tambahan jangan sertakan itu. Jika itu hanya variabel indeks string untuk perulangan melalui karakter string, dan Anda hanya menggunakannya sekali dalam fungsi MyFunc, mengapa Anda menyebutnya MyFuncTempStringCharacterIndex? Itu lelucon yang menyedihkan. Sebut Posatau bahkan ijika Anda suka. Dalam konteksnya, programmer selanjutnya akan dengan mudah memahami apa artinya.

  • Ketika memusatkan perhatian pada seberapa umum atau spesifik suatu nama seharusnya, pertimbangkan domain itu berada dan konteks makna yang mungkin lainnya. Dalam kasus sempit di mana ada dua item jenis yang mudah bingung, serupa yang digunakan dengan cara yang sama, maka boleh saja untuk membuat awalan atau akhiran untuk menunjukkan perbedaan itu. Jaga agar sesingkat mungkin.

Seperti yang telah dijawab oleh penjawab lain, case sempit ini yang memulai "Apps Hungarian", untuk membedakan antara pengukuran relatif terhadap jendela rwTabPositiondan relatif terhadap dokumen rdTabPosition. Tetapi dalam aplikasi yang melakukan segalanya relatif terhadap dokumen, jangan tambahkan kesalahan ekstra! Bahkan, mengapa tidak menggunakan ide Jörg W Mittag untuk membuat tipe baru yang sebenarnya? Maka Anda tidak mungkin membuat berbagai hal tercampur aduk.

Di hampir semua bidang, menambahkan hal-hal yang memiliki kepadatan makna minimal mengurangi kebermaknaan keseluruhan dan kemudahan pemahaman. Ini salah satu contoh dari Ben Franklin . Dan contoh lain: dimungkinkan dalam bahasa Inggris untuk menghias kata-kata kita dengan bagian bicaranya. Ini lebih banyak informasi, bukan? Kalau-kalau pemula ke Bahasa Inggris bingung, itu bisa sangat membantu mereka, kan? Baca ini dan beri tahu saya seberapa berguna menurut Anda ini untuk pemahaman jangka panjang dan pemberian informasi yang efisien:

vrbDo advnot vrbuse nouHunarian nounotation cnjor adjany adjun nounotation. prepA nouprogrammers, beri tahu kami harus tidak benar-benar menggunakan kata benda "nounotation" kecuali untuk kata benda yang dapat disesuaikan.

Dengan menambahkan informasi, saya membuatnya susah dibaca.

Jadi lupakan notasi. Lupakan awalan khusus yang selalu Anda tambahkan. Menurut pendapat saya, satu-satunya pedoman nyata di sini adalah:

Buat nama variabel sesingkat mungkin, sepenting yang diperlukan, dan selalu jelas .

ErikE
sumber
Ini hampir persis seperti standar kita. Satu-satunya perbedaan adalah bahwa kami lebih suka Pascal Case ketika menamai sesuatu sehingga Kapitalisasi konsisten.
DForck42
5

Tujuan pengidentifikasi lebih penting daripada jenisnya. Jika Anda menggunakan nama deskriptif untuk pengidentifikasi dalam program Anda, Anda tidak perlu menggunakan notasi Hongaria. isConnectedselalu lebih mudah dibaca dan mudah dipahami daripada boolConnected.

Mudassir
sumber
2
Saya sangat setuju! Inilah yang mereka sebut 'App Hungarian' sebagai kebalikan dari 'System Hungarian'.
bastibe
@ Bastibe: Tidak, ini yang mereka sebut nama deskriptif. Aplikasi Hongaria bergantung pada singkatan.
JacquesB
2

Kami menggunakan bahasa Hungaria kembali ketika saya masih seorang programmer C ++, dan itu hebat. Anda bisa melihat tipe variabel (fe BSTR, CString, LPCTSTR, atau char *) tanpa mencari deklarasi. Pada masa itu, Anda akan mencari deklarasi dengan melakukan:

  1. ctrl-home
  2. ctrl-F
  3. nama variabel
  4. memasukkan

Jadi itu cukup penting. Tetapi di sekitar tahun 2000, beberapa hal terjadi:

  • editor menjadi cukup cerdas untuk menampilkan tipe variabel sebagai tooltip
  • editor memiliki jalan pintas "pergi ke deklarasi", dan cara cepat untuk menelusuri kembali
  • C ++ lebih sedikit digunakan, dan sebagian besar bahasa lain memiliki lebih sedikit tipe variabel. Misalnya, dalam C #, Anda cukup yakin lastNameadalah System.String, karena hanya ada satu kelas string.

Saya adalah salah satu orang terakhir yang beralih dari bahasa Hongaria, dan sekarang ketika saya membaca kode sumber lama, itu benar-benar mengganggu saya.

Andomar
sumber
2

Saya hanya benci notasi hungaria, saya lebih suka menggunakan garis bawah untuk membatasi nama variabel.

Selain itu, ketika Anda meletakkan jenis sebagai huruf pertama di awal nama variabel Anda seperti ini: float fvelocity; vect vDirection; string ** ppszWord;

pelengkapan otomatis mengurutkan semuanya, dan Anda kesulitan menemukan apa yang Anda inginkan, dan orang cenderung menggunakan apa yang menurut mereka lebih baik, dan itu bukan notasi lagi.

Saya hanya suka menulis ThingsLikeThat ketika saya harus sangat deskriptif tentang variabel, karena menghemat ruang dan fakta ada topi membuatnya lebih mudah dibaca.

Apa yang biasanya saya lakukan, adalah nama metode dan kelas saya dengan huruf pertama menjadi Huruf besar, dan huruf kecil untuk nama variabel, dan garis bawah untuk nama variabel (Saya menemukan ini yang terakhir berguna).

Serius, saya lebih suka orang memperhatikan aturan-aturan itu: Gunakan koma, aritmatika, dan kawat gigi dengan ruang yang relevan:

void f(int a, char b);
int a = b + 4 / (3 + 4);

Tidak lebih dari 80 karakter per baris, ATAU PALING 90 karakter, gunakan argumen multi-baris untuk fungsi atau panjang if:

if
(
    checkthat(a, b) == checkthis(b, d) &&
    checkthat(d, b) == checkthis(v, d)
)
jokoon
sumber
1

Setuju dengan sebagian besar, itu gaya lama.

Dengan IDE modern, kursor cepat ke atas variabel menunjukkan jenisnya.

ozz
sumber
2
Saya menemukan ini (bahwa IDE membantu) argumen yang buruk - ketika Anda membuat kode, ya, Anda akan mendapat manfaatnya. Tetapi ada sejumlah kasus (melakukan, meninjau, berbeda / salah, dll) di mana Anda mungkin tidak memiliki dukungan yang tersedia.
Murph
Anda salah !!!!! ;) Poin wajar, saya masih tidak akan menggunakan bahasa Hongaria sekalipun!
ozz