/ OOP

[365 วันแห่งโปรแกรม #day6] Principles of OOP (ตอนที่ 1)

วันที่หกของ ‪#‎365วันแห่งโปรแกรม‬ วันนี้เราจะมีคุยกันเรื่อง Principles of OOP (ตอนที่ 1)


ในการเขียนโปรแกรมเชิงวัตถุ (Object-Oriented Programming) นั้นมีองค์ประกอบหลักที่เพิ่มมาจากการเขียนโปรแกรมแบบ Procedural ได้แก่ Class และ Object ในเมื่อมีองค์ประกอบเพิ่มขึ้นมาก็ต้องมีหลักการมารองรับ เพื่อใช้ผู้ใช้สามารถนำไปประยุกต์ได้อย่างถูกวิธี หลักการสำคัญ 4 ประการของ OOP ได้แก่ inheritance, abstraction, encapsulation และ polymorphism แต่ในวันนี้เราจะพูดถึงแค่เรื่องของ Inheritance ก่อน

Inheritance คือคุณสมบัติหลักของ OOP ที่บอกไว้ว่าคลาสนั้นสามารถที่จะถ่ายทอดคุณสมบัติไปสู่คลาสรุ่นถัดๆ ไปได้ หลักการก็เหมือนๆ กับการวิวัฒนาการของสิ่งมีชีวิต เช่น สิงโต (Lion) มีวิวัฒนาการมาจากแมว (Felidae) นั่นหมายความว่าสิงโตนั้นมีคุณสมบัติแบบเดียวกับที่แมวมี และยังอาจจะมีคุณสมบัติอื่นๆ เพิ่มเติม

ในเชิงโปรแกรมมิ่งนั้นแบ่งวิธีการสืบทอดคุณสมบัติเป็น 2 แบบหลักๆ คือสืบทอดในแนวดิ่ง และสืบทอดในแนวราบ

  • การสืบทอดคุณสมบัติในแนวดิ่ง คือการสืบทอดแบบรุ่นสู่รุ่น เหมือนกับรูปแบบทั่วไปของการสืบทอดในสิ่งมีชีวิต แบ่งออกเป็น 2 แบบ หลักๆ คือ Single Inheritance และ Multiple Inheritance

    • Multiple Inheritance เป็นแนวคิดที่บอกว่าคลาสลูกสามารถรับการสืบทอดคุณสมบัติได้จากหลายคลาส และคลาสลูกจะมีคุณสมบัติเหมือนกับคลาสแม่ทั้งหมดอีกด้วย (ต่างจากการผสมข้ามสายพันธ์ของสิ่งมีชีวิตที่ไม่การันตีคุณสมบัติที่ตกทอด) ตัวอย่างภาษาที่ยอมให้ใช้วิธีนี้คือ C++

    • Single Inheritance เป็นอีกแนวคิดหนึ่งที่พยายามหลีกหนีความวุ่นวาย จากการทับซ้อนของคุณสมบัติบางประการของรุ่นแม่ใน Multiple Inheritance โดยการกำหนดให้สืบทอดคุณสมบัติได้จากคลาสแม่คลาสเดียวเท่านั้น ตัวอย่างภาษาที่ยอมให้ใช้วิธีนี้คือ Java, C#, PHP

  • การสืบทอดคุณสมบัติในแนวราบ เป็นแนวคิดที่ออกมาแก้เรื่องที่ภาษาโปรแกรมส่วนใหญ่ยอมให้สืบทอดแบบ Single Inheritance เท่านั้น โดยแนวคิดนี้ก็แบ่งออกเป็น 2 ทางเช่นกัน

    • Interfaces เป็นวิธีแก้ไขปัญหาการสืบทดแบบหลายแม่โดยการกำหนดโครงสร้างแบบ abstraction ขึ้นมา โดยคลาสลูกยังสามารถสืบทอดจากคลาสแม่ได้เช่นเดิม และสามารถสืบทอดจาก interface อื่นๆ ได้ ไม่จำกัด แต่มีเงื่อนไขว่าคลาสลูกจะต้อง implement คุณสมบัติที่สืบทอดจาก interface ทั้งหมดเอง ตัวอย่างภาษาที่ยอมให้ใช้วิธีนี้คือ Java, C#, PHP

    • Traits เป็นวิธีแก้ไขปัญหาการสืบทดแบบหลายแม่โดยสร้างกลุ่มของคุณสมบัติแบบ concrete ขึ้นมา โดยคลาสลูกยังสามารถสืบทอดจากคลาสแม่ได้เช่นเดิม และสามารถสืบทอดจาก trait อื่นๆ ได้ ไม่จำกัด และไม่ต้อง implement คุณสมบัติของ trait เอง เพราะคุณสมบัติเหล่านั้นเป็น concrete อยู่แล้ว trait จะมีวิธีการแก้ปัญหาเกี่ยวกับการทับซ้อนของคุณสมบัติต่างๆ แล้วแต่ภาษาที่ implement trait ไปใช้ ตัวอย่างภาษาที่ยอมให้ใช้วิธีนี้คือ PHP

‪#‎day6‬ #365วันแห่งโปรแกรม ‪#‎โครงการ365วันแห่ง‬...