อ้างอิงข้อความจากคุณ 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 ที่เขียนออกมามันเป็นอย่างไรกันบ้าง ?
หรือเราสนใจเพียงผลการทำงานที่เห็นเท่านั้น !!

แสดงดังรูป

hard-dev-02

สำหรับนักพัฒนา software ที่ดีนั้นต้อง
สามารถปรับปรุงการตั้งชื่อให้ดีขึ้น
สามารถปรับปรุงชื่อให้สื่อความหมายและเข้าใจได้มากขึ้น
สามารถลด code ที่ซ้ำซ้อนลงไปได้

แต่เรากลับพบ code จำนวนมากที่ตั้งชื่อแย่ ๆ และ ไม่สื่อความหมายอะไรเลย !!

ลองค้นหาคำว่า foo ใน github.com ได้ข้อมูลดังนี้
เยอะดีนะ !!
คำว่า foo มันไม่ได้มีความหมายอะไรเลย

hard-dev-03

ตัวอย่างของชื่อตัวแปรที่แย่สุด ๆ คือ 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 กลุ่มดังนี้

  1. Getter method ทำมากกว่าการ return ค่ากลับมา โดยไร้ซึ่งเอกสารมาอธิบาย
  2. isXXX method ทำการ return ค่าอื่น ๆ ที่ไม่ใช่ boolean
  3. Setter method ทำการ return ค่ากลับออกมาได้
  4. ชื่อของ method บอกว่า return ค่าเพียงค่าเดียว แต่ว่าในความจริงกลับส่ง List/Array หรือ Null กลับมา เช่น List getUser()
  5. Comment ของ method บอกว่ามีเงื่อนไขต่าง ๆ แต่ใน code กลับไม่มี
  6. ใน method มักจะมีการ validate ข้อมูล แต่ไม่แจ้งความผิดพลาดใด ๆ ออกมาเลย ทำงานได้ในกรณีที่สำเร็จเท่านั้น โดยไม่มีเอกสารอะไรมาอธิบาย
  7. Getter method ไม่ทำการ return ค่าอะไรเลย
  8. ชื่อของ method ไม่สื่อถึงการทำงานจริง เช่น void isValid()
  9. method ที่ทำการแปลงค่าจากค่าหนึ่งไปยังอีกค่าหนึ่ง ไม่ทำการ return ค่าออกมา
  10. ชื่อของ method บอกว่า return ค่ามากกว่าหนึ่งตัวเช่น List/Array แต่ว่าในความจริงกับส่งเพียงตัวเดียวกับมาเช่น int getUsers()
  11. ชื่อ method กับชนิดของการ return ขัดแย้งกัน
  12. ชื่อ method และ comment ของ method ขัดแย้งกัน
  13. ชื่อตัวแปรเป็นเอกพจน์ แต่กลับมีค่าเป็นพหูพจน์ เช่น List user
  14. ชื่อตัวแปรเป็นพหูพจน์ แต่กลับมีค่าเป็นเอกพจน์ เช่น User users
  15. ชื่อบอกว่าเป็นชนิด boolean แต่ความจริงกลับไม่ใช่
  16. ชื่อและชนิดของตัวแปรขัดแย้งกัน
  17. ชื่อและ 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 ควรทำให้คนอ่านง่าย เข้าใจได้ง่ายเสมอ
มาฝึก มาทำ กันเถอะนะนักพัฒนาทั้งหลาย

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