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

Button ส่วนกลางแสดงข้อมูลและส่วนล่างแสดงเมท็อด วัตถุเป็นอินสแตนซ์ของคลาสแนวคิดหลัก
[แก้]แนวคิดที่พบบ่อยในการเขียนโปรแกรมเชิงวัตถุ ได้แก่[2]
- คลาสและวัตถุ — คลาสกำหนดโครงสร้างข้อมูลและพฤติกรรมร่วม ส่วนวัตถุเป็นอินสแตนซ์ที่สร้างจากคลาสและมีสถานะของตนเอง
- การห่อหุ้ม (encapsulation) — รวมข้อมูลกับเมท็อดที่เกี่ยวข้องไว้ในหน่วยเดียว ส่วนการซ่อนสารสนเทศ (information hiding) คือการจำกัดไม่ให้ส่วนอื่นของโปรแกรมพึ่งพารายละเอียดภายในที่ไม่จำเป็น
- การทำให้เป็นนามธรรม (abstraction) — แสดงเฉพาะคุณลักษณะสำคัญผ่านส่วนต่อประสาน และซ่อนรายละเอียดการนำไปทำงาน
- การสืบทอด (inheritance) — สร้างคลาสใหม่จากคลาสเดิมเพื่อรับและปรับแต่งพฤติกรรม อย่างไรก็ตาม การประกอบวัตถุ (object composition) ก็เป็นอีกวิธีหนึ่งในการนำพฤติกรรมกลับมาใช้
- ภาวะพหุสัณฐาน (polymorphism) — ทำให้รหัสเรียกใช้วัตถุต่างชนิดผ่านส่วนต่อประสานเดียวกันได้ โดยระบบเลือกเมท็อดที่ตรงกับชนิดจริงของวัตถุขณะทำงาน เรียกว่าการเลือกเมท็อดแบบพลวัต (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] การเลือกกระบวนทัศน์ควรขึ้นอยู่กับชนิดของปัญหา ภาษา และข้อกำหนดของระบบ
ดูเพิ่ม
[แก้]อ้างอิง
[แก้]- ↑ 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.
- 1 2 "Object-Oriented Programming Concepts". The Java Tutorials (ภาษาอังกฤษ). Oracle. สืบค้นเมื่อ 29 กรกฎาคม 2026.
- ↑ "Inheritance and the Prototype Chain". MDN Web Docs (ภาษาอังกฤษ). Mozilla. สืบค้นเมื่อ 29 กรกฎาคม 2026.
- 1 2 "Polymorphism". The Java Tutorials (ภาษาอังกฤษ). Oracle. สืบค้นเมื่อ 29 กรกฎาคม 2026.
- ↑ 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 (ลิงก์) - ↑ "Ole-Johan Dahl—A.M. Turing Award Laureate" (ภาษาอังกฤษ). Association for Computing Machinery. สืบค้นเมื่อ 29 กรกฎาคม 2026.
- ↑ Kay, Alan C. (1993). "The Early History of Smalltalk". ACM SIGPLAN Notices. 28 (3): 69–95. doi:10.1145/155360.155364.
- ↑ 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.
- ↑ 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.