อ้างอิงข้อความจากคุณ Phil Karlton
There are only two hard things in Computer Science: cache invalidation and naming things.รวมทั้งข้อมูลจากผลสำรวจเรื่อง The hardest problem in programming is what to name your variables and functions พบว่าเรื่องที่ยากที่สุดสำหรับนักพัฒนา software คือ การตั้งชื่อของตัวแปร function/method, class และอื่น ๆ อีกมากมาย โดยรวมคือการตั้งชื่อให้สื่อความหมายนั่นเอง (Meaningful Name) เรื่องรองลงมาเช่น
- ไม่สามารถอธิบายได้ว่าตัวเองกำลังทำอะไร
- ไม่สามารถประเมินเวลาในการทำงานได้
- มีปัญหาในการทำงานร่วมกับผู้อื่น
สรุปแล้วนักพัฒนา software ทำอะไรกันอยู่ล่ะ ? และ code ที่เขียนออกมามันเป็นอย่างไรกันบ้าง ? หรือเราสนใจเพียงผลการทำงานที่เห็นเท่านั้น !!แสดงดังรูป สำหรับนักพัฒนา software ที่ดีนั้นต้อง สามารถปรับปรุงการตั้งชื่อให้ดีขึ้น สามารถปรับปรุงชื่อให้สื่อความหมายและเข้าใจได้มากขึ้น สามารถลด code ที่ซ้ำซ้อนลงไปได้
แต่เรากลับพบ code จำนวนมากที่ตั้งชื่อแย่ ๆ และ ไม่สื่อความหมายอะไรเลย !!
ลองค้นหาคำว่า foo ใน github.com ได้ข้อมูลดังนี้ เยอะดีนะ !! คำว่า foo มันไม่ได้มีความหมายอะไรเลยตัวอย่างของชื่อตัวแปรที่แย่สุด ๆ คือ data
รองลงมาคือ data2 ถัดลงมาคือ data_2 ลด ล่ะ เลิกการใช้ตัวย่อสักทีเถอะนะ (ยกเว้น id ไว้ก็ได้) เช่น- acc
- inq
- pos
- auth
- mod
บางคนบอกว่างั้นใช้ 2 ตัวอักษรก็ได้ เช่น xx, yy, zz ขอบอกเลยว่า มันไม่ได้ช่วยปรับปรุงห่าเหวอะไรเลยนะ !!อีกเรื่องที่พบมาก ๆ คือการสะกดชื่อคำศัพท์ต่าง ๆ ผิด เขียนผิด ความหมายเปลี่ยนทันที !! ดู Antipattern แบบขำ ๆ ของการตั้งชื่อเพิ่มเติมได้จาก Programming Puns
ยังไม่พอนะ จาก Paper เรื่อง Linguistic antipatterns: what they are and how developers perceive them
อธิบายถึงแนวปฏิบัติแย่ ๆ ที่เกิดขึ้นอย่างซ้ำซากในการพัฒนา software คือ การตั้งชื่อ, เอกสาร และ การอธิบายพฤติกรรมการทำงานของระบบ ซึ่งทำการสรุปไว้ 17 กลุ่มดังนี้- Getter method ทำมากกว่าการ return ค่ากลับมา โดยไร้ซึ่งเอกสารมาอธิบาย
- isXXX method ทำการ return ค่าอื่น ๆ ที่ไม่ใช่ boolean
- Setter method ทำการ return ค่ากลับออกมาได้
- ชื่อของ method บอกว่า return ค่าเพียงค่าเดียว แต่ว่าในความจริงกลับส่ง List/Array หรือ Null กลับมา เช่น List getUser()
- Comment ของ method บอกว่ามีเงื่อนไขต่าง ๆ แต่ใน code กลับไม่มี
- ใน method มักจะมีการ validate ข้อมูล แต่ไม่แจ้งความผิดพลาดใด ๆ ออกมาเลย ทำงานได้ในกรณีที่สำเร็จเท่านั้น โดยไม่มีเอกสารอะไรมาอธิบาย
- Getter method ไม่ทำการ return ค่าอะไรเลย
- ชื่อของ method ไม่สื่อถึงการทำงานจริง เช่น void isValid()
- method ที่ทำการแปลงค่าจากค่าหนึ่งไปยังอีกค่าหนึ่ง ไม่ทำการ return ค่าออกมา
- ชื่อของ method บอกว่า return ค่ามากกว่าหนึ่งตัวเช่น List/Array แต่ว่าในความจริงกับส่งเพียงตัวเดียวกับมาเช่น int getUsers()
- ชื่อ method กับชนิดของการ return ขัดแย้งกัน
- ชื่อ method และ comment ของ method ขัดแย้งกัน
- ชื่อตัวแปรเป็นเอกพจน์ แต่กลับมีค่าเป็นพหูพจน์ เช่น List user
- ชื่อตัวแปรเป็นพหูพจน์ แต่กลับมีค่าเป็นเอกพจน์ เช่น User users
- ชื่อบอกว่าเป็นชนิด boolean แต่ความจริงกลับไม่ใช่
- ชื่อและชนิดของตัวแปรขัดแย้งกัน
- ชื่อและ comment ของตัวแปรขัดแย้งกัน
ลองกลับมาถามตัวเราเองสิว่า ทำข้อไหนกันอยู่บ้าง ?
คำถามที่น่าสนใจคือ แล้วจะปรับปรุงการตั้งชื่ออย่างไรดีล่ะ ?
ผมมีคำแนะนำดังนี้ เริ่มจากการเป็นผู้เขียนที่ดี จะเป็นผู้เขียนที่ดีได้ ต้องรู้จักคำศัพท์เยอะ ๆ (ภาษาอังกฤษ) ดังนั้นจำเป็นต้องอ่านเยอะ ๆ อ่านในสิ่งที่เราสนใจก่อนน่าจะง่ายที่สุด หรือเล่นเกมส์เพื่อฝึกคำศัพท์เช่น Crossword เป็นต้น หรือไม่เช่นนั้นก็เริ่มใช้งาน dictionary บ้างนะ ต่อมาให้เริ่มฝึกตั้งชื่อต่าง ๆ ใน code ให้เริ่มต้นจากการเข้าใจก่อนว่า เรากำลังจะทำอะไร (ยากมาก ๆ) ใช้คำที่มันสามารถสื่อสารความต้องการของเราได้ โดยไม่จำเป็นต้องใช้คำเยอะ ลด ละ เลิกการใช้ตัวย่อ ทำการ pair programming และ code review เพื่อปรับปรุงการตั้งชื่อ ถ้าต้องการแก้ไขชื่อ แนะนำให้ทำผ่าน refactoring tool ของ IDE ที่ใช้นะครับ จะปลอดภัยและสะดวกที่สุด ไม่ใช่ทำการค้นหาและ replace ทั้งหมดนะ !! ทำแบบนี้ไปเรื่อย ๆ ปรับปรุงอย่างต่อเนื่อง แล้วการตั้งชื่อของเราจะดีขึ้นเองปล. การตั้งชื่อที่ว่ายากแล้ว การเปลี่ยนชื่อสิยากยิ่งกว่าสรุปง่าย ๆ คือ ให้เวลากับการตั้งชื่อ ทำ code review บ่อย ๆ อย่ากลัวการเปลี่ยนชื่อ และทำบ่อย ๆ จนกลายเป็นเรื่องธรรมชาติ
หนังสือที่แนะนำให้อ่านและศึกษาเพิ่มเติมสำหรับการตั้งชื่อมีดังนี้
- Code complete บทที่ 10 เรื่อง The power of variable names
- Clean code บทที่ 2 เรื่อง Meaningful names
- Becoming a better programmer บทที่ 2 เรื่อง Names
สุดท้ายแล้ว
Code ที่เขียนขึ้นมานั้นมีเป้าหมายไว้เพื่อให้คนอ่านและทำความเข้าใจ ดังนั้นการตั้งชื่อต่าง ๆ ใน source code ควรทำให้คนอ่านง่าย เข้าใจได้ง่ายเสมอ มาฝึก มาทำ กันเถอะนะนักพัฒนาทั้งหลายปล. ถ้ายังตั้งชื่อตัวไม่ดี แสดงว่าเรายังไม่เข้าใจในสิ่งที่กำลังทำดีพอนะครับ