OOP หรือชื่อเต็มๆก็คือ Object Oriented Programming อ่านแปลคร่าวๆก็คือการเขียนโปรแกรมเชิงวัตถุ ซึ่งเป็นแนวคิดในการพัฒนาซอฟแวร์ที่และเป็นที่ยอมรับ เนื่องจากซอฟแวร์ที่ถูกพัฒนาและใช้กันอยู่นั้น นับวันมีแต่จะซับซ้อนมากยิ่งขึ้น ถ้าหากไม่จัดการกับโค้ดให้ดีพอก็อาจจะทำให้การพัฒนาล่าช้าหรือไม่สำเร็จได้ OOP จึงออกแบบมาให้โค้ดที่เราเขียนมีแบบแผนที่เหมาะสมพร้อมใช้ในการพัฒนาที่ซับซ้อนได้
อย่างที่บอกไปด้านบนว่า OOP นั้นเเป็นการเขียนโปรแกรมเชิงวัตถุ เราก็ต้องลองเทียบกับวัตถุในชีวิตจริงของเราดูอย่างเช่น นก ในที่นี้เราจะให้นกเป็นวัตถุ โดยสิ่งที่นกต้องมีก็คือ “คุณสมบัติ” เช่น สีเขียว, ปากยาว เป็นต้น และก็ต้องมี “พฤติกรรม” เช่น บิน, กินอาหาร เป็นต้น การเขียนโปรแกรมก็ต้องทำให้โค้ดของเรามีคุณสมบัติและพฤติกรรมเช่นเดียวกันกับนก แต่ว่าเพียงแค่นี้ก็ยังไม่นับว่าเป็น OOP เพราะว่า OOP ที่แท้จริงยังต้องมี 4 เสาหลักของ OOP อยู่ด้วยได้แก่ Encapsulation Abstraction Inheritance Polymorphism อย่าเพิ่งงงกับศัพท์พวกนี้ เดี๋ยวเราไปดูกันว่าแต่ละตัวนั้นคืออะไรบ้าง
1. Encapsulation การห่อหุ้มข้อมูล / การซ่อนข้อมูล
ห่ออะไร ? หุ้มยังไง ? อันนี้ก็ต้องย้อนไปตรงที่บอกตอนแรกว่าโปรแกรมเชิงวัตถุเนี่ยมันต้องมี “คุณสมบัติ” และ “พฤติกรรม” ซึ่งสองสิ่งนี้ก็คือสิ่งที่เราต้องห่อหุ้มเอาไว้นั่นเอง คำถามต่อมาก็คือทำไมเราถึงต้องหุ่มเอาไว้ ห่อแล้วจะได้ประโยชน์อะไร ลองนึกภาพถึงโปรแกรมที่มี object อยู่หลายตัวซึ่งแต่ละตัวก็มีการติดต่อรับส่งข้อมูลกัน ถ้าไม่มีการห่อหุ้มเอาไว้ แต่ละ object เข้าถึงและเปลี่ยนแปลงคุณสมบัติของ object อื่นได้ทั้งหมด อาจจะทำให้เกิดความผิดพลาดในการทำงานได้ถ้าถูกเปลี่ยนแปลงคุณสมบัติโดยไม่มีการควบคุม
ในเรื่องนี้การห่อหุ้มจึงเข้ามาช่วยนั่นเอง โดยการห่อหุ้มจะทำได้เมื่อแต่ละวัตถุมีสิ่งที่มีสถานะเป็น private อยู่ภายใน class ทำให้เราซ่อนการมองเห็นหรือการเข้าถึงจากภายนอกได้ลองดูจากตัวอย่าง class ได้โนเสาร์ของเรากัน
ในภาพนี้จะมีส่วนที่ห่อหุ้มเอาไว้ กับส่วนที่เปิดให้เข้าถึงได้ ส่วนที่เข้าถึงได้ได้แก่ เราให้ได้โนเสาร์ของเราเรียน และเราให้ได้โนเสาร์ของเรากักตัว จะเห็นว่าสิ่งที่เข้าถึงได้นั้นเราไม่ได้เปลี่ยนแปลงคุณสมบัติหรือพฤติกรรมของไดโนเสาร์โดยตรง เราเพียงแค่เรียกคำสั่งที่ไดโนเสาร์เปิดไว้ให้เท่านั้น ส่วนการจัดการภายในนั้นไดโนเสาร์เป็นคนจัดการเองโดยภายนอกไม่จำเป้นต้องรู้ ซึ่งการที่ object หรือ class มีการห่อหุ้มและการเปิดเผยนั้นรวมแล้วก็คือหัวใจของการ Encapsulation นั่นเอง
2. Abstraction การรู้แค่ที่จำเป็น
ในข้อนี้นั้นเรียกได้ว่าเป็นผลพลอยได้มาจาก Encapsulation เลยก็ว่าได้ เพราะเป็นการที่เราเปิดให้คนอื่นหรือก็คือ object อื่นเรียกใช้งาน object ของเราได้โดยที่ไม่จำเป็นต้องรู้การทำงานหรือรายละเอียดต่างๆข้างในเลย อย่างในชีวิตประจำวันของเราก็พบกับการ Abstraction อยู่ตลอดเวลา อย่างการขับรถ, การใช้งานคอมพิวเตอร์, การใช้สมาร์ทโฟน หรือการใช้งานเว็บต่างๆ เช่นตอนที่เราใช้ Facebook เราเพียงแค่ไถหน้าฟีด กดดูแจ้งเตือน ตอบแชทเพื่อน อะไรประมาณนั้น ซึ่งเราก็สามารถใช้งานได้ง่ายโดยที่เราไม่รู้ด้วยซ้ำว่าเบื้องหลังมันทำงานอะไรบ้าง ตอนเราพิมพ์แชทคุยกับเพื่อน การทำงานข้างหลังต้องส่งข้อมูลยังไง เข้ารหัสแบบไหน ซึ่งลักษณะแบบนี้ก็คือ Abstraction
3. Inheritance การสืบทอดคุณสมบัติ
จากสองข้อที่ผ่านมาเราสามารถควบคุมการเข้าถึงได้แล้ว ต่อให้เป็นโปรแกรมขนาดใหญ่ที่มีความซับซ้อน ข้อมูลและการทำงานก็จะยังคงถูกต้องอยู่ แต่อีกสิ่งที่มักจะเกิดในการเขียนโปรแกรมก็คือการที่มีหลายๆ class ทำงานคล้ายๆกัน แต่ถ้าจะให้รวมไว้ด้วยกันก็ทำไม่ได้เพราะไม่ได้เหมือนกันทั้งหมด ดังนั้นเราจึงต้องใช้การ Inheritance เพื่อที่จะแก้ปัญหาแบบนี้ โดยการสืบทอดคุณสมบัตินั้นก็ตรงตัวคือ เป็นการเอาคุณสมบัติของ class หนึ่งไปสร้างเป็นอีก class หนึ่งและยังสามารถเพิ่มความสามารถเข้าไปได้อีก ซึ่งก็เป็นการ Reuse โค้ดที่เป็น class นั่นเอง
เช่นเรามี class “สัตว์สี่ขา” ที่มีคุณสมบัติคือมี “ขา” และมีพฤติกรรมคือ “เดิน” พอเราจะสร้าง class “แมว” กับ “สุนัข” ขึ้นมาใหม่ ทั้งแมวและสุนัขต่างก็เป็นสัตว์สี่ขาเหมือนกันแทนที่จะสร้าง ขา กับ การเดิน ขึ้นมาใหม่ เราก็ให้สืบทอดมาจาก class สัตว์สี่ขาได้เลย และก็ยังสามารถเพิ่มเติมคุณสมบัติหรือพฤติกรรมเพิ่มขึ้นได้อีกอย่าง “ซื่อสัตย์” และ “เห่า” ในสุนัข กับ “อ้อน” ในแมว
4. Polymorphism การมีหลายรูปแบบ
ลองนึกถึงการที่เราใช้ Inheritance เป็นจำนวนมาก มี class ที่สืบทอดคุณสมบัติกันไปหลายรูปแบบ แล้วถ้าเราต้องการจะเก็บ class ต่างๆเหล่านั้นเข้าด้วยกันใน list หรือต้องการจะเรียกใช้งานทุก class ให้ได้เหมือนๆกัน เราจึงต้องใช้ Polymorphism ในการทำสิ่งเหล่านี้ โดยแทนที่ class ต้นแบบจะสร้าง “พฤติกรรม” เอาไว้และให้ class อื่นมาสืบทอดไปใช้งาน ก็เหลือเพียงแค่กำหนดชื่อ “พฤติกรรม” ให้ class ที่มาสืบทอดเอาไปสร้างการทำงานเอาเองแทน อย่างคลาสสุนัขกับแมวในข้อก่อนแทนที่ class สัตว์สี่ขา จะสร้าง “เดิน” เอาไว้ให้เลยว่าเดินยังไงก็ทำไว้แค่ชื่อพฤติกรรมว่าเดินเฉยๆ ให้สุนัขกับแมวเอาไปสร้างรายละเอียดเอาเองทีหลัง นั่นจะทำให้เราสามารถสั่งให้สุนัขและแมวเดินได้เหมือนกัน โดยที่ทั้งสองชนิดเดินไม่เหมือนกันก็ตาม
ผ่านมาครบ 4 ข้อกันแล้วก็น่าจะพอเข้าใจกันนะครับว่าการเขียนแบบ OOP นั้นไม่ใช่เพียงแค่ทำให้โค้ดอยู่ในรูปแบบของ “วัตถุ” เท่านั้น แต่การทำให้มีคุณสมบัติต่างๆก็เป็นส่วนสำคัญของแนวคิด OOP เช่นกัน