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

Python
Python
ประเภทโค้ด: Python

การโปรแกรมเชิงวัตถุ (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  


อ้างอิง
Object-Oriented Programming in Python (OOP): Tutorial ,[ออนไลน์], เข้าถึงได้จาก https://www.datacamp.com/tutorial/python-oop-tutorial
Python OOPS – Aggregation and Composition ,[ออนไลน์], เข้าถึงได้จาก https://www.geeksforgeeks.org/python-oops-aggregation-and-composition/
Python OOP Tutorials ,[ออนไลน์], เข้าถึงได้จาก https://morioh.com/a/59059863ad72/python-oop-tutorials-or-composition-and-aggregation
กระทู้ล่าสุดจากเว็บบอร์ด
หัวข้อกระทู้
ตอบ
เปิดดู
ล่าสุด
ครบรอบ 15 ปี User mindphp ในเว็บนี้เราเดินทางมาไกล มากๆ
โดย mindphp ส 23 ก.ย. 2023 8:56 pm บอร์ด MindPHP News & Feedback
0
11
ส 23 ก.ย. 2023 8:56 pm โดย mindphp View Topic ครบรอบ 15 ปี User mindphp ในเว็บนี้เราเดินทางมาไกล มากๆ
คำสั่ง SQL สำหรับ DBA database administrator หรือ sysadmin ไว้หาตารางที่ ไม่มี index ในฐานข้อมูล MySQL mariaDB
โดย mindphp ส 23 ก.ย. 2023 6:45 pm บอร์ด SQL Knowledge
1
53
ส 23 ก.ย. 2023 7:02 pm โดย mindphp View Topic คำสั่ง SQL สำหรับ DBA database administrator หรือ sysadmin ไว้หาตารางที่ ไม่มี index ในฐานข้อมูล MySQL mariaDB
เคล็ดลับกระดูกติดเร็ว
โดย SexyKitty ส 23 ก.ย. 2023 4:38 pm บอร์ด พูดคุยเรื่องทั่วไป จับฉ่าย
0
16
ส 23 ก.ย. 2023 4:38 pm โดย SexyKitty View Topic เคล็ดลับกระดูกติดเร็ว
วิธีทำชีสเค้กญี่ปุ่น
โดย SexyKitty ส 23 ก.ย. 2023 2:03 am บอร์ด พูดคุยเรื่องทั่วไป จับฉ่าย
0
24
ส 23 ก.ย. 2023 2:03 am โดย SexyKitty View Topic วิธีทำชีสเค้กญี่ปุ่น
ขนมปังบาแกตต์เมนูคุ้มค่าเช่าที่ในห้าง
โดย admeadme ศ 22 ก.ย. 2023 3:43 pm บอร์ด พูดคุยเรื่องทั่วไป จับฉ่าย
0
16
ศ 22 ก.ย. 2023 3:43 pm โดย admeadme View Topic ขนมปังบาแกตต์เมนูคุ้มค่าเช่าที่ในห้าง
G - ตั้งค่า config ฝั่งหลังบ้านและ phpBB ของระบบ Shop
โดย eange08 ศ 22 ก.ย. 2023 2:51 pm บอร์ด ThaiVI (Main)
7
45
ส 23 ก.ย. 2023 8:49 pm โดย mindphp View Topic G - ตั้งค่า config ฝั่งหลังบ้านและ phpBB ของระบบ Shop
ชุดเครื่องนอน 3.5 ฟุต ประกอบด้วยอะไรบ้าง
โดย totheworld ศ 22 ก.ย. 2023 1:21 pm บอร์ด พูดคุยเรื่องทั่วไป จับฉ่าย
0
15
ศ 22 ก.ย. 2023 1:21 pm โดย totheworld View Topic ชุดเครื่องนอน 3.5 ฟุต ประกอบด้วยอะไรบ้าง
AI and SEO
โดย God Of Backlinks ศ 22 ก.ย. 2023 10:27 am บอร์ด Software Review
0
18
ศ 22 ก.ย. 2023 10:27 am โดย God Of Backlinks View Topic AI and SEO