Encapsulation and Abstraction
Last updated
Last updated
Assoc. Prof. Wiroon Sriborrirux, Founder of Advance Innovation Center (AIC) and Bangsaen Design House (BDH), Electrical Engineering Department, Faculty of Engineering, Burapha University
Encapsulation คือ การรวมข้อมูลและเมดธอดที่ดำเนินการกับข้อมูลนี้เข้าเป็นหน่วยเดียว โดยจะซ่อนข้อมูลไม่ให้เข้าถึงได้โดยตรง แต่จะอนุญาติให้เมดธอดภายใน class เดียวกันสามารถเข้าถึงข้อมูลนั้นได้ เพื่อป้องกันการเข้าถึงข้อมูลจากภายนอกและการนำไปใช้ในทางที่ผิด
อย่างที่ทราบกันว่า class ประกอบไปด้วยสมาชิกตัวแปรและเมดธอด ซึ่งข้อมูลภายใน class ถูกกำหนดขอบเขตการใช้งานเป็น public เพื่อให้สามารถเข้าถึงข้อมูลจากภายนอก class นั่นหมายความว่า object ในโปรแกรม สามารถเข้าถึงตัวแปรเพื่อเปลี่ยนแก้ไขข้อมูลได้โดยตรง ดังตัวอย่างต่อไปนี้
เพื่อป้องการเข้าถึงข้อมูลจากภายนอก class จึงใช้การกำหนดขอบเขตการเข้าถึงของข้อมูลเป็น private ทำให้ object อื่น ๆ ไม่สามารถเข้าถึงข้อมูลนั้นได้ วิธีนี้เรียกว่า การซ่อนข้อมูล แต่ข้อเสียของการกำหนดขอบเขตการเข้าถึงของข้อมูลเป็น private คือ ไม่สามารถนำข้อมูลออกมาแสดงผลหรือนำมาใช้งานได้ จึงต้องหาช่องทางอื่นในการเข้าถึงข้อมูลที่สามารถควบคุมความถูกต้องของข้อมูลนั้นได้ คือ การเข้าถึงข้อมูลผ่านการเรียกใช้เมธอด ดังตัวอย่างต่อไปนี้
จากตัวอย่างจะเห็นได้ว่าตัวแปร salary เป็นตัวแปรที่ถูกซ่อนด้วยการกำหนดขอบเขตการใช้งานเป็น private ทำให้ไม่สามารถเรียกใช้จากภายนอก class แต่ตัวแปรนี้สามารถเข้าถึงได้จากเมดธอด getSalary() และ setSalary() ที่มีอยู่ภายใน class เท่านั้น โดยที่เมดธอด getSalary() จะรับพารามิเตอร์ (parameter) ตัวเลขเข้ามาพิจารณาในเงื่อนไข หากเงื่อนไขเป็นจริง จะทำการเก็บค่านั้นลงในตัวแปร salary แต่ถ้าเงื่อนไขเป็นเท็จ จะเก็บค่า 0 ลงใน ตัวแปร salary แทนค่าที่รับมา ส่วนเมดธอด getSalary() จะทำหน้าที่ในการนำค่าที่ถูกเก็บไว้ในตัวแปร salary มาแสดงผล
คำถาม ทำไมการประกาศเมดธอด getSalary() ถึงใช้ int แทนการใช้ void ?
คำตอบ void คือ การประกาศฟังก์ชันที่ไม่มีการส่งค่าคืน
int คือ การประกาศฟังก์ชันที่ส่งค่าคืนเป็นตัวเลข
แหล่งอ้างอิง :: https://www.w3schools.com/cpp/cpp_functions.asp
การให้ข้อมูลที่จำเป็นหรือข้อมูลที่ต้องการให้รู้แก่ภายนอก class โดนใช้หลักแนวคิดจาก Encapsulation แต่จะแตกต่างกันที่ Encapsulation จะซ่อนข้อมูลหรือตัวแปรไม่ให้เข้าถึงได้โดยตรง ส่วน Abstraction จะซ่อนกระบวนการทำงานหรือเมดธอดที่สำคัญบางส่วนไม่ให้เข้าถึงได้โดยตรง หมายความว่า ผู้ใช้จะสามารถเรียกใช้ได้เฉพาะเมดธอดที่ถูกกำหนดเป็น public ทั้งนี้ Abstraction มีการใช้งานอยู่ 2 แบบ คือ
ตัวอย่างเช่น การเขียนโปรแกรมคำนวณรายได้พนักงานของบริษัทแห่งหนึ่ง ผู้ใช้สามารถเรียกใช้ได้แค่เมดธอด display() ที่ใช้ในการแสดงผลเท่านั้น เนื่องจากเมดธอดที่ใช้ในการคำนวณรายได้เป็นส่วนที่ไม่ได้การให้ถูกเข้าถึง
ตัวอย่างเช่น การเรียกใช้งานฟังก์ชัน pow () ที่มีอยู่ใน math.h เมื่อผู้ใช้ต้องการคำนวณเลขยกกำลัง ผู้ใช้สามารถเรียกฟังก์ชัน pow() ที่มีอยู่ใน math.h และส่งตัวเลขเป็นอาร์กิวเมนต์ ฟังก์ชันจะทำการคำนวณผลลัพธ์และส่งผลลัพธ์ออกมาโดยที่ผู้ใช้ไม่ทราบอัลกอริทึมการคำนวณกำลังของตัวเลขภายในฟังก์ชัน
ความเหมือนระหว่างการใช้งานทั้ง 2 แบบ คือ การให้ข้อมูลที่จำเป็นแก่ภายนอก class ให้รับรู้ว่ามีเมดธอดอะไรที่ควรรู้และสามารถเรียกใช้ได้บ้าง
ความแตกต่างระหว่างการใช้งานทั้ง 2 แบบ คือ
Abstraction โดยใช้ Class -> ต้องประกาศ class เพื่อเรียกใช้เมดธอดภายใน class นั้น
Abstraction โดยใช้ไฟล์ Header -> ไม่จำเป็นต้องประกาศ class สามารถเรียกใช้ฟังก์ชันที่มีอยู่ในไฟล์ Header
แหล่งที่มาเพิ่มเติม