วันพฤหัสบดีที่ 2 กรกฎาคม พ.ศ. 2552

Bad Smells in Code

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

ไม่มีความคิดเห็น:

แสดงความคิดเห็น