code-smell
สิ่งที่นักพัฒนาที่ดีพึงมี คือ มีจมูกที่ดี
หมายความว่าต้องหัดดมกลิ่นของ code ว่า
code เหล่านั้นมีกลิ่นที่ไม่ดี ไม่พึงประสงค์หรือไม่ ?
ซึ่งเราจะเรียกว่า Code Smell

แต่ปัญหาหลัก ๆ คือ เหล่านักพัฒนานั้น จมูกไม่ค่อยดีนะสิ
มักจะไม่ได้กลิ่นอะไรจาก code เลย !!

ดังนั้นสิ่งแรกที่นักพัฒนาควรทำคือ อ่าน และ ศึกษา
รูปแบบของ code ที่ไม่ดีจากหนังสือ Refactoring : Improving the Design of Existing code

มาดูกันว่า Code Smell ที่เจอบ่อย ๆ มีลักษณะอย่างไรบ้าง ?

1. ไม่มีการกำหนดรูปแบบของ code (Coding Standard)

บางทีม บางบริษัทอาจจะบอกว่า
เรามี coding standard guideline นะ แต่เป็นเอกสาร !!
ปัญหาคือ ไม่มีใครรู้
ปัญหาคือ ไม่มีใครทำตาม
ผลที่ตามมาก็คือ รูปแบบของ code มั่วไปหมด

ดังนั้นสิ่งที่ต้องทำก็คือ สรุป Coding standard ร่วมกันซะ
จากนั้นเริ่มง่าย ๆ จากการกำหนดไว้ใน Text editor และ IDE ของแต่ละคน
ต่อมาใส่ขั้นตอนการตรวจสอบ Coding standard ในระบบ Continuous Integration (CI) อีกด้วย
ปล. แค่เรื่อง Tab กับ Spacebar ยังเป็นเรื่องกันเลย !!

2. Code ที่ไม่สามารถทดสอบได้ หรือ ทดสอบได้ยากมาก ๆ

นักพัฒนาตอบได้ไหมว่า
Code ที่เขียนขึ้นมานั้นมันทำงานได้อย่างถูกต้องหรือไม่ ?
Code ที่เขียนขึ้นมานั้นมันส่งผลกระทบต่อส่วนอื่น ๆ หรือไม่ ?

ถ้าไม่สามารถตอบได้
ก็เขียน test เถอะครับ

เพื่อทำให้ code ที่เขียนขึ้นมาง่ายต่อการทดสอบ
เพื่อทำให้ระบบที่สร้างขึ้นมาง่ายต่อการทดสอบ
มิเช่นนั้น code ของระบบ อาจจะผูกมัดกันอย่างแรง
ทำให้ยากต่อการทดสอบ
ทำให้การแก้ไขแต่ละอย่างส่งผลกระทบต่อส่วนอื่น ๆ อย่างมาก

3. Code ที่มึน ๆ งง ๆ สับสนวุ่นวาย

เคยเจอไหมที่ comment หรือ document ไม่ตรงกับ code
เคยเจอไหมที่เจอ Log มากกว่า code
เคยเจอไหมที่ตัวแปรใน code มีแต่ i, j, k, x, y, z
มีตัวแปร boolean ขยะจำนวนมาก เช่น ทำงานสำเร็จ return true แต่ถ้าไม่จะเป็น false
ตัวแปรเหล่านั้นมักจะชื่อ flag
เราลบ code กันดีไหม ?

สุดท้ายอย่า Copy and Paste code แบบไม่เข้าใจมันจริง ๆ

บางคนบอกว่าวิธีการนี้มันคือ DRY (Don’t Repeat Yourself)
แต่ในความเป็นจริงมันเป็นวิธีการของคนขี้เกียจมากกว่า
ดังนั้นก่อนนำไปใช้งานหยุดคิด ตั้งสตินิดนึง

วันนี้จมูกของคุณดีไหม ได้กลิ่นอะไรจาก code หรือไม่ ?

Reference Websites
https://medium.freecodecamp.com/do-not-allow-bad-smells-in-your-java-code-4e8ad244393#.j013zfh1a