จากที่ผมอธิบายเกี่ยวกับ

ซึ่งสิ่งที่อธิบายไปนั้น ล้วนแล้วแต่เป็นสิ่งบ่งบอกว่า code มีปัญหา
โดยสิ่งที่บ่งบอกว่า code ของเราน่าจะมีปัญหานั้น ในทางเทคนิคจะเรียกว่า Code Smell
ดังนั้น เรามาดูกันก่อนว่า Code Smell มันมีอะไรบ้าง
เพื่อให้สามารถหาวิธีการแก้ไขหรือป้องกันได้

ในวงการของนักพัฒนามักจะ

  • นำพวก Design Pattern ต่างๆ มาใช้งาน
  • นำพวก framework ต่างๆ มาใช้งาน
  • มักจะพูดว่า code นี้มันดีหรือไม่ดีอย่างไร

แต่ก่อนที่เราจะนำหรือบอกว่ามันดีหรือไม่ดีอย่างไร
เราควรมาทำความรู้จักก่อนว่า รูปแบบของ code ที่มีปัญหาเป็นอย่างไรก่อน น่าจะดีกว่า
ซึ่งหลายๆ คนอาจจะยังไม่รู้เลย …

คำจำกัดความของ Code Smell

จาก Wikipedia  บอกว่า
In computer programming, code smell is any symptom in the source code of a program that possibly indicates a deeper problem. Code smells are usually not bugs—they are not technically incorrect and do not currently prevent the program from functioning. Instead, they indicate weaknesses in design that may be slowing down development or increasing the risk of bugs or failures in the future.

คำอธิบาย
Code Smell คือ อาการต่างๆ ใน code ที่ทำการพัฒนาขึ้นมา โดยจะใช้เป็นตัวชี้วัดปัญหาที่อาจจะเกิดขึ้น
แต่ Code Smell มันอาจจะไม่ก่อให้เกิดความผิดพลาด
แต่มันใช้วัดความแย่ของการออกแบบ ซึ่งอาจจะทำให้การพัฒนาช้าลงเรื่อยๆ
หรือเพิ่มความเสี่ยงให้เกิดปัญหาต่างๆ ในอนาคตได้

Code Smell เขาจัดกลุ่มกันอย่างไรบ้างล่ะ

โดยสามารถจัดกลุ่มของ Code Smell ได้ดังนี้

  • Code Smell ที่เกิดขึ้นภายในคลาส
  • Code Smell ที่เกิดขึ้นระหว่างคลาส

ในบทความนี้จะอธิบาย Code Smell ที่เกิดขึ้นภายในคลาสก่อน
ประกอบไปด้วย Code Smell ดังต่อไปนี้

1. Comment  ในการเขียน comment นั้นจะต้องถามคุยกันก่อนว่า เขียน comment ขึ้นมาเพื่ออะไร และ ทำไม
และอย่าลืมว่า comment นั้นเขียนเพื่อให้คนอ่าน ไม่ใช่เครื่องจักรมาอ่านนะ !!

2. Duplicate code คือ code ที่ทำงานเหมือนกันมากกว่า 1 ที่

3. Long method คือ method ที่ทำงานยาวๆ หรือทำงานมากกว่า 1 อย่าง

4. Large class คือ class ที่มีความยาวมากๆ หรือมักจะเรียก class นี้ว่า คลาสพระเจ้า คือ ทำทุกๆ อย่าง

5. Too many parameters คือ จำนวน parameter ที่ส่งเข้ามายัง method ต่างๆ ถ้ามีจำนวนมากๆ
นั่นหมายความว่า method นั้นจะอ่านยาก
นั่นหมายความว่า method นั้นจะมีการทำงานซับซ้อน
ส่งผลให้ method นั้นมีการทำงานที่ซ้บซ้อน และส่งผลให้ method ยาว

6. Conditional complexity  คือ code ที่มีส่วนการตรวจสอบเงื่อนไขจำนวนมาก
หรือมีความซับซ้อน ส่งผลให้เกิดการเปลี่ยนแปลง และ แก้ไขอยู่บ่อยมาก
สามารถนำแนวคิดของ design pattern มาแก้ไขปัญหานี้ได้ เช่น Stategy, Decorator และ State เป็นต้น

7. Large class คือ class ที่มีการทำงานเยอะ อาจจะมาจากการทำงานใน method ที่ยาวๆ
ส่งผลให้ยากต่อการอ่าน ต่อการทำความเข้าใจ และเกิดปัญหามากมายตามมา
คำถามที่เกิดขึ้นมาจากปัญหานี้ก็คือ class นี้มีหน้าที่การทำงานมากกว่าหนึ่งหรือไม่ ?
และสามารถที่จะแยกหน้าที่การทำงานออกไปยังส่วนอื่นๆ ได้หรือไม่ ?
ซึ่งนี่คือแนวทางในการแก้ไขปัญหา

8. Uncommunicative name คือ ชื่อของ class, method และ ตัวแปรต่างๆ
มันสามารถอธิบายหน้าที่การทำงานของมันได้หรือไม่ ?
คนอื่นๆ สามารถอ่านแล้วเข้าใจหรือไม่ ?
ถ้าตอบว่าไม่ ให้ทำการเปลี่ยนชื่อเสียเถอะ

9. Dead code คือ code ที่ไม่เคยถูกเรียกใช้งานเลย แนะนำให้ทำการลบทิ้งไปซะเถอะ มีไปก็เปล่าประโยชน์
ถ้าใครบอกว่าอย่าลบมันเลย กลัวว่าจะต้องใช้งานมันอีกในอนาคต
คำถามที่ต้องถามกลับไปก็คือ ใช้ Source Control Version หรือไม่ ?

10. Temporary fields คือ ตัวแปร หรือ field ต่างๆ ใน class อาจจะไม่ถูกใช้งาน หรือไม่มีประโยชน์
หรือถูกใช้งานแบบชั่วคราว แนะนำให้ตรวจสอบว่ามันถูกใช้งานจริงๆ หรือไม่
ถ้าไม่มีการใช้งาน ให้ทำการลบไปเถอะ

ส่งท้าย

ลองกลับไปดูว่า code ของคุณมี Code Smell เหล่านี้บ้างหรือไม่
และลองทำการแก้ไขดูครับ

ในบทความต่อไปจะอธิบาย Code Smell ที่เกิดขึ้นของคลาสที่ทำได้ด้วยกัน

Reference Websites
Code Smell
Code Smell
Bass smell in code