Dark mode
เปรียบเทียบ Programming Paradigms
คุณสมบัติ | Functional (FP) | Object-Oriented (OOP) | Imperative (IP) | Procedural (PP) |
---|---|---|---|---|
แนวคิดหลัก | ฟังก์ชันบริสุทธิ์, immutable, higher-order | วัตถุ, encapsulation, inheritance | ลำดับคำสั่ง, state mutation | ฟังก์ชัน/ขั้นตอน, mutable state |
การจัดการสถานะ | หลีกเลี่ยง state ที่เปลี่ยนแปลง | ห่อหุ้ม state ในวัตถุ | ใช้ตัวแปรเปลี่ยนค่าได้ | ใช้ตัวแปรและฟังก์ชัน |
ตัวอย่างโค้ด | const sum = arr.reduce((a,b) => a+b, 0); | class A {} | let x=1; x++; | function foo(){} |
ข้อดี | ทดสอบง่าย, ไม่มี side effect | โครงสร้างดี, ขยายง่าย | เข้าใจง่าย, ควบคุมละเอียด | อ่านง่าย, debug ง่าย |
ข้อเสีย | เรียนรู้ยาก, จัดการ state ซับซ้อน | ซับซ้อนถ้า hierarchy ลึก | ดูแลยากถ้าโปรแกรมใหญ่ | ซับซ้อนถ้าแชร์ state |
ตัวอย่างโค้ดเปรียบเทียบ
Functional Programming (FP)
js
const double = arr => arr.map(x => x * 2);
Object-Oriented Programming (OOP)
js
class User {
constructor(name) { this.name = name; }
greet() { return `Hi, ${this.name}`; }
}
Imperative Programming (IP)
js
let sum = 0;
for (let i = 0; i < arr.length; i++) {
sum += arr[i];
}
Procedural Programming (PP)
js
function process(arr) {
let result = [];
for (let i of arr) result.push(i * 2);
return result;
}
สรุป
- FP: เหมาะกับงานที่เน้นความบริสุทธิ์ของฟังก์ชันและการประมวลผลข้อมูล
- OOP: เหมาะกับระบบขนาดใหญ่ที่ต้องการโครงสร้างและการ reuse
- IP: เหมาะกับอัลกอริทึมที่ต้องการควบคุมลำดับการทำงาน
- PP: เหมาะกับงานที่แบ่งเป็นขั้นตอนและฟังก์ชันย่อย
|--|-|||--| | แนวคิดหลัก | เน้นฟังก์ชันบริสุทธิ์และหลีกเลี่ยงการเปลี่ยนแปลงสถานะ | เน้นวัตถุที่รวมข้อมูลและพฤติกรรม | เน้นลำดับของคำสั่งเพื่อเปลี่ยนแปลงสถานะ | เน้นขั้นตอนหรือฟังก์ชันที่ดำเนินการตามลำดับ | | การจัดการสถานะ | หลีกเลี่ยงสถานะที่เปลี่ยนแปลงได้; ใช้ฟังก์ชันบริสุทธิ์ | ใช้การห่อหุ้มเพื่อจัดการสถานะภายในวัตถุ | ใช้ตัวแปรที่เปลี่ยนแปลงได้และลูป | ใช้ตัวแปรที่เปลี่ยนแปลงได้และฟังก์ชันที่มีผลข้างเคียง | | การเขียนโปรแกรม | Declarative (เน้น "อะไร" ที่จะทำ) | Declarative (เน้น "อะไร" ที่จะทำ) | Imperative (เน้น "อย่างไร" ที่จะทำ) | Imperative (เน้น "อย่างไร" ที่จะทำ) | | การใช้งานทั่วไป | การประมวลผลข้อมูล, การเขียนโปรแกรมคู่ขนาน, AI | ระบบซอฟต์แวร์ขนาดใหญ่, GUI, เกม | อัลกอริทึม, สคริปต์, ซอฟต์แวร์ระบบ | แอปพลิเคชันทางธุรกิจ, สคริปต์, ซอฟต์แวร์ระบบ | | ภาษาที่นิยม | Haskell, Lisp, Clojure, Scala | Java, C++, Python, C# | C, Assembly, Fortran | C, Pascal, BASIC |
Functional Programming (FP)
เน้นการใช้ฟังก์ชันบริสุทธิ์ (pure functions) และหลีกเลี่ยงการเปลี่ยนแปลงสถานะ
js
// ฟังก์ชันบริสุทธิ์: คำนวณ factorial
const factorial = (n) => (n === 0 ? 1 : n * factorial(n - 1));
console.log(factorial(5)); // 120
// ฟังก์ชันระดับสูง: map เพื่อคูณทุกตัวในอาร์เรย์ด้วย 2
const double = (x) => x * 2;
const numbers = [1, 2, 3, 4];
const doubledNumbers = numbers.map(double);
console.log(doubledNumbers); // [2, 4, 6, 8]
Object-Oriented Programming (OOP)
เน้นการสร้างวัตถุที่รวมข้อมูลและพฤติกรรมเข้าด้วยกัน
js
// คลาส: Rectangle
class Rectangle {
constructor(width, height) {
this.width = width;
this.height = height;
}
area() {
return this.width * this.height;
}
}
// สร้างวัตถุและเรียกใช้เมธอด
const rect = new Rectangle(5, 3);
console.log(rect.area()); // 15
Imperative Programming (IP)
เน้นลำดับคำสั่งที่ชัดเจนเพื่อเปลี่ยนแปลงสถานะ
js
// หาผลรวมของอาร์เรย์ด้วยลูป
const numbers = [1, 2, 3, 4];
let sum = 0;
for (let i = 0; i < numbers.length; i++) {
sum += numbers[i];
}
console.log(sum); // 10
Procedural Programming (PP)
เน้นการใช้ฟังก์ชันที่ดำเนินการตามขั้นตอน
js
// ฟังก์ชัน: คำนวณค่าเฉลี่ย
function calculateAverage(numbers) {
let sum = 0;
for (let i = 0; i < numbers.length; i++) {
sum += numbers[i];
}
return sum / numbers.length;
}
// เรียกใช้ฟังก์ชัน
const numbers = [1, 2, 3, 4];
const average = calculateAverage(numbers);
console.log(average); // 2.5
คำอธิบายเพิ่มเติม
- FP: โค้ดเน้นฟังก์ชันที่ไม่เปลี่ยนแปลงข้อมูลต้นฉบับ เช่น
map
ที่สร้างอาร์เรย์ใหม่ หรือfactorial
ที่คำนวณโดยไม่ใช้ตัวแปรที่เปลี่ยนค่า - OOP: โค้ดใช้คลาส (
Rectangle
) เพื่อห่อหุ้มข้อมูล (width
,height
) และพฤติกรรม (area
) ไว้ในวัตถุ - IP: โค้ดระบุขั้นตอนการทำงานทีละขั้นอย่างชัดเจน โดยใช้ลูปและตัวแปรที่เปลี่ยนค่า (
sum
) เพื่อให้ได้ผลลัพธ์ - PP: โค้ดแบ่งการทำงานเป็นฟังก์ชัน (
calculateAverage
) ที่มีขั้นตอนชัดเจนและอาจมีผลข้างเคียง (เช่น การเปลี่ยนค่าsum
)
สรุป
- FP เหมาะกับงานที่ต้องการความบริสุทธิ์ของฟังก์ชันและการประมวลผลแบบคู่ขนาน
- OOP เหมาะกับระบบขนาดใหญ่ที่ต้องการโครงสร้างและการจัดการสถานะที่ชัดเจน
- IP เหมาะกับอัลกอริทึมที่ต้องการควบคุมลำดับการทำงานอย่างละเอียด
- PP เหมาะกับงานที่ต้องการขั้นตอนการทำงานที่เรียบง่ายและตรงไปตรงมา
การเลือกกระบวนทัศน์ขึ้นอยู่กับความต้องการของโปรเจกต์และลักษณะของปัญหาที่ต้องการแก้ไข