รู้จัก Composition over Inheritance หลักการออกแบบคลาสให้ยืดหยุ่น
Inheritance หรือการสืบทอดเป็นรูปแบบการออกแบบตามแนวทาง OOP ที่เราเห็นกันได้ทั่วไป หากแต่ไม่ใช่ทุกคลาสควรสืบทอดมาจากคลาสแม่เสมอ
เฟรมเวิร์กหลายตัวมักนิยมให้โปรแกรมเมอร์สร้าง model ด้วยการสืบทอดจากคลาสที่ทำหน้าที่เข้าถึงฐานข้อมูล เช่น เราต้องการสร้างหนังสือจำเป็นต้องสืบทอดจาก ActiveRecord::Base ใน Ruby on Rails
1class Book < ActiveRecord::Base2end
จากนั้นเราจึงเข้าถึงฐานข้อมูลที่นิยามการทำงานไว้ในคลาสของ ActiveRecord::Base ผ่าน Book ได้
1# ตัวอย่างการใช้งาน2# สร้าง book ขึ้นมาโดยมี title เป็น BabelCoder: The first book!3book = Book.create(title: 'BabelCoder: The first book!')4# อัพเดท title ก็ได้5book.update(title: 'Foo-Bar')6# เข้าถึงข้อมูลใน record นี้ก็ได้7book.title
แต่การออกแบบเช่นนี้จะพบว่าเรานำสองสิ่งที่ไม่เกี่ยวข้องกันมานิยามด้วยความหมายของการสืบทอด ActiveRecord::Base เป็นตัวกลางเข้าถึงฐานข้อมูลได้ หากเราสืบทอด Book จากมันนั่นแสดงว่า Book เป็นเช่นเดียวกับมันคือเป็นตัวกลางเข้าถึงฐานข้อมูล แท้ที่จริงแล้วไม่ใช่เพราะหนังสือย่อมเป็นหนังสือไม่ใช่การสืบค้นข้อมูล
ในบทความจะแสดงให้เห็นปัญหาต่าง ๆ ของการออกแบบที่ผิด และนำเสนอวิธีที่ดีกว่าด้วยหลักการของ Composition over Inheritance ครับ