แต่ถ้าคุณอยากปรับมาตรฐานของคุณเป็นแบบมาตรฐานสากล
ผมขอแนะนำ มาตรฐานการตั้งชื่อของ Microsoft
ก่อนอื่นแนะนำรูปแบบ Case ก่อน
Case ที่ใช้ในการตั้งชื่อมี 2 แบบ คือ
- Pascal Case
- Camel Case
โดยตัวอักษรแรกของคำเป็นตัวใหญ่ เช่น "PascalCase"
Camel Case ก็จะคล้าย ๆ กับ Pascal Case
แต่ตัวอักษรแรกจะเป็นตัวเล็ก เช่น "camelCase"
อย่างไรก็ตาม ทั้ง Pascal Case และ Camel Case มีจุดที่เหมือนกันคือ
- ไม่มีเครื่องหมาย ขีดล่าง (_) ระหว่างคำ
มีกฏง่าย ๆ ว่าเมื่อใหร่จะใช้ Pascal Case หรือ Camel Case
- ถ้าเป็น Public Member, Type และ Namespace ให้ใช้ Pascal Case
- Parameter ให้ใช้ Camel Case
- อ่านเข้าใจง่าย เช่น LoadDataByXml แทน LoadCommand2
- ไม่มี Prefix เป็น Type เช่น rowIndex แทน intRowIndex
- ไม่ใช้คำย่อ เช่น SaveCommand แทน SaveCmd
- <ชื่อบริษัท>.<ชื่อสินค้า/โครงการ>.<ส่วนประกอบหลัก>[.<ส่วนประกอบย่อย>]
เช่น Microsoft.WindowsMobile.DirectX
- เป็นคำนาม เช่น ExcelLoader แทน ClassLoadExcel
- ไม่มี Prefix เช่น ConfigurationManager แทน Cls_Config หรือ CConfig
- มี Suffix ตาม Class ต่อไปนี้ Attribute, EventArgs, Exception, Dictionary, Stream, Collection, และ Permission เช่น InvalidOperationException
- เป็นคำนาม หรือ คุณศัพท์ เช่น IEnumerable
- มี Prefix เป็นตัว I ใหญ่
- Delegate ที่ใช้งานกับ Event ชื่อจะตรงกัน แต่ Suffix ด้วยคำว่า EventHandler เช่น MouseClickEventHandler
- นอกนั้นอาจเป็นคำนาม หรือกริยา ลงท้ายด้วยคำว่า Callback
- เป็นคำนาม, หากเป็น Flag ให้เป็นคำนามพหูพจน์
- ไม่มี Suffix เช่น Enum หรือ Flag
- ใช้ตัวอักษร T หรือขึ้นต้นด้วย T เช่น TName, TValue
- หากมี Generice Type Contraint ให้ตั้งชื่อตาม Contraint เช่น ถ้า Generic Type เป็น Stream ก็ใช้ TStream
- ให้ใช้ Verb เช่น CreateDocument
- เป็นคำนาม หรือ คุณศัพท์ ชื่ออาจจะตรงกับ Type ไปเลยก็ได้ เช่น CacheLevel
- ถ้า Return Type เป็น Boolean ให้ Prefix ด้วยคำว่า Is, Are, Has, Can เช่น IsReadOnly
- Parameter ต้องเป็น Camel Case เสมอ
- เป็นคำกริยา ถ้าก่อน Method ทำงานเป็นกริยา -ing ถ้าหลัง Method ทำงานแล้วเป็นกริยา -ed เช่น Loading, Loaded
ทีนี้ Microsoft ไม่ได้กำหนดว่าถ้าเป็น Private Member หรือ Local Variable จะต้องตั้งอย่างไร
ถ้าอยากได้ Guideline ก็ขอแนะนำแบบที่นิยมกันครับ
การตั้งชื่อ Private Member
- ใช้ Camel Case เสมอ
- ถ้าเป็น Private Field จะมี Prefix เป็นขีดล่าง (_) เช่น _isReadOnly
(คนที่ใช้ C# บางคนไม่ชอบข้อนี้ แต่ใน VB ไม่สามารถตั้งชื่อเดียวกันได้
แม้จะใช้คนละ Case เช่น isReadOnly กับ IsReadOnly
ผมจึงคิดว่า ควรมีขีดล่าง เพื่อเป็นมาตรฐานเดียวกัน)
ส่วนกฏการตั้งชื่อ Local Variable ใช้กฏเดียวกับ Parameter
ทำไมไม่ Prefix ชื่อด้วยตัวย่อ?
การ Prefix ชื่อด้วยตัวย่อ เราเรียกว่า Hungarian Notation
ตัวอย่างเช่น gWinCurrent, tblEmployer
Hungarian Notation มีตั้งแต่ 40 ปีที่แล้ว (ยุค 70)
จะว่ามันเป็นมาตรฐานอย่างหนึ่งก็ไม่ผิด
Hungarian Notation ทำให้เรารู้ Scope และ Type ของตัวแปรทันทีแค่ดูชื่อ
นอกจากนี้ยังเป็นตัวจัดกลุ่มของตัวแปรอีกต่างหาก
อย่างไรก็ตาม Hungarian Notation มีข้อเสีย ดังต่อไปนี้
- Compiler เช็ค Type ให้ตั้งแต่ Compile Time อยู่แล้ว ไม่จำเป็นต้องแสดง Type ของตัวแปร
- Visual Studio มี Tooltip กับ Intellisense ไว้ช่วยแสดงและค้นหา Type ที่ต้องการอยู่แล้ว
- ทำให้ Code อ่านยากไม่ได้ใจความ เช่น gStrLogin เมื่อเทียบกับ LoginName
- ชื่อตัวแปรมักจะสื่อถึง Type ของตัวแปรอยู่แล้ว เช่น FirstName เป็น string, IsReadOnly เป็น bool
- ต้องสร้างมาตรฐานตัวย่อขึ้นมาด้วย ทำให้เพิ่มความซับซ้อนในการตั้งชื่อ
- และบางทีตัวย่อก็เป็นความชอบส่วนตัว เช่น GroupBox มีหลายแบบ gru, grp, gpb, gbx
- เขียนสั้น เช่น txtFirstName สั้นกว่า FirstNameTextBox
- จัดกลุ่มได้ดีเวลาเรียกใช้ Intellisense เช่น พิมพ์ menu Intellisense ก็จะขึ้น menu ทุกอันมาให้เลือก
Credit: Chaowman
ไม่มีความคิดเห็น:
แสดงความคิดเห็น