Code Smell เมื่อโค้ดส่งกลิ่นได้… มารู้จักกลิ่นแปลกๆ ในโค้ดที่ Dev ควรรู้
“Code Smell” หรือกลิ่นแปลกๆ ในโค้ดเป็นคำที่ใครหลายคน โดยเฉพาะ Dev มือใหม่อาจจะสงสัยว่า “โค้ดที่เราเขียนมันมีกลิ่นได้ด้วยเหรอ?” เอาจริงมันไม่ได้หมายถึงการตามเข้าไปดมกลิ่นของโค้ดจริงๆ หรอก เพียงแต่เป็นคำเชิงเปรียบเทียบในวิธีการเขียนซอฟต์แวร์ให้เราระวังหรือเน้นความสนใจไปยังโค้ดส่วนที่… โดยทั่วไปก็ยังทำงานได้นั่นแหละ แต่มันมีอะไรแปลกๆ ทะแม่งๆ เหมือนมีกลิ่นตุๆ เราเลยจำเป็นต้องสนใจโค้ดส่วนนี้ เพื่อป้องกันปัญหาที่อาจเกิดตามมาหรือยากต่อการทำงานต่อในอนาคต
ทำความเข้าใจเกี่ยวกับ Code Smell
อย่างที่เกริ่นไว้ข้างต้น คำว่า Code Smell นั้นไม่ได้หมายถึงกลิ่นเหม็นที่มีจริงๆ แต่คำนี้ถูกนำมาใช้ครั้งแรกโดยคุณ Kent Beck วิศวกรซอฟต์แวร์ชาวอเมริกันและผู้บุกเบิกกระบวนการเขียนโปรแกรมแบบ XP (Extreme Programming) ที่พยายามอธิบายถึงปัญหาของซอฟต์แวร์ว่ามันไม่ได้มีแค่การทำงานผิดพลาด หรือที่เราเรียกกันติดปากว่าบั๊ก (Bug) แต่ยังมีลักษณะของโค้ดที่อาจจะกลายเป็นปัญหาในอนาคต หรือเป็นจุดอ่อนที่มีความเสี่ยง แล้วในที่สุดก็กลายเป็นมรดกที่โหดร้ายต่อ Dev ที่จะทำงานต่อจากเรา จนทำให้ต้องร้อง อห (โอ้โห) และโหดร้ายกว่าสำหรับคนที่ต้องดูแลรักษามันในยามที่มันงอแงขึ้นมา (ซึ่งก็อาจเป็นตัวเราเองแหละ)
และนี่คือตัวอย่าง Code Smell ที่ได้กลิ่นกันบ่อยๆ
1. Duplicate Code
นี่อาจเป็น Code Smell ที่พบเห็นได้ง่ายและบ่อยที่สุดแล้วล่ะ มันก็คือการไปก็อปปี้แล้ววาง (Duplicate) โค้ดเดียวกันใน Function, Method หรือ Class อื่นๆ มากกว่าหนึ่งที่ ถ้าเราเจอโค้ดที่มีกลิ่นแบบนี้ เวลาเรานั่งไล่อ่านโค้ดก็จะเหมือนมีอาการเดจาวูที่จะเจอโค้ดซ้ำๆ อยู่เรื่อยๆ นี่ก็เป็นฝันร้ายของการทำงานต่อจากของเดิม เพราะเมื่อเราต้องการแก้ไข เราก็ต้องตามไปเปลี่ยนในทุกที่ที่มีเหมือนกัน… (แต่เอ๊ะ… หรือจริงๆ ตรงนั้นตรงนู้นมันไม่ต้องไปแก้นะ? เอาแล้วสิ แบบนี้ก็ว้าวุ่นเลย)
2. Long Method หรือ Long Function
นี่เป็นอีกกลิ่นคลาสสิคที่พบเห็นได้บ่อยๆ หลายๆ ครั้งเราเขียน Function หรือ Method ที่ซับซ้อนหรือทำหลายหน้าที่ครอบจักรวาลมาก จนมันยืดยาวเป็นร้อยๆ บรรทัด ทำให้อ่านยาก แก้ไขยาก ซับซ้อน เอาไปใช้ซ้ำไม่ได้ ผิดหลัก Cohesion (แล้วทำให้เกิด Duplicate Code ในที่สุดนั่นเอง)
3. Large Class
เช่นเดียวกันกับข้อก่อนหน้านี้ การสร้าง Class ที่พยายามทำสิ่งต่างๆ แบบสากกะเบือยันเรือรบ ทุกอย่างจบใน Class เดียวนั้นอาจกลายเป็นปัญหาได้ เพราะในที่สุดแล้ว Class ที่ใหญ่เกินความจำเป็นจะทำความเข้าใจและพัฒนาต่อได้ยาก
4. Dead Code
หมายถึงโค้ดที่เคยใช้งาน ไม่ว่าจะใช้งานจริงหรือเขียนไว้เพื่อเทส และในวันนึงโค้ดชุดนั้นก็ไม่มีความจำเป็นอีกต่อไป แต่เราดันเกิดเสียดายขึ้นมา เลยไม่ลบออก ให้มันอยู่ตรงนั้นแบบงงๆ และนั่นก็เป็นจุดเริ่มต้นของความสับสนและซับซ้อนที่เกิดขึ้นตามมาอีกมากมาย
5. Comments Overload
คอมเมนต์ในโค้ดที่มากเกินไปเป็นอีกกลิ่นที่แสดงให้เห็นว่าโค้ดนั้นไม่สามารถอธิบายได้ในตัวของมันเอง จึงต้องเขียนคอมเมนต์แทรกลงไป เพื่ออธิบายการทำงานให้กับคนอื่นหรือตัวเราเองที่ต้องกลับมาทำต่อทีหลัง จริงอยู่ว่าการเขียนคอมเมนต์มีข้อดีในการอธิบายรายละเอียดต่างๆ ให้เป็นภาษามนุษย์ อ่านแล้วจะได้เข้าใจง่ายๆ แต่ถ้ามากเกินไป นั่นก็แสดงว่าโค้ดนั้นซับซ้อนเกินไปที่จะอ่าน Logic จากโค้ดนั่นเอง
6. Tight Coupling
เมื่อเราสร้าง Class หรือ Module ที่ต้องพึ่งพาอาศัยกันสูงมากๆ การปรับเปลี่ยนหรือแก้ไข Class หรือ Module รวมถึงการทดสอบแยกกันกลายเป็นเรื่องยาก เพราะมันต้องแก้ไขและทดสอบไปด้วยกันหมด นั่นทำให้เกิดความซับซ้อนและยากต่อการแก้ไข รวมถึงจะก่อให้เกิด Code Smell อื่นๆ ตามมาในที่สุด
แล้วทำยังไงให้โค้ดของเราไม่มีกลิ่น?
มีหลากหลายวิธีที่จะทำให้เราเขียนโค้ดโดยลด Code Smell ตั้งแต่การออกแบบ ตอนเขียนโค้ด ตอน Review ตอน Refactor ตอนว่างๆ ที่เรานั่งทำ NFR กัน แต่หลักๆ สิ่งที่ป้องกันการทำให้เกิด Code Smell ได้คือ…
- ใช้ Design Pattern เข้ามาช่วย
- SOLID Principles ช่วยได้
- TDD ก็ช่วยได้ อย่างน้อยที่สุดขอให้มี Unit Test ไว้หน่อย
- กระบวนการ Code Review ก็ช่วยได้
- Code Scan ด้วยเครื่องมือ เช่น SonarQube ก็ช่วยได้ พยายามทำไป Fix Code Smell ไปด้วย
- ใช้ประสบการณ์ที่คุณมี
- ใช้แต้มบุญของคุณที่จะทำให้คุณแคล้วคลาดจาก Legacy Code/System ทั้งปวง
“a code smell is a surface indication that usually corresponds to a deeper problem in the system”.
“smells are certain structures in the code that indicate violation of fundamental design principles and negatively impact design quality.”
— Martin Fowler
ขอให้ทุกคนโชคดี สาธุ
สำหรับใครที่ชื่นชอบบทความนี้ อย่าลืมกดติดตาม Medium: KBTG Life เรามีสาระความรู้และเรื่องราวดีๆ จากชาว KBTG พร้อมเสิร์ฟให้ที่นี่ที่แรก