4 เสาหลักของ Object-Oriented Programming
วันก่อนไปคุยในงาน HackerX มา แล้วมีบริษัทหนึ่งถามให้อธิบายว่า OOP (Object-Oriented Programming) หรือ การเขียนโปรแกรมเชิงวัตถุคืออะไร? ผมก็เลยอยากมาเขียนทบทวนความรู้เรื่องนี้กันหน่อย และก็จะขยายความ 4 หลักการของ OOP ว่ามีรายละเอียดอย่างไร?
OOP คืออะไร?
แปลตรงๆ ก็คือการเขียนโปรแกรมเชิงวัตถุ เป็นกระบวนทัศน์หรือรูปแบบหนึ่งของการเขียนโปรแกรม (จริงๆ แล้วมีรูปแบบอื่น อย่างเช่น procedural, functional และ symbolic) โดยจะมองทุกอย่างในโปรแกรมหรือแอพพลิเคชันเป็น “วัตถุ” ซึ่งก็เหมือนวัตถุในชีวิตจริงของเรา อย่างเช่น สุนัก, แมว, โทรทัศน์, จักรยาน , โต๊ะ หรือ เก้าอี้
วัตถุในชีวิตจริงจะสังเกตุว่า จะมี “สถานะ (state)” และ “พฤติกรรม (behavior)” อย่างเช่น สุนัก มีสถานะ (ชื่อ, สี, สายพันธุ์) และมีพฤติกรรม (เห่า, กระดิกหาง), จักรยาน มีสถานะ (เกียร์, ปันได, ความเร็ว) และมีพฤติกรรม (เปลี่ยนเกียร์, เปลี่ยนจังหว่ะบันได, เร่งความเร็ว) เป็นต้น
OOP ก็ใช้วิธีเลียนแบบวิธีคิดของวัตถุในชีวิตจริง โดยระบุ “สถานะ” และ “พฤติกรรม” สำหรับวัตถุของซอฟต์แวร์
โดยวัตถุ (Object) จะเก็บสถานะใน ฟิล์ด (field) (ตัวแปลในบางภาษา) และเปิดเผยพฤติกรรมผ่าน เมธอด (method) (ฟังก์ชันในบางภาษา) โดยที่ method จะดำเนินการกับสถานะภายในของ object นั้น และเป็นกลไกหลักในการสื่อสารระหว่าง object กับ object ซึ่งจะมีการซ้อนสถานะภายใน และการติดต่อกับ object ทั้งหมดจำเป็นต้องกระทำผ่าน method ของ object นั้น
ซึ่ง OOP จะมีหลักการที่เป็นเสาหลักอยู่ 4 ข้อ ดังนี้
Abstraction
เป็นหลักการนามธรรมของ object ซึ่งเป็นกระบวนการในการเอาส่วน concrete ของ class หรือส่วนที่มีการ implementation ของ object ออกมา โดยรักษาลักษณะร่วมกัน หรือคุณลักษณะให้กับ concreate object ต่างๆ ซึ่งจะเป็นการใช้หลักการอื่นๆ ของ OOP ในการทำให้เกิด abstaction โดยเฉพาะอย่างยิ่ง Polymorphism และในบางภาษาจะมี abstract/interface keyword มาให้เพื่อระบุ class ที่ต้องการให้มีคุณสมบัติ abstraction ตัวอย่างดังนี้
Encapsulation
เป็นหลักการการห่อหุ้มสถานะหรือข้อมูลของ object จากภายนอกให้ไม่สามารถเข้าถึงสถานะของ object ได้ ดั้งนั้นการเข้าถึงจะต้องกระทำผ่านทาง method เท่านั้น (เรียกว่า setter/getter) ซึ่งการซ้อนข้อมูลก็มีหลายระดับ private จำกัดการเข้าถึงอย่างสิ้นเชิง, protected จำกัดการเข้าถึงจากภายนอกแต่ class ลูกสามารถเข้าถึงได้ หรือ public ไม่จำกัดดารเข้าถึงเลยภายนอกสามารถเข้าถึงได้ เป็นต้น บางภาษาอาจจะมีมากกว่านี้ ตัวอย่างเช่น
Inheritance
เป็นหลักการสืบทอดคุณสมบัติของ object ซึ่ง class (subclass) ที่สืบทอดจาก class อื่น (superclass) จะได้รับสถานะและพฤติกรรมของ class นั้นทั้งหมด และยังสามารถเปลี่ยนพฤติกรรมของบาง method (overriding) ที่ได้สืบทอดมาได้ อีกทั้งสามารถขยายความสามารถเพิ่มเติมได้อีก ทำให้เราสามารถนำโค้ดที่มีอยู่แล้วมาใช้ใหม่ได้ (code reuse) ตัวอย่างเช่น
Polymorphism
เป็นหลักการพ้องรูปหรือการมีหลายรูปของ object คล้ายๆ กับหลักการของชีววิทยาที่สิ่งมีชีวิตสามารถมีหลายรูปแบบ หรือหลายสายพันธุ์ (เช่น มนุษย์ มี มองโกลลอยด์, คอเคซอยด์ หรือนิกรอยด์ เป็นตั้น ซึ่งทั้งหมดก็เป็น มนุษย์ เหมือนกัน) โดย subclass ของ class สามารถกำหนดพฤติกรรมที่เป็นเอกลักษณ์ของตนเองได้ และยังแชร์บางส่วนของฟังก์ชันการทำงานเดียวกันกับ superclass ตัวอย่างเช่น
ขอบคุณครับ 👨🏻💻