ประโยชน์ของการไม่ใช้สัญกรณ์ฮังการีคืออะไร


101

หนึ่งในสิ่งที่ฉันต่อสู้คือไม่ได้ใช้สัญกรณ์ฮังการี ฉันไม่ต้องการที่จะไปที่คำนิยามตัวแปรเพียงเพื่อดูว่ามันคืออะไร เมื่อโปรเจ็กต์ขยายขอบเขตมันก็ดีที่สามารถดูตัวแปรนำหน้าด้วย 'บูล' และรู้ว่ามันกำลังมองหาจริง / เท็จแทนที่จะเป็นค่า0/1

ฉันทำงานหนักมากใน SQL Server ฉันเติมคำนำหน้ากระบวนงานที่เก็บไว้ด้วย 'sp' และตารางของฉันด้วย 'tbl' ไม่ต้องพูดถึงตัวแปรทั้งหมดของฉันในฐานข้อมูลตามลำดับ

ฉันเห็นทุกที่ที่ไม่มีใครต้องการใช้สัญกรณ์ฮังการีถึงจุดที่พวกเขาหลีกเลี่ยง คำถามของฉันคืออะไรประโยชน์ของการไม่ใช้สัญกรณ์ฮังการีและทำไมนักพัฒนาส่วนใหญ่จึงหลีกเลี่ยงปัญหาเช่นภัยพิบัติ


39
คุณใช้ภาษา / IDE ใด ใน Visual Studio คุณไม่จำเป็นต้องไปที่คำจำกัดความเพื่อทราบชนิดของตัวแปรเนื่องจาก IDE ให้คุณ ในภาษาที่ไม่มีการบังคับใช้ประเภทเช่น PHP คุณไม่จำเป็นต้องรู้ประเภทส่วนใหญ่ (เนื่องจากคุณสามารถกำหนด 0 หรือ 1 ให้กับบูลีน)
Arseni Mourzenko

10
@MainMa ฉันไม่แน่ใจว่าเป็นเหตุผลที่ดีที่ไม่ทราบประเภทของค่าใน PHP
Rei Miyasaka

29
"เมื่อโครงการมีขอบเขตกว้างขวาง" ... ไม่ควรสำคัญ ควรมีตัวแปรจำนวนเล็กน้อยในขอบเขตที่จุดใด ๆ : ตัวแปรคลาสจำนวนหนึ่งและอีกหนึ่งอาร์กิวเมนต์ของหยิบวิธี หากคุณไม่สามารถรักษาให้ตรงได้คลาสนั้นใหญ่เกินไปหรือวิธีการนั้นยาวเกินไป สัญกรณ์ฮังการีถูกคิดค้นขึ้นสำหรับการเขียนโปรแกรม Windows C โดยทั่วไปเป็นวิธีแก้ปัญหาสำหรับ Windows API ที่น่ากลัว ไม่มีอะไรที่คล้ายกันที่เคยแนะนำหรือต้องการสำหรับการพัฒนายูนิกซ์
วินไคลน์

20
ประโยชน์ของการไม่ใช้สัญกรณ์ฮังการีคืออะไร "ไม่ได้รับความเกลียดชังจากเพื่อนร่วมงานของคุณ" ...
Sean Patrick Floyd

25
adjHungarian nNotation v คือ adjHard PrepTo vRead
dan04

คำตอบ:


148

เนื่องจากความตั้งใจเดิม (ดูhttp://www.joelonsoftware.com/articles/Wrong.htmlและhttp://fplanque.net/Blog/devblog/2005/05/11/hungarian_notation_on_steroids ) เข้าใจผิดและมันได้ถูก ( ab) ใช้เพื่อช่วยให้ผู้ใช้จดจำประเภทของตัวแปรที่เป็นเมื่อภาษาที่พวกเขาใช้ไม่ถูกพิมพ์แบบคงที่ ในภาษาที่พิมพ์แบบสแตติกใด ๆ คุณไม่จำเป็นต้องเพิ่มบัลลาสต์ของคำนำหน้าเพื่อบอกคุณว่าตัวแปรชนิดใด ในภาษาสคริปต์ที่ไม่มีการพิมพ์หลายภาษาสามารถช่วยได้ แต่บ่อยครั้งที่มันถูกทารุณกรรมจนถึงจุดที่ไม่ได้ตั้งใจอย่างแท้จริง น่าเสียดายที่แทนที่จะกลับไปที่ความตั้งใจดั้งเดิมของสัญลักษณ์ของฮังการีผู้คนได้ทำให้มันกลายเป็นหนึ่งใน "ความชั่วร้าย" ที่คุณควรหลีกเลี่ยง

สัญกรณ์ฮังการีในระยะสั้นมีวัตถุประสงค์เพื่อนำหน้าตัวแปรที่มีความหมายบางอย่าง ตัวอย่างเช่นถ้าคุณมีพิกัดหน้าจอ (ซ้าย, บน, ขวา, ล่าง) คุณจะใส่คำนำหน้าตัวแปรที่มีตำแหน่งหน้าจอสัมบูรณ์ที่มี " abs" และตัวแปรที่มีตำแหน่งสัมพันธ์กับหน้าต่างที่มี " rel" วิธีนี้จะทำให้ผู้อ่านทุกคนเห็นได้ชัดเมื่อคุณส่งพิกัดที่สัมพันธ์กับวิธีที่ต้องการตำแหน่งที่แน่นอน

อัปเดต (เพื่อตอบกลับความคิดเห็นโดย delnan)

ควรหลีกเลี่ยงเวอร์ชันที่มีพฤติกรรมที่ไม่เหมาะสมเช่นโรคระบาดเพราะ:

  • มันยุ่งยากในการตั้งชื่อ เมื่อ (ab) ใช้สัญกรณ์ฮังการีจะมีการอภิปรายเกี่ยวกับความต้องการเฉพาะของคำนำหน้า ตัวอย่างเช่น: หรือlistboxXYZMyParticularFlavourListBoxXYZ
  • มันทำให้ชื่อตัวแปรยาวขึ้นโดยไม่ช่วยให้เข้าใจว่าตัวแปรนั้นมีไว้เพื่ออะไร
  • มันเรียงลำดับของการเอาชนะวัตถุของแบบฝึกหัดเมื่อเพื่อหลีกเลี่ยงคำนำหน้ายาวเหล่านี้ย่อให้ย่อและคุณต้องการพจนานุกรมเพื่อรู้ว่าแต่ละตัวย่อหมายถึงอะไร เป็นuiจำนวนเต็มไม่ได้ลงนาม? อินเทอร์เฟซที่นับไม่ถูกอ้างถึง? จะทำอย่างไรกับส่วนต่อประสานกับผู้ใช้? และสิ่งเหล่านั้นจะได้รับเป็นเวลานาน ฉันได้เห็นคำนำหน้าของตัวละครแบบสุ่มมากกว่า 15 ตัวที่ควรจะนำเสนอประเภทที่แน่นอนของ var แต่ที่น่าประหลาดใจเพียงอย่างเดียวเท่านั้น
  • มันล้าสมัยแล้ว เมื่อคุณเปลี่ยนประเภทของตัวแปรที่คนคงเส้นคงวา (lol) ลืมที่จะปรับปรุงคำนำหน้าเพื่อสะท้อนการเปลี่ยนแปลงหรือจงใจไม่ปรับปรุงเพราะมันจะก่อให้เกิดการเปลี่ยนแปลงรหัสทุกที่ var ใช้ ...
  • มันมีความซับซ้อนในการพูดคุยเกี่ยวกับรหัสเพราะเป็น "@g" กล่าวว่า: ชื่อตัวแปรที่มีสัญกรณ์ฮังการีมักเป็นซุปตัวอักษรที่ออกเสียงยาก สิ่งนี้ขัดขวางความสามารถในการอ่านและการพูดคุยรหัสเนื่องจากคุณไม่สามารถ 'พูด' ชื่อใด ๆ ได้
  • ... อีกมากมายที่ฉันจำไม่ได้ในตอนนี้ อาจเป็นเพราะฉันมีความยินดีที่ไม่ต้องจัดการกับเอกสารฮังการีที่ถูกทารุณกรรมเป็นเวลานาน ...

9
@ Surfer513: ที่จริงฉันชอบคำต่อท้ายเมื่อตั้งชื่อการควบคุม สำหรับฉันแล้วมันน่าสนใจกว่าที่จะหาตัวควบคุมทั้งหมดที่จัดการกับหัวเรื่อง / แง่มุมที่เฉพาะเจาะจงกว่าการค้นหาตัวควบคุมการแก้ไขทั้งหมด ... เมื่อฉันต้องการค้นหาตัวควบคุมที่ผู้ใช้สามารถพิมพ์ชื่อลูกค้าได้ฉันจะเริ่มหา ลูกค้ามากกว่า txt เพราะอาจไม่ใช่ txt (แก้ไข) แต่เป็น memo หรือ richedit หรือ ... อาจเป็นกล่องคำสั่งผสมเพื่ออนุญาตให้ค้นหาในชื่อลูกค้าที่ป้อนไปก่อนหน้านี้ ...
Marjan Venema

8
@ Surfer513: และทุกวันนี้ฉันมักจะใช้คำต่อท้ายเฉพาะเมื่อแยกความแตกต่างระหว่างสองส่วนควบคุมที่จัดการกับสิ่งเดียวกัน ตัวอย่างเช่นฉลากและการแก้ไขสำหรับชื่อลูกค้า และบ่อยครั้งที่คำต่อท้ายไม่เกี่ยวข้องกับประเภทของการควบคุม แต่เป็นไปตามวัตถุประสงค์: ClientCaption และ ClientInput
Marjan Venema

3
นอกจากนี้ยังเป็นที่น่าสังเกตว่า Intellisense ใน VS 2010 ช่วยให้คุณสามารถค้นหาชื่อทั้งหมดไม่ใช่แค่การเริ่มต้น หากคุณตั้งชื่อการควบคุม "firstNameTextBox" แล้วพิมพ์ "textb" มันจะค้นหาส่วนควบคุมของคุณและแสดงรายการ
อดัมโรบินสัน

4
'... รุ่นที่ถูกทารุณกรรมถูกหลีกเลี่ยงเหมือนคราบจุลินทรีย์ ... ' ซึ่งก็คือหลีกเลี่ยงน้อยกว่าทาร์ทาร์และเหงือกอักเสบเล็กน้อย? ;-)
Ben Mosher

4
@Marjan: แน่นอนว่าคอมไพเลอร์อาจเลือกได้ หากแต่ละหน่วยแสดงโดยประเภทคุณจะไม่สามารถผ่านไปยังหน่วยอื่นได้โดยไม่ตั้งใจ ที่นี่หากคุณมี a AbsoluteXTypeและ a RelativeYTypeคุณจะไม่สามารถผ่านพิกัดสัมพัทธ์ Y สำหรับผิดพลาดได้ ฉันต้องการตัวแปรที่แสดงถึงเอนทิตีที่เข้ากันไม่ได้ที่จะเป็นประเภทที่เข้ากันไม่ได้แทนที่จะมีส่วนนำหน้าที่เข้ากันไม่ได้ การดูแลคอมไพเลอร์ไม่ใช่คำนำหน้า (หรือคำต่อท้าย)
Matthieu M.

74

โน้ตฮังการีเป็นตั้งชื่อต่อต้านรูปแบบในสภาพแวดล้อมที่โปรแกรมวันที่ทันสมัยและรูปแบบของการพูดซ้ำซาก

มันซ้ำข้อมูลไร้ประโยชน์โดยไม่มีประโยชน์และค่าใช้จ่ายในการบำรุงรักษาเพิ่มเติม จะเกิดอะไรขึ้นเมื่อคุณเปลี่ยนintเป็นประเภทอื่นเช่นlongตอนนี้คุณต้องค้นหาและแทนที่ฐานรหัสทั้งหมดของคุณเพื่อเปลี่ยนชื่อตัวแปรทั้งหมดหรือตอนนี้พวกเขาผิดทางความหมายซึ่งแย่กว่าถ้าคุณไม่ได้พิมพ์ชื่อซ้ำในชื่อ

มันเป็นการละเมิดหลักการของ DRY หากคุณต้องนำหน้าตารางฐานข้อมูลของคุณโดยใช้ตัวย่อเพื่อเตือนให้คุณทราบว่าเป็นตารางแสดงว่าคุณไม่ได้ตั้งชื่อตารางของคุณให้มีความหมายเชิงลึกเพียงพอ กันไปสำหรับทุกสิ่งอื่น ๆ ที่คุณทำกับ มันเป็นเพียงการพิมพ์พิเศษและทำงานเพื่อผลประโยชน์หรือผลประโยชน์กับสภาพแวดล้อมการพัฒนาที่ทันสมัย


2
"จะเกิดอะไรขึ้นเมื่อคุณเปลี่ยนintเป็นประเภทอื่นเช่นlong... " ง่าย ๆ : <sarcasm> อย่าเปลี่ยนชื่อเพราะไม่มีการบอกว่าการเปลี่ยนแปลงจะกระเพื่อมที่ไหน </sarcasm> ตอนนี้คุณมีตัวแปรที่มี ชื่อของชาวฮังการีขัดแย้งกับการปฏิบัติ ไม่มีวิธีใดที่จะบอกได้ว่าเอฟเฟ็กต์การเปลี่ยนชื่อจะแพร่หลายแค่ไหนหากตัวแปร / ฟังก์ชั่นมีการเปิดเผยต่อสาธารณะ
David Hammen

2
บทความที่เชื่อมโยงนั้นยอดเยี่ยมและคุ้มค่าที่จะอ่าน +1
Marty Pitt

6
@David เพียงแค่ดู Win32 API ซึ่งเต็มไปด้วยตัวแปรพารามิเตอร์และแม้กระทั่งชื่อเมธอดที่ใช้สัญกรณ์ฮังการี (ซึ่งเป็นข้อกำหนดของ MS) ระบุค่า 8 บิตหรือ 16 บิตเมื่ออันที่จริงแล้วพวกเขาทั้งหมด 32 บิต ค่าตั้งแต่เปิดตัว Windows 95 ในปี 1994 (เกือบ 17 ปีที่แล้ว)
jwenting

2
@ แน่นอน: ฉันจะยืนยันว่าสิ่งที่ควรทำการทดสอบอัตโนมัติ ไม่ใช่โปรแกรมเมอร์
โจเอล

2
@Secure อาจไม่ได้อยู่ในแอปพลิเคชันภายใน แต่ถ้าคุณรักษา API สาธารณะเช่น Windows API มันเป็นปัญหาสำคัญ
jwenting

51

Wikipediaมีรายการข้อดีและข้อเสียของสัญกรณ์ฮังการีและอาจทำให้ได้คำตอบที่ครอบคลุมที่สุดสำหรับคำถามนี้ คนที่มีชื่อเสียงก็เป็นคนอ่านที่น่าสนใจเช่นกัน

ประโยชน์ของการไม่ใช้สัญกรณ์ฮังการีเป็นเพียงการหลีกเลี่ยงข้อเสีย:

  • สัญกรณ์ฮังการีซ้ำซ้อนเมื่อคอมไพเลอร์ตรวจสอบเสร็จ คอมไพเลอร์สำหรับภาษาที่ให้การตรวจสอบประเภทมั่นใจว่าการใช้ตัวแปรสอดคล้องกับประเภทของมันโดยอัตโนมัติ ตรวจสอบด้วยตาซ้ำซ้อนและอาจมีข้อผิดพลาดของมนุษย์

  • สภาพแวดล้อมการพัฒนาแบบบูรณาการที่ทันสมัยทั้งหมดแสดงประเภทของตัวแปรตามความต้องการและดำเนินการตั้งค่าสถานะโดยอัตโนมัติซึ่งใช้ประเภทที่เข้ากันไม่ได้ทำให้สัญกรณ์ล้าสมัยเป็นส่วนใหญ่

  • สัญกรณ์ฮังการีจะเกิดความสับสนเมื่อมีการใช้เพื่อแสดงคุณสมบัติหลายอย่างเช่นa_crszkvc30LastNameCol: อาร์กิวเมนต์อ้างอิงคงที่ถือเนื้อหาของคอลัมน์ฐานข้อมูลLastNameประเภทvarchar(30)ซึ่งเป็นส่วนหนึ่งของคีย์หลักของตาราง

  • มันอาจนำไปสู่ความไม่สอดคล้องกันเมื่อมีการแก้ไขหรือย้ายรหัส หากชนิดของตัวแปรเปลี่ยนไปการตกแต่งในชื่อของตัวแปรจะไม่สอดคล้องกับชนิดใหม่หรือต้องเปลี่ยนชื่อของตัวแปร ตัวอย่างที่รู้จักกันดีโดยเฉพาะคือWPARAMประเภทมาตรฐานและwParamพารามิเตอร์อย่างเป็นทางการในการประกาศฟังก์ชั่นระบบ Windows จำนวนมาก 'w' หมายถึง 'word' โดยที่ 'word' เป็นขนาดคำดั้งเดิมของสถาปัตยกรรมฮาร์ดแวร์ของแพลตฟอร์ม เดิมทีเป็นชนิด 16 บิตบนสถาปัตยกรรมคำ 16 บิต แต่ถูกเปลี่ยนเป็น 32 บิตบนสถาปัตยกรรมคำ 32 บิตหรือ 64 บิตในสถาปัตยกรรมคำ word 64 บิตในระบบปฏิบัติการรุ่นที่ใหม่กว่าในขณะที่ยังคงรักษา ชื่อเดิม (ประเภทพื้นฐานที่แท้จริงของมันคือUINT_PTRนั่นคือจำนวนเต็มที่ไม่ได้ลงชื่อมีขนาดใหญ่พอที่จะถือตัวชี้) อิมพีแดนซ์เชิงความหมายและด้วยเหตุนี้ความสับสนของโปรแกรมเมอร์และความไม่สอดคล้องกันจากแพลตฟอร์มสู่แพลตฟอร์มอยู่บนสมมติฐานที่ว่า 'w' หมายถึง 16 บิตในสภาพแวดล้อมที่แตกต่างกันเหล่านั้น

  • ส่วนใหญ่เวลารู้การใช้ตัวแปรหมายถึงรู้ชนิดของมัน นอกจากนี้หากไม่รู้จักการใช้ตัวแปรมันจะไม่สามารถอนุมานได้จากประเภทของมัน

  • สัญกรณ์ฮังการีช่วยลดประโยชน์ของการใช้โปรแกรมแก้ไขโค้ดที่มีคุณสมบัติมากมายซึ่งสนับสนุนการทำให้ชื่อตัวแปรเสร็จสมบูรณ์สำหรับโปรแกรมเมอร์ต้องป้อนตัวระบุชนิดทั้งหมดก่อน

  • มันทำให้โค้ดอ่านน้อยลงโดยทำให้วัตถุประสงค์ของตัวแปรยุ่งเหยิงด้วยประเภทที่ไม่จำเป็นและคำนำหน้าการกำหนดขอบเขต

  • ข้อมูลประเภทเพิ่มเติมสามารถแทนที่ชื่อที่อธิบายเพิ่มเติมไม่เพียงพอ เช่นsDatabaseไม่ได้บอกผู้อ่านว่ามันคืออะไร databaseNameอาจเป็นชื่อที่สื่อความหมายมากกว่า

  • เมื่อชื่อมีความหมายเพียงพอข้อมูลประเภทเพิ่มเติมสามารถซ้ำซ้อนได้ ตัวอย่างfirstNameน่าจะเป็นสตริง ดังนั้นการตั้งชื่อมันsFirstNameเพิ่มความยุ่งเหยิงในรหัสเท่านั้น

ฉันเองไม่ได้ใช้สัญลักษณ์นี้เพราะฉันไม่ชอบเสียงรบกวนทางเทคนิคที่ไม่จำเป็น ฉันเกือบจะรู้ว่าฉันกำลังติดต่อกับประเภทใดและฉันต้องการภาษาที่สะอาดในรูปแบบโดเมนของฉัน แต่ฉันเขียนในภาษาแบบคงที่และพิมพ์อย่างยิ่ง


1
นี่ควรเป็นคำตอบที่ถูกต้อง มันดีมาก. +1
Saeed Neamati

คุณใจดีเกินไป Saeed ฉันเห็นคุณค่าของคุณ แต่คำตอบสำหรับคำถามนี้ก็ดีเช่นกัน
Falcon

11
โหวตขึ้นสำหรับประโยคเดียว: " ส่วนใหญ่แล้วการรู้จักการใช้ตัวแปรหมายถึงการรู้จักชนิดของมันนอกจากนี้หากไม่รู้จักการใช้ตัวแปรมันจะไม่สามารถอนุมานจากประเภทของมันได้ " - IMHO, นี่คือเหตุผล # 1 เพื่อหลีกเลี่ยงการบันทึกฮังการี
Daniel Pryden

19

ในฐานะที่เป็นปัญหาเฉพาะของ MS SQL Server:

ขั้นตอนใด ๆ ที่เก็บไว้ซึ่งนำหน้าด้วย 'sp_' จะถูกค้นหาเป็นครั้งแรกในฐานข้อมูลหลักแทนที่จะเป็นขั้นตอนที่สร้างขึ้นซึ่งจะทำให้เกิดความล่าช้าในขั้นตอนการจัดเก็บที่จะดำเนินการ


4
+1 สำหรับข้อมูลเจ๋ง ๆ ฉันใช้ 'sp' เป็นคำนำหน้า proc ของฉันที่เก็บไว้ไม่ใช่ 'sp_' แต่ทุกอย่างก็เหมือนกันซึ่งเป็นข้อเท็จจริงที่น่าสนใจอย่างมากและมีเหตุผลอย่างชัดเจนที่จะไม่ใช้ 'sp_' เป็นคำนำหน้า proc ที่จัดเก็บไว้

2
+1 ฉันไม่เคยรู้เรื่องนี้มาก่อนและเมื่อฉันเริ่มทำงานกับ SQL Server SP ทั้งหมดที่สถานที่ทำงานของฉันถูกขึ้นต้นด้วยคำนำหน้าsp_ดังนั้นฉันจึงติดอยู่กับการประชุม
Michael

เยี่ยมมาก แต่ไม่มีอะไรเกี่ยวข้องกับคำถามนี้ (ใช้ sql และไม่ใช่ _sp) มันเหมือนกับการทิ้งชื่อสคีมาสำหรับวัตถุที่ไม่ได้อยู่ในสคีมาเริ่มต้น
JeffO

1
สำหรับขั้นตอนการจัดเก็บของผู้ใช้ฉันใช้ 'usp_' ตามอัตภาพ สิ่งนี้ทำหน้าที่เพื่อหลีกเลี่ยงปัญหาที่กล่าวถึงและแยกแยะสำหรับผู้อ่านไม่ว่าจะเป็น sproc เป็นระบบหรือผู้ใช้
ร่ม

15

IMO ประโยชน์ที่ใหญ่ที่สุดของไม่ได้ใช้ฮังการีคือความจริงที่มันบังคับให้คุณใช้ชื่อที่มีความหมาย หากคุณตั้งชื่อตัวแปรอย่างถูกต้องคุณควรทราบทันทีว่าเป็นประเภทใดหรือสามารถสรุปได้อย่างรวดเร็วในระบบที่ออกแบบมาอย่างดี หากคุณจำเป็นต้องพึ่งพาstrหรือblnหรือแย่ลงทุกobjคำนำหน้าจะรู้ว่าสิ่งที่ประเภทตัวแปรคือผมจะเถียงมันบ่งบอกถึงปัญหาการตั้งชื่อ - ทั้งชื่อตัวแปรที่ยากจนในทั่วไปหรือวิธีทั่วไปเกินไปที่จะสื่อความหมาย

จากประสบการณ์ส่วนตัวแล้วสถานการณ์หลัก ๆ ที่ฉันเคยเห็นคือการใช้ภาษาฮังการีคือการเขียนโปรแกรม "cargo-ลัทธิ" (เช่นรหัสอื่นใช้ดังนั้นให้เราใช้ต่อไปเพราะ) หรือใน VB.NET เพื่อแก้ไขภาษาที่เป็นจริง ตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ (เช่นPerson oPerson = new Personเนื่องจากคุณไม่สามารถใช้Person person = new PersonและPerson p = new Personคลุมเครือเกินไป); ฉันเคยเห็นคำนำหน้า "the" หรือ "my" แทน (เหมือนในPerson thePerson = new Personหรือ uglier Person myPerson = new Person) ในกรณีพิเศษนั้น

ฉันจะเพิ่มเฉพาะครั้งเดียวที่ฉันใช้ภาษาฮังกาเรียนมีแนวโน้มที่จะเป็นตัวควบคุม ASP.NET และนั่นเป็นเรื่องที่ได้รับเลือก ฉันคิดว่ามันน่าเกลียดมาก ๆ ที่จะพิมพ์TextBoxCustomerNameหรือCustomerNameTextBoxเปรียบเทียบกับสิ่งที่เรียบง่ายtxtCustomerNameแต่ถึงแม้จะรู้สึก "สกปรก" ฉันรู้สึกว่าควรใช้หลักการตั้งชื่อบางอย่างสำหรับการควบคุมเนื่องจากสามารถมีตัวควบคุมหลายตัวที่แสดงข้อมูลเดียวกัน


13

ฉันจะมุ่งเน้นไปที่ SQL Server ตั้งแต่คุณพูดถึงมัน ฉันไม่เห็นเหตุผลที่จะวาง 'tbl' ไว้หน้าโต๊ะ คุณสามารถดูรหัส tSQL ใดก็ได้และแยกความแตกต่างของตารางตามวิธีการใช้งาน คุณจะไม่Select from stored_procedure.หรือSelect from table(with_param)ต้องการ UDF หรือExecute tblTableOrViewNameชอบขั้นตอนการจัดเก็บ

ตารางอาจสับสนกับมุมมอง แต่เมื่อพูดถึงวิธีการใช้งาน ไม่มีความแตกต่างดังนั้นประเด็นคืออะไร? สัญกรณ์ฮังการีอาจช่วยคุณประหยัดเวลาในการค้นหาใน SSMS (ใต้โต๊ะหรือมุมมอง?) แต่มันเกี่ยวกับมัน

ตัวแปรสามารถนำเสนอปัญหา แต่จำเป็นต้องประกาศและจริง ๆ แล้วคุณวางแผนว่าจะใช้คำสั่งประกาศไกลแค่ไหน การเลื่อนไปสองสามบรรทัดไม่ควรเป็นเรื่องใหญ่มากเว้นแต่คุณจะเขียนขั้นตอนที่ยาวมาก มันอาจจะเป็นความคิดที่ดีที่จะแยกรหัสความยาวออกเล็กน้อย

สิ่งที่คุณอธิบายคือความเจ็บปวด แต่วิธีแก้ปัญหาสัญลักษณ์ของฮังการีไม่ได้แก้ปัญหาจริงๆ คุณสามารถดูรหัสของผู้อื่นและพบว่าประเภทตัวแปรอาจได้รับการเปลี่ยนแปลงซึ่งตอนนี้ต้องเปลี่ยนชื่อตัวแปร อีกสิ่งหนึ่งที่จะลืม และถ้าฉันใช้ VarChar คุณจะต้องดูคำแถลงการประกาศเพื่อทราบขนาด ชื่อที่เป็นคำอธิบายอาจทำให้คุณได้รับความรู้เพิ่มเติม @PayPeriodStartDate ค่อนข้างอธิบายตัวเอง


2
@Surfer: คีย์หลักแตกต่างกันเพราะ "PK" ไม่ใช่ประเภท; "PK_TableName" กล่าวว่า "นี่เป็นคีย์หลักสำหรับ TableName" ไม่ใช่ "นี่คือ TableName ประเภท PK" สำหรับส่วนที่เหลือ ... ดูเหมือนว่าคุณจะไม่ได้ฟังข้อโต้แย้งที่นี่ โปรดหยุดใช้วิธีปฏิบัติที่น่ารังเกียจนี้จนถึงทุกวันนี้ที่ยังคงมีคุณภาพโดยรวมของรหัสทั้งหมดลดลง
Aaronaught

2
@Aaronaught คุณกำลังระบุแง่มุมหนึ่งของสัญกรณ์ฮังการี ( en.wikipedia.org/wiki/Hungarian_notation ) มันไม่ได้เป็นเพียงแค่การพิมพ์ แต่ยังมีไว้สำหรับใช้ ดังนั้นการขึ้นต้นด้วย 'pk' สำหรับคีย์หลักจึงเป็นสัญกรณ์ฮังการี ฉันกำลังฟังข้อโต้แย้งที่นี่ แต่มีข้อยกเว้น (เช่นสถานการณ์คีย์หลัก) ซึ่งดูเหมือนว่า HN จะเป็นประโยชน์ อาจจะอาจจะไม่. ฉันยังคงพยายามคลุมหัวสิ่งที่ต้องทำและไม่ควรทำในทุกสถานการณ์ วันนี้ฉันได้เรียนรู้มาบ้างแล้วและได้จุดประกายความคิดที่ยอดเยี่ยม

3
@Surfer: นั่นไม่ถูกต้อง สัญกรณ์ฮังการีอธิบายประเภท (รุ่นที่ไม่ดี) หรือการใช้งานประเภทนั้น ๆ (รุ่นที่ไม่ถูกต้องน้อยกว่า) PK ไม่เป็นก็ไม่ได้เพียงแค่บางสิ่งบางอย่างที่อธิบายเกี่ยวกับประเภทก็อธิบายพฤติกรรม เมื่อฉันพูดถึงอายุก็ไม่ได้สนใจเลยว่ามันจะเป็นจำนวนเต็ม แต่เมื่อพูดถึงข้อ จำกัด ของฐานข้อมูล "คีย์หลักสำหรับตาราง X" เป็นสิ่งที่สำคัญอย่างยิ่ง
Aaronaught

4
ฉันชอบย่อหน้าที่สองถึงย่อหน้าสุดท้ายของคุณ เหตุผลของ บริษัท ของฉันสำหรับการใช้สัญกรณ์ฮังการีคือ "มันช่วยให้เราเห็นได้อย่างรวดเร็วว่าตัวแปรใดบ้างที่เป็นสากล จากนั้นคุณดูการประกาศตัวแปรและมี 300 ตัวแปรต่อไฟล์บาง m * สำหรับ modular (ทั่วโลก) บาง v * สำหรับ local แม้ว่าพวกเขาจะประกาศในระดับโมดูลัส "โอ้นั่นเป็นเพราะพวกเขาตั้งใจจะใช้เป็นคนในท้องถิ่นไม่ใช่โมดูลาร์" facepalm
corsiKa

3
@Aaronaught: ในโครงการปัจจุบันของเราใช้ชื่อตารางนำหน้าด้วยtbl_ ในขณะที่ผมไม่ได้เป็นแฟนตัวยงของการปฏิบัตินี้ผมไม่เห็นวิธีการนี้จะ"นำมาลงคุณภาพโดยรวมของทุกรหัส" คุณสามารถยกตัวอย่างได้หรือไม่?
Treb

6

สิ่งที่จะเพิ่มก็คือสิ่งที่คุณจะใช้ตัวย่อสำหรับกรอบทั้งหมดเช่น. NET? ใช่มันง่ายมากที่จะจำว่าbtnหมายถึงปุ่มและtxtแสดงถึงกล่องข้อความ อย่างไรก็ตามสิ่งที่คุณมีในใจสำหรับสิ่งที่ชอบStringBuilder? strbld? เกี่ยวกับCompositeWebControlอะไร คุณใช้สิ่งนี้:

CompositeWebControl comWCMyControl = new CompositeWebControl();

หนึ่งในความไร้ประสิทธิภาพของสัญกรณ์ฮังการีคือการมีกรอบที่ใหญ่ขึ้นและใหญ่ขึ้นมันพิสูจน์แล้วว่าไม่เพียง แต่จะเพิ่มประโยชน์พิเศษเท่านั้น แต่ยังต้องเพิ่มความซับซ้อนให้กับนักพัฒนาอีกด้วยเพราะตอนนี้พวกเขาต้องเรียนรู้คำนำหน้า


6

สำหรับวิธีการมองสิ่งต่าง ๆ ของฉันสัญกรณ์ฮังการีเป็นสิ่งที่มีค่าสำหรับการใช้ระบบประเภทที่ทรงพลังไม่เพียงพอ ในภาษาที่ช่วยให้คุณสามารถกำหนดประเภทของคุณเองมันค่อนข้างเล็กน้อยที่จะสร้างรูปแบบใหม่ที่เข้ารหัสพฤติกรรมที่คุณคาดหวัง ในการพูดจาโผงผางของ Joel Spolsky เรื่อง Hungarian Notation เขายกตัวอย่างของการใช้มันเพื่อตรวจจับการโจมตี XSS ที่เป็นไปได้โดยระบุว่าตัวแปรหรือฟังก์ชั่นนั้นไม่ปลอดภัย (เรา) หรือปลอดภัย (s) แต่ยังต้องอาศัยโปรแกรมเมอร์ หากคุณมีระบบประเภทที่สามารถขยายได้ แต่คุณสามารถสร้างสองประเภทใหม่ได้คือ UnsafeString และ SafeString จากนั้นให้ใช้มันตามความเหมาะสม โบนัสประเภทของการเข้ารหัสกลายเป็น:

SafeString encode(UnsafeString)

และการเข้าถึงสั้นภายในของ UnsafeString หรือการใช้ฟังก์ชั่นการแปลงอื่น ๆ กลายเป็นวิธีเดียวที่จะได้รับจาก UnsafeString ไปยัง SafeString หากฟังก์ชันเอาต์พุตทั้งหมดของคุณใช้อินสแตนซ์ของ SafeString เท่านั้นจะไม่สามารถส่งออกสตริงที่ไม่ได้ใช้ค่า Escape [การแบ่งส่วนเสนานิแกนกับการแปลงเช่น StringToSafeString (someUnsafeString.ToString ())]

มันควรจะชัดเจนว่าทำไมการอนุญาตให้ระบบประเภทสติตรวจสอบรหัสของคุณดีกว่าการพยายามทำด้วยมือหรืออาจจะมองในกรณีนี้

ในภาษาเช่น C แน่นอนคุณกำลังเมาใน int ที่ int เป็น int และไม่มีอะไรที่คุณสามารถทำได้ คุณสามารถเล่นเกมที่มี structs ได้ตลอดเวลา แต่ก็เป็นที่ถกเถียงกันอยู่ว่าเป็นการปรับปรุงหรือไม่

สำหรับการตีความอื่น ๆ ของ Hungarian Notation นั้น IE นำหน้าด้วยประเภทของตัวแปรนั่นเป็นเพียงแค่ความงี่เง่าธรรมดาและส่งเสริมการปฏิบัติที่ขี้เกียจเช่นตัวแปรการตั้งชื่อ uivxwFoo แทนสิ่งที่มีความหมายเช่น countOfPeople


หนึ่งจะประกาศประเภท. NET หรือ Java เพื่ออธิบาย " int[]ซึ่งอาจมีการแก้ไขได้อย่างอิสระ แต่ไม่เคยใช้ร่วมกัน" หรือ " int[]ซึ่งอาจใช้ร่วมกันได้อย่างอิสระเฉพาะในสิ่งที่จะไม่แก้ไขมัน"? ถ้าint[]เขตข้อมูลfooห่อหุ้มค่า{1,2,3}หนึ่งสามารถทำให้มันห่อหุ้ม{2,2,3}โดยไม่ทราบว่า "ประเภท" ของint[]มันหมายถึงอะไร ฉันคิดว่า Java และ. NET น่าจะดีกว่ามากถ้าหากไม่มีการสนับสนุนประเภทระบบพวกเขามีการใช้ชื่อแบบแผนการตั้งชื่อเพื่อแยกประเภทเหล่านั้นอย่างน้อย
supercat

4

สัญกรณ์ฮังการีเกือบไร้ประโยชน์อย่างสมบูรณ์ในภาษาที่พิมพ์แบบคงที่ มันเป็นคุณสมบัติ IDE พื้นฐานในการแสดงประเภทของตัวแปรโดยการวางเมาส์ไว้เหนือมันหรือโดยวิธีอื่น ยิ่งไปกว่านั้นคุณจะเห็นว่าประเภทนั้นคืออะไรโดยดูสองสามบรรทัดที่มีการประกาศหากไม่มีการอนุมานประเภท จุดรวมของการอนุมานคือไม่ต้องมีเสียงรบกวนซ้ำทุกที่ดังนั้นสัญกรณ์ฮังการีมักจะถูกมองว่าเป็นสิ่งที่ไม่ดีในภาษาที่มีการอนุมานประเภท

ในภาษาที่พิมพ์แบบไดนามิกมันสามารถช่วยได้บางครั้ง แต่สำหรับฉันมันรู้สึกว่าไม่มีความรู้สึก คุณเลิกฟังก์ชั่นของคุณถูก จำกัด อยู่ที่โดเมน / โคโดเมนที่แน่นอน หากตัวแปรทั้งหมดของคุณถูกตั้งชื่อด้วยสัญกรณ์ฮังการีคุณก็แค่ทำซ้ำสิ่งที่ระบบประเภทจะให้คุณ คุณแสดงตัวแปร polymorphic ที่สามารถเป็นจำนวนเต็มหรือสตริงในรูปแบบฮังการีได้อย่างไร "IntStringX"? "IntOrStringX"? สถานที่เดียวที่ฉันเคยใช้สัญกรณ์ฮังการีอยู่ในรหัสแอสเซมบลีเพราะฉันพยายามที่จะกลับสิ่งที่ฉันจะได้รับถ้าฉันมีระบบประเภทและมันเป็นสิ่งแรกที่ฉันเคยเขียนรหัส

อย่างไรก็ตามฉันไม่สนใจสิ่งที่ผู้คนตั้งชื่อตัวแปรของพวกเขารหัสอาจจะยังไม่สามารถเข้าใจได้ นักพัฒนาเสียเวลามากเกินไปกับสิ่งต่าง ๆ เช่นสไตล์และชื่อตัวแปรและในตอนท้ายของวันคุณยังมีห้องสมุดมากมายที่มีการประชุมที่แตกต่างกันโดยสิ้นเชิงในภาษาของคุณ ฉันกำลังพัฒนาภาษาสัญลักษณ์ (เช่น: ไม่ใช่ข้อความ) ซึ่งไม่มีชื่อตัวแปรเฉพาะตัวระบุเฉพาะและชื่อที่แนะนำสำหรับตัวแปร (แต่ตัวแปรส่วนใหญ่ยังไม่มีชื่อที่แนะนำเพราะไม่มีชื่อที่สมเหตุสมผลสำหรับ พวกเขา); เมื่อตรวจสอบรหัสที่ไม่น่าเชื่อถือคุณไม่สามารถพึ่งพาชื่อตัวแปรได้


มันค่อนข้างไร้ประโยชน์สำหรับภาษาที่พิมพ์แบบไดนามิกมากที่สุด!
James Anderson

2
สำหรับ IDE มันยิ่งกว่าการเขียนโค้ดด้วยตนเองเพราะมันหมายถึงการทำให้โค้ดสมบูรณ์ช้าลงอย่างมาก หากคุณมีตัวแปรจำนวนเต็ม 100 ตัวให้พิมพ์ int <alt-space> (ตัวอย่าง) จะแสดงรายการ 100 รายการเพื่อเลื่อนดู หากสิ่งที่คุณต้องการคือ intVeryLongVariableName การกรอกโค้ดของคุณจะเกิดปัญหา หากไม่มีชาวฮังการีคุณจะต้องพิมพ์ <alt-space> และมีตัวเลือกเพียง 1 หรือ 2 ตัว
jwenting

3

ตามปกติในกรณีเช่นนี้ฉันจะโพสต์คำตอบก่อนที่ฉันจะอ่านคำตอบจากผู้เข้าร่วมคนอื่น ๆ 

ฉันเห็น "แมลง" สามตัวในสายตาของคุณ: 

1) หากคุณต้องการทราบประเภทของตัวแปร / พารามิเตอร์ / คุณสมบัติ / คอลัมน์คุณสามารถเลื่อนเมาส์ของคุณหรือคลิกและมันจะปรากฏใน IDE ที่ทันสมัยที่สุด ฉันไม่รู้ว่าคุณใช้เครื่องมืออะไร แต่ครั้งสุดท้ายที่ฉันถูกบังคับให้ทำงานในสภาพแวดล้อมที่ไม่ได้ให้ฟีเจอร์นี้ในศตวรรษที่ 20 ภาษาคือภาษาโคบอลไม่ว่ามันจะเป็น Fortran และเจ้านายของฉัน ไม่เข้าใจว่าทำไมฉันถึงจากไป 

2 / ประเภทอาจมีการเปลี่ยนแปลงระหว่างวงจรของการพัฒนา จำนวนเต็ม 32 บิตอาจกลายเป็นจำนวนเต็ม 64 บิตในบางจุดด้วยเหตุผลที่ดีที่ไม่สามารถตรวจพบได้ตั้งแต่เริ่มต้นโครงการ ดังนั้นการเปลี่ยนชื่อ intX ให้กลายเป็น longX หรือปล่อยให้ชื่อที่ชี้ไปที่ประเภทที่ไม่ถูกต้องนั้นเป็นกรรมที่ไม่ดี 

3) สิ่งที่คุณขอเป็นความซ้ำซ้อน ความซ้ำซ้อนไม่ใช่รูปแบบการออกแบบหรือนิสัยที่ดีมาก แม้แต่มนุษย์ก็ยังลังเลที่จะทำซ้ำซ้อนมากเกินไป แม้แต่มนุษย์ก็ยังลังเลที่จะทำซ้ำซ้อนมากเกินไป 


ฉันเข้าใจ IDE ขั้นสูง / ทันสมัยและฉันเห็นด้วยกับคุณอย่างสมบูรณ์ แต่การออกแบบฐานข้อมูลล่ะ สมมติว่าคุณมีคอลัมน์หรือพารามิเตอร์กระบวนงานที่เก็บไว้ การโฉบเหนือเล่ห์เหลี่ยมไม่ได้ผลกับสิ่งนั้น คุณต้องดูที่ตาราง / คำจำกัดความของ proc ที่เก็บไว้ คุณทำอะไรเพื่อสิ่งนั้น

3

ผมเชื่อว่าการอยู่ในต้องหายนะของฮังการีเป็นอาการ
อาการของตัวแปรทั่วโลกที่มากเกินไป ... หรือการมีฟังก์ชั่นนานเกินไปที่จะห้อมล้อมได้

หากคำจำกัดความแปรปรวนของคุณไม่อยู่ในสายตาคุณมักจะมีปัญหา
และถ้าหน้าที่ของคุณไม่เป็นไปตามการประชุมที่น่าจดจำก็จะมีปัญหาใหญ่อีกครั้ง

นั่นเป็นเหตุผลที่สถานที่ทำงานหลายแห่งพุ่งออกไปฉันคิดว่า

มันมีต้นกำเนิดในภาษาที่จำเป็นมัน
เมื่อวันเวลาของตัวแปรที่โบนันซ่าทั่วโลก (สำหรับการขาดทางเลือก)
มันให้บริการเราดี

การใช้งานจริงเดียวที่เรามีมันในวันนี้คือโจ Spolskyหนึ่ง
เพื่อติดตามคุณลักษณะเฉพาะบางส่วนของตัวแปรเช่นของความปลอดภัย

( เช่น “ ตัวแปรsafeFoobarมีไฟสีเขียวที่จะแทรกลงในคิวรี SQL หรือไม่
- ตามที่เรียกว่าsafeใช่”)

คำตอบอื่น ๆ พูดคุยเกี่ยวกับฟังก์ชั่นการแก้ไขที่ช่วยให้เห็นประเภทของตัวแปรในขณะที่คุณวางไว้ ในมุมมองของฉันเหล่านั้นมากเกินไปเป็นชนิดของปัญหาสำหรับรหัสสติ ฉันเชื่อว่าพวกเขามีความหมายเพียงเพื่อ refactoringคุณสมบัติอื่น ๆ อีกมากมายเช่น (เช่นการพับฟังก์ชัน) และไม่ควรใช้กับรหัสใหม่


2

ฉันคิดว่าเหตุผลที่จะไม่ใช้สัญลักษณ์ฮังการีได้รับการคุ้มครองอย่างดีจากโปสเตอร์อื่น ๆ ฉันเห็นด้วยกับความคิดเห็นของพวกเขา

ด้วยฐานข้อมูลฉันใช้สัญลักษณ์ฮังการีสำหรับวัตถุ DDL ที่ไม่ค่อยได้ใช้ในรหัส แต่อย่างอื่นจะชนกันในเนมสเปซ ส่วนใหญ่สิ่งนี้จะนำไปสู่ดัชนีนำหน้าและตั้งชื่อข้อ จำกัด ด้วยประเภทของพวกเขา (PK, UK, FK และ IN) ใช้วิธีการที่สอดคล้องกันเพื่อตั้งชื่อวัตถุเหล่านี้และคุณควรจะสามารถเรียกใช้การตรวจสอบความถูกต้องบางอย่างได้โดยการสอบถามข้อมูลเมตา


ฉันมักจะพบสิ่งนี้เป็นกรณีเมื่อฉันมีตารางรหัส ถ้าฉันมีTABLE SomeStringById(int somestringId, varchar somestring)ดัชนีมันจะมีเหตุผลSomeStringByIdแต่นั่นทำให้เกิดการชน idx_SomeStringByIdดังนั้นผมจึงเรียกมันว่า จากนั้นเพื่อติดตามสูทฉันจะทำidx_SomeStringByValueเพียงเพราะมันโง่ที่จะมีidx_หนึ่งและไม่ได้อยู่ที่อื่น
corsiKa

1

เหตุผลที่หลีกเลี่ยงได้คือเพราะระบบของฮังการีที่ละเมิด DRY (ส่วนนำหน้าเป็นประเภทที่คอมไพเลอร์และ (ดี) IDE สามารถสืบทอดมาได้)

แอพพลิเคชั่นคำนำหน้า OTOH ของฮังการีพร้อมการใช้ตัวแปร (เช่น scrxMouse เป็นพิกัดบนหน้าจอขวานซึ่งอาจเป็นชนิดสั้น, ยาว, ยาวหรือแม้กระทั่งแบบกำหนดเอง (typedefs จะช่วยให้คุณเปลี่ยนแปลงได้อย่างง่ายดาย)

ความเข้าใจผิดของระบบคือสิ่งที่ทำลายชาวฮังการีเป็นแนวปฏิบัติที่ดีที่สุด


2
ฉันต้องไม่เห็นด้วย - สิ่งที่ทำลายชาวฮังการีในฐานะ "แนวปฏิบัติที่ดีที่สุด" ก็คือมันไม่เคยใกล้เคียงกับวิธีปฏิบัติที่ดีที่สุด (หรือแม้แต่ดี)
Jerry Coffin

2
@ Haylem: ฉันเคยเห็นบทความและเอกสารต้นฉบับของ Simonyi แล้วอ่านรหัส ทุกวิธีที่คุณมองมันเป็นความคิดที่ไม่ดีที่ไม่ควรมองเห็นแสงของวัน
Jerry Coffin

1
ไม่จำเป็นต้องละเมิด DRY ในภาษาไดนามิก มันเป็นเพียงสิ่งที่ผิด DRY อาจไม่ดีเสมอไป เช่นมาโคร C
Longpoke

3
IMO สิ่งที่ "ทำลาย" ฮังการีเป็นความจริงที่ว่าแม้แต่ "ความตั้งใจ" ไม่เป็นประโยชน์เทียบกับการใช้ชื่อที่สื่อความหมายถึงแม้ว่าจะเป็นธรรมเมื่อฮังการีถูกสร้างขึ้นไม่มีการเคลื่อนไหวสำหรับการอ่านรหัส ...
เวย์น Molina

1
@Wayne M: "ชื่อที่สื่อความหมาย" นั้นง่ายที่จะพูดเมื่อคอมไพเลอร์จะอนุญาตให้คุณใช้เรียงความสำหรับชื่อตัวแปร เมื่อความยาวของชื่อตัวระบุถูก จำกัด จริงต่ำค่าโดยพลการอย่างเป็นธรรม (ฉันคิดว่าการ จำกัด ร่วมกันเป็นสิบแปดหรือตัวอักษรไม่ได้ว่ามากนานมาแล้วผมดูเหมือนจะจำได้ว่า Borland Turbo C 2 ยังมีตัวเลือกการกำหนดค่าสำหรับ ความยาวสูงสุดของชื่อตัวระบุ!) การเข้ารหัสข้อมูลที่มีประโยชน์ในชื่อเป็นเพียงเรื่องเล็กน้อย ...
a CVn

1

สมมติว่าเรามีวิธีการเช่นนี้ (ใน C #):

int GetCustomerCount()
{
    // some code
}

ตอนนี้ในโค้ดเราเรียกมันว่า

var intStuff = GetCustomerCount();
// lots of code that culminates in adding a customer
intStuff++;

intไม่ได้บอกเราอย่างมาก ข้อเท็จจริงที่ว่าสิ่งที่เป็น int ไม่ได้บอกเราว่ามีอะไรอยู่ในนั้น ทีนี้สมมุติว่าเราเรียกมันอย่างนี้แทน:

var customerCount = GetCustomerCount();
// lots of code that culminates in adding a customer
customerCount++;

ตอนนี้เราสามารถดูได้ว่าจุดประสงค์ของตัวแปรคืออะไร มันจะสำคัญไหมถ้าเรารู้ว่ามันเป็น int?

อย่างไรก็ตามจุดประสงค์ดั้งเดิมของฮังการีคือเพื่อให้คุณทำสิ่งนี้:

var cCustomers = GetCustomerCount();
// lots of code that culminates in adding a customer
cCustomers++;

นี่เป็นเรื่องปกติตราบใดที่คุณรู้ว่าcหมายถึงอะไร แต่คุณต้องมีตารางคำนำหน้ามาตรฐานและทุกคนจะต้องรู้จักพวกเขาและคนใหม่ ๆ จะต้องเรียนรู้พวกเขาเพื่อที่จะเข้าใจรหัสของคุณ ในขณะที่customerCountหรือcountOfCustomersค่อนข้างชัดเจนในแวบแรก

ชาวฮังการีมีจุดประสงค์บางอย่างใน VB มาก่อนOption Strict Onเพราะใน VB6 และก่อนหน้านี้ (และใน VB. NET ด้วยOption Strict Off) VB จะบีบบังคับประเภทดังนั้นคุณสามารถทำสิ่งนี้ได้:

Dim someText As String = "5"
customerCount = customerCount + someText

สิ่งนี้ไม่ดี แต่คอมไพเลอร์จะไม่บอกคุณ ดังนั้นหากคุณใช้ภาษาฮังการีอย่างน้อยคุณจะมีตัวบ่งชี้ว่าเกิดอะไรขึ้น:

Dim strSomeText As String = "5"
intCustomerCount = intCustomerCount + strSomeText  // that doesn't look right!

ใน. NET ด้วยการพิมพ์แบบคงที่สิ่งนี้ไม่จำเป็น และชาวฮังกาเรียนก็ถูกนำมาใช้แทนการตั้งชื่อที่ดีเกินไป ลืมชาวฮังกาเรียนและเลือกชื่อที่ดีแทน


1

ฉันพบข้อโต้แย้งที่ดีมากมาย แต่ไม่มีใครเห็น: การยศาสตร์

ในสมัยก่อนเมื่อสิ่งที่คุณมีคือสตริง int, บูลและลอยตัวอักขระ sibf น่าจะเพียงพอแล้ว แต่ด้วย string + short ปัญหาจะเริ่มขึ้น ใช้ชื่อเต็มสำหรับคำนำหน้าหรือ str_name สำหรับสตริง? (ในขณะที่ชื่อมักจะเป็นสตริง - ไม่ใช่เหรอ) มีอะไรกับคลาสสตรีท ชื่อจะยาวขึ้นเรื่อย ๆ และแม้ว่าคุณจะใช้ CamelCase มันยากที่จะบอกได้ว่าคำนำหน้าชนิดลงท้ายด้วยที่ใดและที่ใดที่ชื่อตัวแปรเริ่มต้นขึ้น

 BorderLayout boderLayoutInnerPanel = new BorderLayout ();
 panelInner.addLayout (borderLayoutInnerPanel);

ตกลง - คุณสามารถใช้การขีดเส้นใต้ถ้าคุณไม่ได้ใช้มันเพื่อสิ่งอื่นแล้วหรือใช้ CamelCase ถ้าคุณใช้การขีดเส้นใต้ที่ยาวนาน:

 BorderLayout boderLayout_innerPanel = new BorderLayout ();
 panel_inner.addLayout (borderLayout_innerPanel);

 Border_layout boder_layoutInner_panel = new Border_layout ();
 panelInner.add_layout (border_layoutInner_panel);

มันมหึมาและถ้าคุณทำเช่นนั้นคุณจะมี

 for (int iI = 0; iI < iMax-1; ++iI)
     for (int iJ = iI; iJ < iMax; ++iMax) 
          int iCount += foo (iI, iJ); 

countไม่ว่าคุณจะสิ้นสุดในการใช้คำนำหน้าไร้ประโยชน์สำหรับกรณีเล็กน้อยเช่นวงตัวแปรหรือ เมื่อไม่นานมานี้คุณใช้เคาน์เตอร์สั้นหรือยาวสำหรับเคาน์เตอร์ หากคุณทำการยกเว้นคุณมักจะเสียเวลาคิดที่จะต้องมีคำนำหน้าหรือไม่

หากคุณมีตัวแปรจำนวนมากพวกเขาจะได้รับการจัดกลุ่มตามปกติในเบราว์เซอร์วัตถุซึ่งเป็นส่วนหนึ่งของ IDE ของคุณ ตอนนี้ถ้า 40% เริ่มต้นด้วย i_ สำหรับ int และ 40% กับ s_ สำหรับสตริงและเรียงตามตัวอักษรมันยากที่จะหาส่วนสำคัญของชื่อ


1

ที่เดียวที่ฉันยังคงใช้คำต่อท้ายแบบฮังกาเรียนหรือแบบอะนาล็อกเป็นประจำนั้นอยู่ในบริบทที่มีความหมายแบบเดียวกันในสองรูปแบบเช่นการแปลงข้อมูล นี่อาจเป็นในกรณีที่มีหน่วยวัดหลายหน่วยหรือมีหลายรูปแบบ (เช่นสตริง "123" และจำนวนเต็ม 123)

ฉันหาเหตุผลให้ที่นี่ไม่ใช้มันไม่น่าสนใจสำหรับการจัดเก็บภาษีฮังการีกับคนอื่น ๆ แต่การชี้นำอย่างอ่อนโยนสำหรับการตัดสินใจเกี่ยวกับการปฏิบัติของคุณเอง

รหัสที่มาของโปรแกรมที่เป็นอินเตอร์เฟซผู้ใช้ในสิทธิของตนเอง - การแสดงขั้นตอนวิธีการและข้อมูลไปยังผู้ดูแล - และความซ้ำซ้อนในส่วนติดต่อผู้ใช้เป็นคุณธรรมไม่บาป ดูเช่นรูปภาพใน " การออกแบบของสิ่งต่าง ๆ ในชีวิตประจำวัน " และมองไปที่ประตูที่มีข้อความว่า "ดัน" ที่ดูเหมือนว่าคุณดึงมันและเบียร์ก็แตะที่ผู้ปฏิบัติการแฮ็กเข้าเครื่องควบคุมเครื่องปฏิกรณ์นิวเคลียร์ที่สำคัญเพราะอย่างใด พวกเขาใน IDE "ยังไม่ดีพอ

"การโฮเวอร์ใน IDE" ไม่ใช่เหตุผลที่จะไม่ใช้ภาษาฮังการี - เป็นเพียงเหตุผลที่บางคนอาจไม่พบว่ามีประโยชน์ ไมล์สะสมของคุณอาจแตกต่างกัน

แนวคิดที่ว่าชาวฮังการีกำหนดภาระการบำรุงรักษาที่สำคัญเมื่อการเปลี่ยนแปลงประเภทตัวแปรนั้นโง่ - คุณเปลี่ยนประเภทตัวแปรบ่อยแค่ไหน? นอกจากนี้การเปลี่ยนชื่อตัวแปรทำได้ง่าย:

เพียงใช้ IDE เพื่อเปลี่ยนชื่อเหตุการณ์ทั้งหมด -Gander, กำลังตอบกลับไปที่ Goose

หากชาวฮังกาเรียนช่วยให้คุณรีบโค๊ดโค้ดได้อย่างรวดเร็วและดูแลรักษาได้อย่างน่าเชื่อถือให้ใช้มัน ถ้าไม่ทำไม่ได้ หากคนอื่นบอกคุณว่าคุณผิดเกี่ยวกับประสบการณ์ของคุณเองฉันขอแนะนำให้พวกเขาอาจเป็นคนที่มีข้อผิดพลาด

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.