it-swarm-id.com

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

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. (Selain itu, sebagian besar kode kami harus dijalankan pada beberapa DSP aneh, di mana konsep seperti bool atau float toh tidak ada).

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

37
bastibe

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

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

Di Apps Hungarian, Anda tidak menyandikan "tipe" di nama variabel, Anda menyandikan "jenis" variabel. Jadi bukan nWidth, tetapi pxWidth atau emWidth (untuk masing-masing "lebar dalam piksel" atau "lebar dalam ems"). Bukan strName tetapi sName atau usName (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" nilai (misalnya, saya telah menggunakan awalan "px" dan "em" di masa lalu karena membuat kesalahan seperti pxArea = emWidth * emHeight jelas).

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

77
Dean Harding

kata kerjaAnda kata kerjaHarus adverbTidak pernah kata kerjaGunakan kata sifatHunarian nounNotation, prepositionIndo kata kerjaAkibat kolektifuntukunun adverb segala sesuatuAda komparatifBumody adjectiveHin infinitive To inferbitive To verbRead.

31
smirkingman

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 miliki agar bersuara, tetapi kode harus dapat 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.

26
ChrisF

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

21
codeape

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 saya tahu, Sistem Hongaria cenderung banyak digunakan di bidang yang disematkan. 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 integer 8-bit yang tidak ditandatangani, integer bertanda 16-bit, dll. Kompilator (atau bahkan serat dengan aturan MISRA diberlakukan) tidak selalu memahami hal ini. Dalam hal ini memiliki nama variabel seperti u8ReadIndex, s16ADCValue dapat membantu.

Aplikasi Hungaria

Apps 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 bilangan bulat yang ditandatangani dengan bilangan bulat 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 Hungaria cenderung membuat ulasan kode formal lebih cepat karena ada sedikit 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.

13
DrAl

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: tidak harus berupa sistem tipe statis . Selama itu menangkap kesalahan jenis, saya tidak peduli ketika ia menangkap mereka.)

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 Notasi Hongaria alih-alih jenis di sini, itu tidak akan membantu saya sedikit pun:

let mSomeLength       = 48.15
let ftSomeOtherLength = 16.2342

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

Kompiler membiarkannya lurus. Saya sekarang mengandalkan manusia manusia untuk menemukan apa yang pada dasarnya merupakan 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! Dalam hal ini kasus tertentu , Anda menyebutkan:

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

Tapi itulah tepatnya satu-satunya use case yang masuk akal untuk Notasi Hongaria!


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

9
Jörg W Mittag

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 beri nama variabel kita dengan baik:

  • Hindari nama yang terlalu umum. Jangan beri nama z ketika itu adalah variabel kelas yang mewakili objek bernama, katakanlah, tagihan telepon. Sebut saja phoneBill atau 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 pernah menyebutnya MyFuncTempStringCharacterIndex? Itu lelucon yang menyedihkan. Sebut saja Pos atau bahkan i jika 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 yang ada di dalamnya dan konteks makna lainnya yang mungkin. 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, kasus sempit inilah yang memulai "Apps Hungarian", untuk membedakan antara pengukuran relatif terhadap jendela rwTabPosition dan 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 hal-hal tercampur aduk.

Di hampir semua bidang, menambahkan hal-hal yang memiliki kepadatan makna minimal mengurangi kebermaknaan keseluruhan dan kemudahan pemahaman. Inilah 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 betapa 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 disesuaikan.

Dengan menambahkan informasi, saya membuat itu sangat sulit untuk dibaca.

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

Pertahankan nama variabel sesingkat singkat , karena bermakna seperlunya, dan selalu tidak ambigu .

6
ErikE

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

6
billy.bob

Satu-satunya tempat di mana Sistem Hungaria diperingatkan adalah dengan bahasa yang diketik dengan lemah seperti C. Ini sangat penting dengan C karena tidak ada objek eksplisit (memiliki struktur , tetapi semua fungsi bersifat eksternal dari 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. Misalnya, 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: mulai 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.

6
Berin Loritsch

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

5
Mudassir

Kami menggunakan bahasa Hungaria kembali ketika saya adalah seorang programmer C++, dan itu hebat. Anda bisa melihat jenis variabel (mis. BSTR, CString, LPCTSTR, atau char *) tanpa mencari deklarasi. Pada hari-hari 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 lastName adalah 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.

2
Andomar

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 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 AT 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)
)
2
jokoon

Setuju dengan sebagian besar, itu gaya lama.

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

1
ozz