6.1 แนวคิดการซ่อนรายละเอียดเชิงลึก (Abstraction)
6.1 แนวคิดการซ่อนรายละเอียดเชิงลึก (Abstraction)
Abstraction หรือแนวคิดการซ่อนรายละเอียดเชิงลึกเป็นหลักการสำคัญของการเขียนโปรแกรมเชิงวัตถุ (Object-Oriented Programming หรือ OOP) ที่เน้นการซ่อนรายละเอียดที่ไม่จำเป็นในการใช้งานของวัตถุ (Object) หรือคลาส (Class) โดยให้ผู้ใช้โฟกัสเฉพาะการใช้งานที่สำคัญและจำเป็น โดยไม่ต้องรู้หรือเข้าใจรายละเอียดการทำงานเชิงลึกภายในระบบ
Abstraction มุ่งเน้นการทำให้โค้ดมีโครงสร้างที่ชัดเจน ใช้งานง่าย และเข้าใจได้ง่ายขึ้น โดยแยกสิ่งที่เป็นรายละเอียดเฉพาะออกจากสิ่งที่เป็นสาระสำคัญ (Essentials) ซึ่งทำให้โค้ดมีความยืดหยุ่น และลดความซับซ้อนในการทำงานร่วมกันระหว่างคลาสต่าง ๆ ในโปรแกรม
ตัวอย่างเช่น
ในชีวิตประจำวัน เราอาจใช้โทรศัพท์เพื่อโทรออก รับสาย หรือส่งข้อความ แต่เราไม่จำเป็นต้องรู้ว่ามีวงจรไฟฟ้าอะไรภายใน หรือการทำงานของระบบต่าง ๆ เป็นอย่างไร เพียงแต่ใช้งานผ่านอินเทอร์เฟซหรือปุ่มบนหน้าจอที่เราเข้าถึงได้
ใน OOP ก็เช่นกัน เราสร้างเมธอดและคุณสมบัติในคลาสเพื่อให้ผู้ใช้สามารถโต้ตอบได้ โดยไม่ต้องเข้าใจการทำงานภายในของคลาสนั้น ซึ่งทำให้โค้ดมีโครงสร้างที่ชัดเจน ง่ายต่อการใช้งาน และไม่ซับซ้อน
ในโปรแกรม Abstraction สามารถทำได้โดยใช้:
คลาสนามธรรม (Abstract Class): คลาสที่มีการกำหนดเมธอด (Method) แบบนามธรรม ซึ่งเป็นเมธอดที่ไม่มีการระบุการทำงานชัดเจน แต่จะกำหนดให้คลาสที่สืบทอดต้องนำไปใช้ตามโครงสร้างที่กำหนด
อินเทอร์เฟซ (Interface): เป็นโครงสร้างที่กำหนดเมธอดที่ต้องมี แต่ไม่มีการระบุรายละเอียดการทำงาน ซึ่งแต่ละคลาสสามารถนำอินเทอร์เฟซไปใช้งานตามโครงสร้างที่กำหนดได้ (แม้ว่า Python จะไม่มี interface โดยตรง แต่สามารถเลียนแบบได้ด้วยการใช้คลาสนามธรรม)
ตัวอย่าง
การใช้คลาสนามธรรมเพื่อสร้าง Abstraction:
from abc import ABC, abstractmethod
class Shape(ABC): # คลาสนามธรรม
@abstractmethod
def area(self):
pass
class Circle(Shape):
def __init__(self, radius):
self.radius = radius
def area(self):
return 3.1415 * (self.radius ** 2)
class Rectangle(Shape):
def __init__(self, width, height):
self.width = width
self.height = height
def area(self):
return self.width * self.height
# ใช้งานคลาส
circle = Circle(5)
rectangle = Rectangle(4, 6)
print("พื้นที่ของวงกลม:", circle.area()) # ผลลัพธ์คือ 78.5375
print("พื้นที่ของสี่เหลี่ยม:", rectangle.area()) # ผลลัพธ์คือ 24
คลาส Vehicle: เป็นคลาส abstract ที่มีเมธอด start() ซึ่งเป็นเมธอด abstract โดยไม่กำหนดรายละเอียดการทำงาน ขณะที่เมธอด stop() มีการกำหนดรายละเอียดการทำงานแล้ว
คลาส Car และ Bike: สืบทอดจาก Vehicle และแต่ละคลาสต้อง Override เมธอด start() ให้ทำงานตามความต้องการ
การใช้งาน: ใน main() เมธอด เราสามารถเรียกใช้เมธอด start() และ stop() ได้โดยไม่จำเป็นต้องรู้ว่าภายในทำงานอย่างไร เพราะโครงสร้างหลักถูกกำหนดในคลาส Vehicle แล้ว
ลดความซับซ้อน: ช่วยให้ผู้ใช้งานสามารถใช้โปรแกรมได้โดยไม่จำเป็นต้องเข้าใจรายละเอียดการทำงานที่ซับซ้อนภายใน
เพิ่มความปลอดภัย: ซ่อนข้อมูลที่ไม่จำเป็นสำหรับผู้ใช้ และลดโอกาสในการเปลี่ยนแปลงหรือเข้าถึงข้อมูลที่สำคัญ
ทำให้โค้ดสามารถบำรุงรักษาและขยายตัวได้ง่ายขึ้น: การกำหนดโครงสร้างพื้นฐานที่ชัดเจนทำให้สามารถขยายหรือเปลี่ยนแปลงโปรแกรมได้ง่าย