ฉันทั้งหมดในความโปรดปรานของคำนำหน้าทำดี
ฉันคิดว่า (ระบบ) สัญกรณ์ฮังการีรับผิดชอบส่วนใหญ่ของ "การลงโทษที่ไม่ดี" ที่คำนำหน้าได้รับ
สัญกรณ์นี้ส่วนใหญ่ไม่มีจุดหมายในภาษาที่พิมพ์อย่างรุนแรงเช่นใน C ++ "lpsz" เพื่อบอกคุณว่าสตริงของคุณเป็นตัวชี้ที่ยาวไปยังสตริงที่ถูกยกเลิก nul เมื่อ:: เซกเมนต์สถาปัตยกรรมเป็นประวัติศาสตร์โบราณ, สตริง C ++ เป็นตัวชี้การประชุมทั่วไป อาร์เรย์ char และมันก็ไม่ใช่เรื่องยากที่จะรู้ว่า "customerName" เป็นสตริง!
อย่างไรก็ตามฉันใช้คำนำหน้าเพื่อระบุการใช้งานของตัวแปร (เป็นหลัก "Apps Hungarian" ถึงแม้ว่าฉันต้องการหลีกเลี่ยงคำศัพท์ภาษาฮังการีเนื่องจากมีความสัมพันธ์ที่ไม่ดีและไม่เป็นธรรมกับ System Hungarian) และนี่เป็นการประหยัดเวลาและสะดวกมากวิธีการลดข้อผิดพลาด
ฉันใช้:
- m สำหรับสมาชิก
- c สำหรับค่าคงที่ / อ่านได้อย่างเดียว
- p สำหรับตัวชี้ (และ pp สำหรับตัวชี้ไปยังตัวชี้)
- v สำหรับความผันผวน
- s สำหรับคงที่
- i สำหรับดัชนีและตัววนซ้ำ
- e สำหรับกิจกรรม
ฉันต้องการที่จะให้ชนิดที่ชัดเจนผมใช้คำต่อท้ายมาตรฐาน (เช่นรายการ ComboBox ฯลฯ )
สิ่งนี้ทำให้โปรแกรมเมอร์ตระหนักถึงการใช้งานของตัวแปรเมื่อใดก็ตามที่พวกเขาเห็น / ใช้มัน เนื้อหาที่สำคัญที่สุดคือ "p" สำหรับตัวชี้ (เนื่องจากการเปลี่ยนแปลงการใช้งานจาก var. เป็น var-> และคุณต้องระมัดระวังให้มากขึ้นด้วยตัวชี้ - NULLs, ตัวชี้ทางคณิตศาสตร์เป็นต้น) แต่สิ่งอื่น ๆ นั้นมีประโยชน์มาก
ตัวอย่างเช่นคุณสามารถใช้ชื่อตัวแปรเดียวกันได้หลายวิธีในฟังก์ชั่นเดียว: (นี่คือตัวอย่าง C ++ แต่ใช้ได้กับหลายภาษาเท่า ๆ กัน)
MyClass::MyClass(int numItems)
{
mNumItems = numItems;
for (int iItem = 0; iItem < mNumItems; iItem++)
{
Item *pItem = new Item();
itemList[iItem] = pItem;
}
}
คุณสามารถดูที่นี่:
- ไม่มีความสับสนระหว่างสมาชิกและพารามิเตอร์
- ไม่มีความสับสนระหว่างดัชนี / ตัววนซ้ำกับรายการ
- ใช้ชุดของตัวแปรที่เกี่ยวข้องอย่างชัดเจน (รายการไอเท็มตัวชี้และดัชนี) ที่หลีกเลี่ยงการผิดพลาดของชื่อทั่วไป (คลุมเครือ) เช่น "count", "index"
- คำนำหน้าลดการพิมพ์ (สั้นลงและทำงานได้ดีกว่าเมื่อเติมข้อมูลอัตโนมัติ) ดีกว่าตัวเลือกอื่น ๆ เช่น "itemIndex" และ "itemPtr"
อีกจุดที่ยอดเยี่ยมของตัววนซ้ำ "iName" คือฉันไม่เคยทำดัชนีอาร์เรย์ด้วยดัชนีที่ไม่ถูกต้องและถ้าฉันคัดลอกวนรอบในวงอื่นฉันไม่ต้องปรับโครงสร้างตัวแปรดัชนีวงใดวงหนึ่ง
เปรียบเทียบตัวอย่างง่ายๆที่ไม่สมจริงนี้:
for (int i = 0; i < 100; i++)
for (int j = 0; j < 5; j++)
list[i].score += other[j].score;
(ซึ่งยากต่อการอ่านและมักจะนำไปสู่การใช้ "i" โดยที่ "j" ตั้งใจไว้)
ด้วย:
for (int iCompany = 0; iCompany < numCompanies; iCompany++)
for (int iUser = 0; iUser < numUsers; iUser++)
companyList[iCompany].score += userList[iUser].score;
(ซึ่งสามารถอ่านได้มากขึ้นและขจัดความสับสนทั้งหมดในการจัดทำดัชนีด้วยการทำให้สมบูรณ์อัตโนมัติใน IDEs ที่ทันสมัยสิ่งนี้ยังรวดเร็วและง่ายต่อการพิมพ์)
ประโยชน์ต่อไปคือตัวอย่างโค้ดไม่ต้องการบริบทใด ๆเข้าใจฉันสามารถคัดลอกโค้ดสองบรรทัดไปยังอีเมลหรือเอกสารและใครก็ตามที่อ่านว่าข้อมูลโค้ดสามารถบอกความแตกต่างระหว่างสมาชิกทุกคนค่าคงที่ตัวชี้ดัชนีดัชนี ฯลฯ ฉันไม่ต้องเพิ่ม "โอ้และระวังเพราะ 'data' เป็นตัวชี้ไปยังตัวชี้ "เนื่องจากเรียกว่า 'ppData'
และด้วยเหตุผลเดียวกันฉันไม่ต้องละสายตาจากโค้ดเพื่อทำความเข้าใจ ฉันไม่ต้องค้นหารหัสเพื่อค้นหาว่า 'ข้อมูล' เป็นพารามิเตอร์พารามิเตอร์สมาชิกหรือค่าคงที่ในท้องถิ่นหรือไม่ ฉันไม่ต้องขยับมือของฉันไปที่เมาส์เพื่อให้ฉันสามารถเลื่อนตัวชี้ไปที่ 'data' แล้วรอคำแนะนำเครื่องมือ (ซึ่งบางครั้งก็ไม่เคยปรากฏ) มาปรากฏขึ้น ดังนั้นโปรแกรมเมอร์จึงสามารถอ่านและเข้าใจรหัสได้เร็วขึ้นอย่างมากเพราะพวกเขาไม่ต้องเสียเวลาค้นหาขึ้นและลงหรือรอ
(ถ้าคุณไม่คิดว่าคุณจะเสียเวลาค้นหาสิ่งที่ต้องทำออกมาให้ค้นหาโค้ดที่คุณเขียนเมื่อปีที่แล้วและยังไม่ได้ดูเลยเปิดไฟล์แล้วกระโดดลงครึ่งหนึ่งโดยไม่อ่าน ตอนนี้คุณสามารถอ่านจากจุดนี้ก่อนที่คุณจะไม่รู้ว่ามีบางสิ่งบางอย่างที่เป็นสมาชิกพารามิเตอร์หรือท้องถิ่นตอนนี้ข้ามไปยังตำแหน่งสุ่มอื่น ... นี่คือสิ่งที่เราทุกคนทำตลอดทั้งวันเมื่อเราก้าวผ่านรหัสของคนอื่น หรือพยายามที่จะเข้าใจวิธีการเรียกฟังก์ชั่นของพวกเขา)
คำนำหน้า 'm' ยังหลีกเลี่ยงสัญลักษณ์ (IMHO) ที่น่าเกลียดและใช้คำว่า "this->" และความไม่ลงรอยกันที่รับประกันได้ (แม้ว่าคุณจะระมัดระวังคุณก็มักจะมีส่วนผสมของ 'this-> data' และ 'data' ในคลาสเดียวกันเนื่องจากไม่มีสิ่งใดบังคับใช้การสะกดชื่อที่สอดคล้องกัน)
สัญกรณ์ 'นี้' มีจุดประสงค์เพื่อแก้ไขความกำกวม - แต่ทำไมทุกคนจะจงใจเขียนโค้ดที่คลุมเครือ? ความกำกวมจะนำไปสู่ข้อผิดพลาดไม่ช้าก็เร็ว และในบางภาษา 'นี่' ไม่สามารถใช้สำหรับสมาชิกแบบสแตติกได้ดังนั้นคุณต้องแนะนำ 'กรณีพิเศษ' ในรูปแบบการเข้ารหัสของคุณ ฉันชอบที่จะมีกฎการเข้ารหัสที่เรียบง่ายเพียงข้อเดียวที่ใช้กับทุกที่ - ชัดเจนชัดเจนและสอดคล้องกัน
ประโยชน์ที่สำคัญสุดท้ายคือ Intellisense และการทำให้สมบูรณ์อัตโนมัติ ลองใช้ Intellisense ในแบบฟอร์ม Windows เพื่อค้นหาเหตุการณ์ - คุณต้องเลื่อนวิธีการเรียนพื้นฐานลึกลับหลายร้อยรายการที่คุณไม่จำเป็นต้องโทรหาเพื่อค้นหาเหตุการณ์ แต่ถ้าทุกเหตุการณ์มีคำนำหน้า "e" เหตุการณ์เหล่านั้นจะปรากฏในกลุ่มภายใต้ "e" โดยอัตโนมัติ ดังนั้นคำนำหน้าใช้เพื่อจัดกลุ่มสมาชิก const เหตุการณ์และอื่น ๆ ในรายการ intellisense ทำให้การค้นหาชื่อที่คุณต้องการรวดเร็วและง่ายขึ้น (โดยปกติวิธีอาจมีค่าประมาณ 20-50 (locals, params, สมาชิก, const, เหตุการณ์) ที่สามารถเข้าถึงได้ในขอบเขตของมัน แต่หลังจากพิมพ์คำนำหน้า (ฉันต้องการใช้ดัชนีตอนนี้ดังนั้นฉันพิมพ์ 'i .. ') ฉันมีตัวเลือกที่สมบูรณ์แบบอัตโนมัติเพียง 2-5 ตัว' การพิมพ์พิเศษ '
ฉันเป็นโปรแกรมเมอร์ขี้เกียจและการประชุมข้างต้นช่วยฉันได้มาก ฉันสามารถเขียนโค้ดได้เร็วขึ้นและทำผิดพลาดน้อยลงเพราะฉันรู้ว่าควรใช้ตัวแปรทุกตัวอย่างไร
มีปากเสียงกับ
ดังนั้นข้อเสียคืออะไร? ข้อโต้แย้งทั่วไปกับคำนำหน้าคือ:
"แผนการคำนำหน้าไม่ดี / ชั่ว" ฉันยอมรับว่า "m_lpsz" และตระกูลของมันมีคุณภาพต่ำและไร้ประโยชน์ทั้งหมด นั่นเป็นเหตุผลที่ฉันแนะนำให้ใช้สัญลักษณ์ที่ออกแบบมาอย่างดีซึ่งออกแบบมาเพื่อรองรับความต้องการของคุณแทนที่จะคัดลอกสิ่งที่ไม่เหมาะสมกับบริบทของคุณ (ใช้เครื่องมือที่เหมาะสมสำหรับงาน)
"ถ้าฉันจะเปลี่ยนการใช้งานของบางสิ่งบางอย่างที่ผมต้องเปลี่ยนชื่อมันว่า" ใช่แน่นอนคุณต้องทำนั่นคือสิ่งที่ต้องทำการรีบูทและทำไม IDEs ถึงมีเครื่องมือการรีแฟคเตอร์เพื่อทำงานนี้อย่างรวดเร็วและไม่เจ็บปวด แม้จะไม่มีคำนำหน้าการเปลี่ยนการใช้งานของตัวแปรเกือบแน่นอนหมายความว่าชื่อของมันควรจะเปลี่ยน
"คำนำหน้าเพียงแค่สร้างความสับสนให้ฉัน" เช่นเดียวกับทุกเครื่องมือจนกว่าคุณจะเรียนรู้วิธีใช้ เมื่อสมองของคุณคุ้นเคยกับรูปแบบการตั้งชื่อแล้วมันจะกรองข้อมูลออกโดยอัตโนมัติและคุณจะไม่คิดว่าคำนำหน้านั้นจะมีอีกต่อไป แต่คุณต้องใช้รูปแบบเช่นนี้อย่างสมบูรณ์เป็นเวลาหนึ่งหรือสองสัปดาห์ก่อนที่คุณจะกลายเป็น "คล่องแคล่ว" จริงๆ และนั่นคือเมื่อผู้คนจำนวนมากดูที่โค้ดเก่าและเริ่มสงสัยว่าพวกเขาจัดการได้อย่างไรโดยไม่มีโครงร่างที่ดี
"ผมก็สามารถดูรหัสที่จะทำงานสิ่งนี้ออก" ใช่ แต่คุณไม่จำเป็นต้องเสียเวลาดูที่อื่นในรหัสหรือจดจำทุกรายละเอียดของมันเมื่อคำตอบอยู่ตรงจุดที่ตาของคุณเพ่งความสนใจไปแล้ว
(บางคน) ที่สามารถพบได้โดยเพียงแค่รอให้คำแนะนำเครื่องมือที่จะปรากฏขึ้นบนตัวแปรของฉัน ใช่. หากรองรับคำนำหน้าบางประเภทเมื่อโค้ดของคุณรวบรวมได้อย่างสมบูรณ์หลังจากรอคุณสามารถอ่านคำอธิบายและค้นหาข้อมูลที่คำนำหน้าจะถ่ายทอดได้ทันที ฉันรู้สึกว่าคำนำหน้าเป็นวิธีที่ง่ายกว่าเชื่อถือได้และมีประสิทธิภาพมากกว่า
"มันเป็นเรื่องการพิมพ์มากขึ้น" จริงๆ? ตัวละครทั้งหมดมากกว่าหนึ่งตัว? หรือเป็น - ด้วยเครื่องมือเติมข้อมูลอัตโนมัติของ IDE มันมักจะลดการพิมพ์เนื่องจากอักขระนำหน้าแต่ละตัวจะ จำกัด พื้นที่การค้นหาให้แคบลงอย่างมาก กด "e" และเหตุการณ์ทั้งสามในชั้นเรียนของคุณจะปรากฏขึ้นในระบบ Intellisense กด "c" และค่าคงที่ห้ารายการ
"ผมสามารถใช้this->
แทนm
" ก็ใช่คุณทำได้ แต่นั่นเป็นเพียงคำนำหน้าที่น่าเกลียดมากและละเอียดมากขึ้น! มีเพียงความเสี่ยงที่ยิ่งใหญ่กว่า (โดยเฉพาะในทีม) เพราะคอมไพเลอร์เป็นตัวเลือกและการใช้งานจึงไม่สอดคล้องกันบ่อยครั้ง m
ในทางกลับกันสั้นชัดเจนชัดเจนและไม่จำเป็นดังนั้นจึงเป็นเรื่องยากมากที่จะทำผิดพลาดโดยใช้มัน