บทความนี้จะนำพาทุกคนมารู้จักกับการ Refactoring และ Code Smells เพื่อเป็นการปูพื้นฐานกันก่อนที่จะไปลงรายละเอียดเกี่ยวกับการจัดการกับ Code Smells

"Refactoring" เป็นกระบวนการปรับปรุงโค้ดของโปรแกรมโดยที่ไม่เปลี่ยนพฤติกรรมฟังก์ชันของซอฟต์แวร์นั้นๆ หรือไม่เพิ่มฟีเจอร์ใหม่ แต่เน้นไปที่การแก้ไขโครงสร้างของโค้ดเพื่อทำให้มีความเข้าใจง่ายขึ้น, อ่านง่ายขึ้น, และมีประสิทธิภาพที่ดีขึ้น โดยทั่วไปแล้ว, refactoring มุ่งเน้นไปที่การลดความซับซ้อนของโค้ด, ลดการทำซ้ำ, และทำให้โค้ดมีโครงสร้างที่ดีขึ้น

Refactoring ไม่ได้มีเป้าหมายที่จะแก้ไขข้อบกพร่องหรือเพิ่มฟีเจอร์ใหม่ แต่มุ่งเน้นไปที่การปรับปรุงโค้ดที่มีอยู่แล้วเพื่อทำให้โค้ดมีความเข้าใจง่าย สะอาด และมีความยืดหยุ่น เป้าหมายหลักคือการทำให้โค้ดง่ายต่อการบริหารจัดการ การเปลี่ยนแปลง และการส่งมอบ

เมื่อไหร่ที่เราควรจะ Refactoring

ควรทำ Refactoring ได้ตลอดเวลา ทั้งตอนเริ่มต้นและหลังเขียนโค๊ดเสร็จ โดยอาจจะเริ่มต้นโดยใช้ กฏ "นับ 3" (Rule of Three) คือ โดยในระหว่างการทำงาน ให้คุณเขียนโค๊ดพัฒนาไปปกติ ถ้าหากพบว่ามีการทำงานบางอย่างที่คล้ายกัน ซ้ำเกิน 2 ครั้งให้ทำการ refactor โค๊ดชุดนั้น เช่น แยกตัวแปร ปรับวิธีการเขียน หรือ แยกการทำงานบางส่วนในโค๊ดนั้นออกมาเป็นอีกฟังก์ชั่นหนึ่ง เป็นต้น ถ้าคุณรู้สึกว่าการไล่โค้ด มันมีความยุ่งเหยิง ซับซ้อน รวมถึงโค้ดมีการ duplicated กันในหลายๆ ที่ จนเริ่มงง หรือบางอย่างในโค้ดมีความกำกวม เริ่มตีความการทำงานของมันยากขึ้น หรือมีการเพิ่ม feature ให้กับโค้ดเดิมแล้วพบว่ามันซับซ้อนทำยาก ก็ควรเริ่มคิดแผนการ refactor ได้เลย

ข้อควรระวัง
การ Refactoring นั้นมีความเสี่ยงที่จะทำให้การทำงานของ code ที่เคยทำงานได้อยู่แล้ว เกิดข้อผิดพลาด ทำงานผิดพลาดหรืออาจจะไม่สามารถทำงานได้ ดังนั้นควรเข้าใจการทำงานของโค๊ดชุดนั้น และทางที่ดีที่สุดที่จะช่วยป้องกันสิ่งนี้ได้ คือ ควรมีการเขียน Test ประกบไว้ก่อนทำการ refactor ทุกครั้ง

การ Refactoring เป็นส่วนหนึ่งของการเขียนโปรแกรมในแต่ละวัน - Martin Fowler

Code Smells คืออะไร

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

โดยการจัดกลุ่มของ Code Smells ที่กล่าวถึงนั้น จะเน้นไปที่การพัฒนาในรูปแบบของ OOP เป็นหลัก แต่ก็สามารถเอามาปรับใช้ได้กับการเขียน Functional Programming เช่นกัน โดยจะแบ่งกลุ่มของ code smells ได้ดังนี้

Bloaters

Bloaters คือ กลุ่มของโค้ด วิธีการ และคลาสที่เพิ่มขึ้นจนมีขนาดที่ใหญ่มาก จนยากที่จะเข้าไปใช้งาน มีความซับซ้อนเยอะ โดยปกติแล้วโค๊ดลักษณะนี้ จะไม่ได้เกิดขึ้นมาในทันทีของการเขียนโค๊ดช่วงแรกๆ แต่มันจะสะสมเพิ่มเข้ามาเรื่อยๆ เมื่อเวลาผ่านไป ในขณะที่โปรแกรมมีการพัฒนา และโดยเฉพาะอย่างยิ่งเมื่อไม่มีใครพยายามกำจัด smells เหล่านี้

Object-Orientation Abusers

การนำเอาหลักงานของ Object-oriented programming มาใช้งานอย่างที่ไม่ถูกต้อง ก็เป็นอีกหนึ่งตัวที่ทำให้เกิด code smells ได้ด้วยเช่นกัน

Change Preventers

smells กลุ่มนี้ คือ หากคุณต้องการเปลี่ยนแปลงบางอย่างในที่ใดที่หนึ่งในโค้ดของคุณแล้ว ทำให้คุณต้องไปทำการเปลี่ยนแปลงโค๊ดหลายๆ ตัวในที่อื่นด้วย การพัฒนาโปรแกรมจึงมีความซับซ้อนและมีราคาแพงมากขึ้น และมักอาจเกิดขึ้นเมื่อโค้ดมีโครงสร้างที่ซับซ้อน มีการผูกกันมากเกินไป

Dispensables

Dispensable คือ โค้ดที่เป็นส่วนเกินหรือไม่จำเป็น ไม่มีประโยชน์ หรือไม่มีความสำคัญในการทำงานของโปรแกรม สามารถตัดออกไปได้ ซึ่งการไม่มีจะทำให้โค้ดสะอาดขึ้น มีประสิทธิภาพมากขึ้น และเข้าใจง่ายขึ้น

Couplers

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

ทั้งหมดนี้เป็นกลุ่มของ Code Smells ที่จะเกิดขึ้นได้ และเราจะไปลงรายละเอียดและวิธีแก้ไขกันในบทความ ถัดๆ ไป

ทำความเข้าใจ Refactoring เพื่อเตรียมจัดการกับ Code Smells

References