อ้างอิงข้อความจากคุณ 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
ส่วนพวก local variable ก็เลิกการตั้งชื่อสั้น ๆ เพียง 1 ตัวอักษรนะ
เช่น i, j, k, x, y ,z
บางคนบอกว่างั้นใช้ 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 ควรทำให้คนอ่านง่าย เข้าใจได้ง่ายเสมอ
มาฝึก มาทำ กันเถอะนะนักพัฒนาทั้งหลาย
ปล. ถ้ายังตั้งชื่อตัวไม่ดี แสดงว่าเรายังไม่เข้าใจในสิ่งที่กำลังทำดีพอนะครับ