3.1 การปกป้องข้อมูลด้วย Encapsulation
3.1 การปกป้องข้อมูลด้วย Encapsulation
Encapsulation (การห่อหุ้มข้อมูล) เป็นหนึ่งในหลักการสำคัญของการเขียนโปรแกรมเชิงวัตถุ (OOP) ที่ช่วยให้สามารถปกป้องข้อมูลและการเข้าถึงข้อมูลในอ็อบเจกต์ (Object) ได้อย่างปลอดภัย โดยการซ่อนรายละเอียดของการทำงานภายในคลาสและให้ผู้ใช้งานสามารถเข้าถึงข้อมูลผ่านวิธีการที่กำหนดเท่านั้น
หลักการของ Encapsulation มีจุดมุ่งหมายเพื่อ
ปกป้องข้อมูล (Protecting the data): ข้อมูลของอ็อบเจกต์จะไม่ถูกเข้าถึงโดยตรงจากภายนอกคลาส
ควบคุมการเข้าถึงข้อมูล (Controlling access): ข้อมูลจะถูกเข้าถึงหรือปรับเปลี่ยนได้เฉพาะผ่านเมธอด (Methods) ที่ได้รับการกำหนดไว้
การซ่อนรายละเอียด (Hiding implementation details): การซ่อนรายละเอียดของการทำงานภายในคลาสเพื่อให้ผู้ใช้งานสามารถใช้งานได้โดยไม่ต้องรู้รายละเอียดภายใน
การใช้ตัวแปรในรูปแบบ private หรือ protected: การตั้งค่าตัวแปรภายในคลาสเป็น private จะทำให้ไม่สามารถเข้าถึงได้โดยตรงจากภายนอก
การใช้เมธอด getter และ setter: การใช้เมธอดเหล่านี้เพื่อให้ผู้ใช้งานสามารถเข้าถึงหรือปรับเปลี่ยนค่าของตัวแปรได้ แต่ผ่านการควบคุมของเมธอดที่เราออกแบบมา
ตัวอย่าง
class Person:
# การตั้งค่าตัวแปรภายในคลาสเป็น private
def __init__(self, name, age):
self.__name = name # ตัวแปรชื่อเป็น private
self.__age = age # ตัวแปรอายุเป็น private
# การใช้ getter และ setter เพื่อเข้าถึงและแก้ไขข้อมูล
def get_name(self):
return self.__name
def set_name(self, name):
if len(name) > 0:
self.__name = name
else:
print("Name cannot be empty!")
def get_age(self):
return self.__age
def set_age(self, age):
if age > 0:
self.__age = age
else:
print("Age must be greater than 0!")
# การสร้างอินสแตนซ์ของคลาส
person1 = Person("John", 25)
# การเข้าถึงข้อมูลผ่าน getter
print(person1.get_name()) # Output: John
print(person1.get_age()) # Output: 25
# การเปลี่ยนแปลงข้อมูลผ่าน setter
person1.set_name("Mike")
person1.set_age(30)
print(person1.get_name()) # Output: Mike
print(person1.get_age()) # Output: 30
# การพยายามเปลี่ยนข้อมูลที่ไม่ถูกต้อง
person1.set_name("") # Output: Name cannot be empty!
person1.set_age(-5) # Output: Age must be greater than 0!
ตัวแปร __name และ __age ถูกตั้งเป็น private (ด้วยการใช้ __ หน้าชื่อตัวแปร) เพื่อไม่ให้สามารถเข้าถึงได้จากภายนอกคลาส
Getter และ Setter เมธอดถูกใช้เพื่อให้ผู้ใช้งานสามารถเข้าถึงหรือแก้ไขค่าของตัวแปรเหล่านี้ได้อย่างปลอดภัย
เรากำหนดเงื่อนไขใน setter เพื่อให้แน่ใจว่าค่าที่รับเข้ามาถูกต้อง (เช่น ชื่อไม่ว่างเปล่าและอายุเป็นค่าบวก)
ควบคุมการเข้าถึงข้อมูล: เราสามารถควบคุมว่าใครสามารถเข้าถึงและปรับเปลี่ยนข้อมูลได้บ้าง
การปกป้องข้อมูล: ข้อมูลที่เป็น private จะไม่สามารถถูกเข้าถึงหรือปรับเปลี่ยนจากภายนอกคลาสโดยตรง
ปรับปรุงความปลอดภัย: การใช้ getter และ setter สามารถเพิ่มการตรวจสอบค่าที่เข้าไปในตัวแปร เพื่อป้องกันค่าผิดปกติที่อาจทำให้โปรแกรมทำงานผิดพลาด
การบำรุงรักษาโปรแกรมง่ายขึ้น: เนื่องจากการซ่อนรายละเอียดการทำงานภายในคลาส ทำให้การเปลี่ยนแปลงภายในคลาสไม่ส่งผลกระทบกับผู้ใช้ภายนอก