ข้ามไปเนื้อหา

การเขียนโปรแกรมเชิงวัตถุ

จากวิกิพีเดีย สารานุกรมเสรี
(เปลี่ยนทางจาก Object-oriented programming)

การเขียนโปรแกรมเชิงวัตถุ (อังกฤษ: object-oriented programming; ย่อว่า OOP) เป็นกระบวนทัศน์การเขียนโปรแกรมที่จัดโครงสร้างโปรแกรมเป็นกลุ่มของ วัตถุ [en] (object) ซึ่งทำงานร่วมกัน วัตถุหนึ่ง ๆ รวมสถานะหรือข้อมูลเข้ากับพฤติกรรมที่ดำเนินการกับข้อมูลนั้น โดยพฤติกรรมมักเขียนเป็นฟังก์ชันที่เรียกว่า เมท็อด (method)[1][2]

ภาษาโปรแกรมอาจสนับสนุนแนวคิดเชิงวัตถุในระดับและรูปแบบที่ต่างกัน ภาษาจำพวกจาวา ซี++ และซีชาร์ป ใช้คลาสเป็นหลัก ส่วนจาวาสคริปต์มีพื้นฐานจากต้นแบบ [en][3] นอกจากนี้ ภาษาสมัยใหม่จำนวนมากเป็นภาษาโปรแกรมหลายกระบวนทัศน์ [en] จึงใช้การเขียนโปรแกรมเชิงวัตถุร่วมกับการเขียนโปรแกรมเชิงกระบวนการหรือการเขียนโปรแกรมเชิงฟังก์ชันได้

Image
สัญกรณ์ยูเอ็มแอลของคลาส Button ส่วนกลางแสดงข้อมูลและส่วนล่างแสดงเมท็อด วัตถุเป็นอินสแตนซ์ของคลาส

แนวคิดหลัก

[แก้]

แนวคิดที่พบบ่อยในการเขียนโปรแกรมเชิงวัตถุ ได้แก่[2]

  • คลาสและวัตถุ — คลาสกำหนดโครงสร้างข้อมูลและพฤติกรรมร่วม ส่วนวัตถุเป็นอินสแตนซ์ที่สร้างจากคลาสและมีสถานะของตนเอง
  • การห่อหุ้ม (encapsulation) — รวมข้อมูลกับเมท็อดที่เกี่ยวข้องไว้ในหน่วยเดียว ส่วนการซ่อนสารสนเทศ (information hiding) คือการจำกัดไม่ให้ส่วนอื่นของโปรแกรมพึ่งพารายละเอียดภายในที่ไม่จำเป็น
  • การทำให้เป็นนามธรรม (abstraction) — แสดงเฉพาะคุณลักษณะสำคัญผ่านส่วนต่อประสาน และซ่อนรายละเอียดการนำไปทำงาน
  • การสืบทอด (inheritance) — สร้างคลาสใหม่จากคลาสเดิมเพื่อรับและปรับแต่งพฤติกรรม อย่างไรก็ตาม การประกอบวัตถุ (object composition) ก็เป็นอีกวิธีหนึ่งในการนำพฤติกรรมกลับมาใช้
  • ภาวะพหุสัณฐาน (polymorphism) — ทำให้รหัสเรียกใช้วัตถุต่างชนิดผ่านส่วนต่อประสานเดียวกันได้ โดยระบบเลือกเมท็อดที่ตรงกับชนิดจริงของวัตถุขณะทำงาน เรียกว่าการเลือกเมท็อดแบบพลวัต [en] (dynamic dispatch)[4]

แนวคิดเหล่านี้ไม่ใช่ข้อกำหนดตายตัวทุกข้อสำหรับทุกภาษา ตัวอย่างเช่น ภาษาเชิงต้นแบบสร้างและเชื่อมโยงวัตถุโดยไม่จำเป็นต้องประกาศคลาส

ตัวอย่างภาษาจาวา

[แก้]

ตัวอย่างต่อไปนี้กำหนดส่วนต่อประสาน Shape และคลาสสองคลาสที่คำนวณพื้นที่ด้วยวิธีต่างกัน

interface Shape {
    double area();
}

final class Circle implements Shape {
    private final double radius;

    Circle(double radius) {
        this.radius = radius;
    }

    @Override
    public double area() {
        return Math.PI * radius * radius;
    }
}

final class Rectangle implements Shape {
    private final double width;
    private final double height;

    Rectangle(double width, double height) {
        this.width = width;
        this.height = height;
    }

    @Override
    public double area() {
        return width * height;
    }
}

public class Main {
    public static void main(String[] args) {
        Shape[] shapes = {
            new Circle(2),
            new Rectangle(3, 4)
        };

        for (Shape shape : shapes) {
            System.out.printf("%.2f%n", shape.area());
        }
    }
}

ฟิลด์ private final แสดงการซ่อนสถานะภายใน ส่วน Shape เป็นนามธรรมของสิ่งที่คำนวณพื้นที่ได้ เมื่อวนผ่านอาร์เรย์ โปรแกรมเรียก area() ผ่านส่วนต่อประสานเดียวกัน แต่เครื่องเสมือนจาวาเลือกเมท็อดของ Circle หรือ Rectangle ตามวัตถุจริง นี่เป็นตัวอย่างของภาวะพหุสัณฐานและการเลือกเมท็อดแบบพลวัต[4]

ประวัติ

[แก้]

ภาษาซิมูลาซึ่งพัฒนาโดยโอเล-โยฮัน ดาห์ลและคริสเตน นือกอร์ในคริสต์ทศวรรษ 1960 นำแนวคิดสำคัญ เช่น คลาส (class) การสืบทอด (inheritance) และการผูกแบบพลวัต (dynamic binding) มาใช้ และได้รับการยอมรับโดยทั่วไปว่าเป็นภาษาเชิงวัตถุภาษาแรก[5][6] ต่อมาภาษาสมอลล์ทอล์กซึ่งพัฒนาที่ศูนย์วิจัยพาโลอัลโตของซีร็อกซ์ในคริสต์ทศวรรษ 1970 เน้นระบบที่วัตถุสื่อสารกันด้วยข้อความ[7] แนวทางนี้แพร่หลายมากขึ้นผ่านภาษาอย่างซี++ อ็อบเจกทีฟ-ซี และไอเฟลในคริสต์ทศวรรษ 1980 และภาษาจาวาในคริสต์ทศวรรษ 1990

การออกแบบและข้อจำกัด

[แก้]

แบบแผนการออกแบบ (design pattern) คือคำอธิบายแนวทางแก้ปัญหาการออกแบบที่เกิดซ้ำ ไม่ใช่รหัสสำเร็จรูป หนังสือ Design Patterns: Elements of Reusable Object-Oriented Software ของเอริช แกมมา ริชาร์ด เฮล์ม ราล์ฟ จอห์นสัน และจอห์น วลิสซิเดส ซึ่งตีพิมพ์ใน ค.ศ. 1994 รวบรวมแบบแผนที่มีอิทธิพล 23 แบบ[8]

การแบ่งระบบเป็นวัตถุช่วยจัดกลุ่มความรับผิดชอบและจำกัดการพึ่งพารายละเอียดภายในได้ แต่ OOP ไม่รับประกันว่าซอฟต์แวร์จะยืดหยุ่นหรือบำรุงรักษาง่ายโดยอัตโนมัติ ลำดับชั้นการสืบทอดที่ซับซ้อนอาจเพิ่มการยึดโยงระหว่างคลาส จึงมักแนะนำให้พิจารณาการประกอบแทนการสืบทอดเมื่อเหมาะสม[9] การเลือกกระบวนทัศน์ควรขึ้นอยู่กับชนิดของปัญหา ภาษา และข้อกำหนดของระบบ

ดูเพิ่ม

[แก้]

อ้างอิง

[แก้]
  1. Lewis, John; Loftus, William (2008). "1.6 Object-Oriented Programming". Java Software Solutions: Foundations of Program Design (พิมพ์ครั้งที่ 6). Pearson Education. ISBN 978-0-321-53205-3.
  2. 1 2 "Object-Oriented Programming Concepts". The Java Tutorials (ภาษาอังกฤษ). Oracle. สืบค้นเมื่อ 29 กรกฎาคม 2026.
  3. "Inheritance and the Prototype Chain". MDN Web Docs (ภาษาอังกฤษ). Mozilla. สืบค้นเมื่อ 29 กรกฎาคม 2026.
  4. 1 2 "Polymorphism". The Java Tutorials (ภาษาอังกฤษ). Oracle. สืบค้นเมื่อ 29 กรกฎาคม 2026.
  5. Nygaard, Kristen; Dahl, Ole-Johan (1 สิงหาคม 1978). "The Development of the SIMULA Languages". ACM SIGPLAN Notices. 13 (8): 245–272. doi:10.1145/960118.808391.{{cite journal}}: CS1 maint: date auto-translated (ลิงก์)
  6. "Ole-Johan Dahl—A.M. Turing Award Laureate" (ภาษาอังกฤษ). Association for Computing Machinery. สืบค้นเมื่อ 29 กรกฎาคม 2026.
  7. Kay, Alan C. (1993). "The Early History of Smalltalk". ACM SIGPLAN Notices. 28 (3): 69–95. doi:10.1145/155360.155364.
  8. Gamma, Erich; Helm, Richard; Johnson, Ralph; Vlissides, John (1994). Design Patterns: Elements of Reusable Object-Oriented Software. Addison-Wesley. ISBN 978-0-201-63361-0.
  9. Bloch, Joshua (2018). Effective Java (พิมพ์ครั้งที่ 3). Addison-Wesley. Item 18: Favor composition over inheritance. ISBN 978-0-13-468599-1.

อ่านเพิ่มเติม

[แก้]
  • Booch, Grady; Maksimchuk, Robert A.; Engle, Michael W.; Young, Bobbi J.; Conallen, Jim; Houston, Kelli A. (2007). Object-Oriented Analysis and Design with Applications (พิมพ์ครั้งที่ 3). Addison-Wesley. ISBN 978-0-201-89551-3.
  • Meyer, Bertrand (1997). Object-Oriented Software Construction (พิมพ์ครั้งที่ 2). Prentice Hall. ISBN 978-0-13-629155-8.