การใช้ Composition และ Aggregation ใน Python OOP

การโปรแกรมเชิงวัตถุ (Object-Oriented Programming - OOP) เป็นแนวคิดที่ช่วยให้เราสามารถแบ่งโปรแกรมออกเป็นองค์ประกอบเล็ก ๆ ที่เรียกว่า "ออบเจ็กต์" และจัดการกับพฤติกรรมและคุณสมบัติขององค์ประกอบเหล่านั้นได้อย่างมีระเบียบและยืดหยุ่น สองหลักการสำคัญที่มีบทบาทในการจัดการกับความสัมพันธ์ระหว่างออบเจ็กต์คือ Composition และ Aggregation ซึ่งเป็นวิธีการที่เราสามารถนำองค์ประกอบมาประกอบกันในโค้ด OOP ในภาษา Python ได้ โดยมีลักษณะแตกต่างกันดังนี้:
Composition:
Composition หมายถึงการสร้างวัตถุใหม่โดยนำออบเจ็กต์หนึ่งหรือมากกว่ามาประกอบกันเป็นส่วนย่อยของวัตถุใหม่ ออบเจ็กต์ที่ถูกสร้างขึ้นด้วย Composition มักมีความสัมพันธ์ที่เข้มแข็งกับออบเจ็กต์ย่อย ๆ ที่ประกอบเข้ามา หากออบเจ็กต์หลักถูกทำลาย ออบเจ็กต์ย่อยก็จะถูกทำลายไปด้วย
ตัวอย่างการใช้ Composition ใน Python:
class Engine:
def start(self):
print("Engine started")
class Car:
def __init__(self):
self.engine = Engine()
def start(self):
print("Car is starting...")
self.engine.start()
my_car = Car()
my_car.start()
ผลลัพธ์:

ในตัวอย่างนี้ เราใช้ Composition โดยการนำคลาส Engine
มาประกอบกับคลาส Car
ซึ่งทำให้คลาส Car
มีความสามารถในการเริ่มต้นเครื่องยนต์ด้วย เมื่อเราสร้างออบเจ็กต์ Car
คลาส Engine
ก็ถูกสร้างขึ้นพร้อมกับนั้น
Aggregation:
Aggregation หมายถึงการรวมรวมออบเจ็กต์หรือข้อมูลจากออบเจ็กต์หลาย ๆ ตัวมารวมกันในออบเจ็กต์หนึ่ง ออบเจ็กต์ที่ถูกสร้างขึ้นด้วย Aggregation มักมีความสัมพันธ์ที่เป็นแบบ "มี" (has-a) กับออบเจ็กต์ย่อย ๆ ที่รวมอยู่ แต่หากออบเจ็กต์หลักถูกทำลาย ออบเจ็กต์ย่อยยังคงอยู่
ตัวอย่างการใช้ Aggregation ใน Python:
class Student:
def __init__(self, student_id, name):
self.student_id = student_id
self.name = name
class Course:
def __init__(self, course_code, course_name):
self.course_code = course_code
self.course_name = course_name
self.students = []
def enroll_student(self, student):
self.students.append(student)
math_course = Course("MATH101", "Introduction to Math")
student1 = Student(1, "Alice")
student2 = Student(2, "Bob")
math_course.enroll_student(student1)
math_course.enroll_student(student2)
for student in math_course.students:
print(f"Student ID: {student.student_id}, Name: {student.name}")
print(f"Course Code: {math_course.course_code}, Course Name: {math_course.course_name}")
ผลลัพธ์:

ในตัวอย่างนี้ เราใช้ Aggregation โดยการนำคลาส Student
มาเก็บเป็นสมาชิกในคลาส Course
แทนการสร้างคลาสย่อยใหม่ คลาส Course
รวมข้อมูลของนักเรียนที่ลงทะเบียนในวิชานั้น ๆ โดยออบเจ็กต์ย่อย Student
ยังคงอยู่แม้ว่าออบเจ็กต์หลัก Course
จะถูกทำลายไป Composition และ Aggregation เป็นเครื่องมือสองอย่างที่ช่วยให้เราออกแบบและสร้างโค้ด OOP ใน Python ได้อย่างมีระเบียบและยืดหยุ่น ความเข้าใจในความแตกต่างระหว่างสองหลักการนี้จะช่วยให้เราเลือกใช้วิธีที่เหมาะสมกับสถานการณ์และความต้องการของโปรแกรมที่กำลังพัฒนา สามารถเรียนรู้เพิ่มเติมได้ที่บทเรียน สอน Python บทที่ 41 ภาษา Python แบบ OOP - Object-oriented