skip to main |
skip to sidebar
Bad Smells in Code
- ความหมาย: มีผู้ให้ความหมายเกี่ยวกับคำนี้ไว้ ทั้งใน Wikipedia , c2 , ในที่นี้ขอให้ความหมายว่า หมายถึง ข้อตำหนิเกี่ยวกับบางส่วนของ Source Code ซึ่งอาจก่อให้เกิดปัญหาในการบำรุงรักษาโปรแกรมต่อไปได้
- แยกประเภท: มีการแบ่ง Bad Smells in Code ไว้ 22 แบบ ด้วยกัน ดังนี้:- (ที่มา: Summary of Bad Smell , Martin Fowler's Book)
- Duplicate Code มีโครงสร้าง code ที่เหมือนกันมากกว่า 1 ตำแหน่ง เช่น มี expression ที่เหมือนกัน อยู่ใน 2 methods ของ class เดียวกัน, มี expression ที่เหมือนกัน อยู่ใน 2 sibling subclasses
- Long Method มี คำสั่งโปรแกรม, parameters และ ตัวแปรชั่วคราว จำนวนมากใน method ทำให้ method นั้นมีขนาดใหญ่
- Large Class มี instance variables จำนวนมากใน class เพราะ class นั้นพยายามทำงานหลายอย่างมาก
- Long Parameter List มีการส่งค่าผ่าน parameter โดยใช้ parameter จำนวนมาก ในการส่งผ่านแต่ละครั้ง ทำให้ทำความเข้าใจ code นั้นยาก และมีปัญหาหากต้องทำการเปลี่ยนแปลงใดๆ เกี่ยวกับ parameter เหล่านั้น อยู่บ่อย ๆ
- Divergent Change มีการเปลี่ยนแปลงที่แตกต่างกันร่วมกัน ด้วยเหตุผลที่่ต่างกัน ใน class เดียวกัน เช่น เปลี่ยนแปลง 3 methods ร่วมกันทุกครั้งที่มีการเพิ่ม database ใหม่ , เปลี่ยนแปลง 4 methods ร่วมกันทุกครั้งที่มีการเพิ่มเครื่องมือทางการเงินใหม่ เป็นต้น
- Shotgun Surgery คล้าย Divergent Change แต่ตรงข้ามกัน นั่นคือ ทุกครั้งที่ต้องการเปลี่ยนแปลงสิ่งใดสิ่งหนึ่ง ต้องการทำการเปลี่ยนแปลงเล็กน้อย ใน หลาย ๆ class ที่แตกต่างกัน ทำให้เกิดปัญหาคือยากในการค้นหาตำแหน่งที่ต้องทำการเปลี่ยนแปลง และมีโอกาสเกิดความผิดพลาดได้ง่าย
- Feature Envy มีบาง method สนใจใช้ข้อมูลใน class อื่นมากกว่าข้อมูลใน class ตัวเอง
- Data Clumps มีกลุ่มของข้อมูลซึ่งใช้งานร่วมกันเสมอ เช่น กลุ่ม Fields ใน classes, parameters ใน หลาย ๆ method signatures เป็นต้น แต่ไม่ได้ประกาศรวมไว้เป็น object
- Primitive Obsession การที่ยังคงใช้ primitive data type ซึ่งทำให้เกิด overhead ทั้งที่สามารถสร้าง record type ใหม่ได้
- Switch Statements การที่ยังคงใช้่คำสั่ง Switch (or case) ใน object-oriented code ซึ่งอาจทำให้เกิดคำสั่งที่ซ้ำซ้อนกันได้ ทั้งที่สามารถใช้ polymorphism แทนได้
- Parallel Inheritance Hierarchies เป็นกรณีพิเศษของ Shotgun Surgery คือ ทุกครั้งที่สร้าง subclass ของ class ใด class หนึ่ง subclass ใหม่นั้นจะเป็น subclass ของอีก class หนึ่งด้วยเสมอ ทำให้มีปัญหาในการตั้งชื่อ subclass นี้ เพราะโดยทั่วไปใช้ชื่อ superclass เป็น prefix ของชื่อ subclass
- Lazy Class มีบาง class ไม่คุ้มค่าในการบำรุงรักษา (maintain) และทำความเข้าใจ (understand) เพราะสร้างมาแล้ว ไม่ค่อยได้ถูกใช้งาน จึงควรกำจัดเสีย
- Speculative Generality มีการเขียน code แบบที่เผื่อการทำงานไว้กว้าง ๆ ทำให้ทำความเข้าใจ (understand) และบำรุงรักษา (maintain) ยาก เช่น สร้างให้เป็น abstract classes แต่ในความเป็นจริงไม่ได้ใช้คุณสมบัตินี้ หรือใช้น้อยมาก , ส่งค่าผ่าน parameters โดยไม่จำเป็น, มี method หรือ class ที่ใช้งานเฉพาะตอนทำ test case เท่านั้น เป็นต้น
- Temporary Field การสร้างที่เก็บข้อมูลชั่วคราวไว้เพื่อกำหนดค่าและเรียกใช้งานเฉพาะ code ใด ๆ ทำให้ code นั้นทำความเข้าใจยากเพราะ object จำเป็นต้องใช้ทุกตัวแปร ตัวอย่าง Bad Smells นี้เช่น ใน algorithm ที่ซับซ้อน และจำเป็นต้องใช้ตัวแปรหลายตัว ดังนั้นเพื่อลดการส่งผ่าน parameters จำนวนมากจึงใช้ที่เก็บข้อมูลชั่วคราวแทนเป็นต้น ควรแก้ไขโดยแยก code และตัวแปรชั่วคราวทั้งหมดไปสร้างเป็น class ใหม่ ซึ่งจะเป็นผลดีและสามารถลดคำสั่งตรวจสอบเงื่อนไขเพราะใช้ Introduce Null Object แทนได้
- Message Chains การที่เมื่อ client เรียกหา object ใด ๆ ปรากฎว่าต้องเรียกผ่าน object อื่น และ object อื่นนั้น ก็เรียกต่อไปยัง object อื่น ๆ ต่ออีกหลายทอดกว่าจะถึง object ที่ต้องการ เรียกว่าเรียกต่อกันเป็นลูกโซ่
- Middle Man คือ code จากคุณสมบัติ encapsulation และ delegation ของการเขียนโปรแกรมแบบ object ทำให้มีบาง code เขียนออกมาในลักษณะ ที่เสมือนมีผู้บัญชางาน (director) คอยรับ request จาก client แล้วจัดลง diary เพื่อหาคำตอบส่งคืนให้ภายหลัง ทำให้การทำงานไม่คล่องตัว จึงควรกำจัดตัวกลางหรือผู้บัญชางานนี้ออกไป แล้วติดต่อ object โดยตรงจะดีกว่า
- Inappropriate Intimacy การที่มีบาง classes ใช้งานส่วน private ของ class อื่นมากเกินไป จึงควรแก้ไขโดยอาจแยกส่วน private นั้นเป็น method และ field ใหม่ หรือสร้างเป็น class ใหม่ เป็นต้น
- Alternative Classes with Different Interfaces มีบาง methods ทำงานเหมือนกัน แต่มีส่วน signatures ที่ต่างกัน จึงแก้ไขโดยใช้ชื่อ methods ที่ต่างกัน ซึ่งเท่านี้ยังถือว่าไม่เพียงพอที่จะทำให้ class นั้นทำงานได้ดี จึงควรแก้ไขต่อไปเพื่อให้ใช้ protocols เหมือนกัน ถ้าทำไม่ได้ก็อาจแยกเป็น superclass ใหม่แทนก็ได้
- Incomplete Library Class ปัญหาการแก้ไข library class เพื่อให้ทำบางสิ่งบางอย่าง อาจเพราะรูปแบบที่ไม่ดี หรือความเป็นไปไม่ได้ ที่จะทำอย่างนั้นได้ จึงควรแก้ไขโดยอาจแยก code นั้นออกมาเป็น method ใหม่เป็นต้น
- Data Class มีบาง classes มีเฉพาะ fields, getting และ setting methods สำหรับ fields เหล่านั้นเท่านั้น
- Refused Bequest การมี hierarchy ที่ไม่ดี ทำให้ subclasses ได้รับการถ่ายทอด methods และ data มากเกินกว่าที่จำเป็นต้องใช้
- Comments การมี comments มากเกินกว่าที่จำเป็นต้องมี
ไม่มีความคิดเห็น:
แสดงความคิดเห็น