Skip to content

เปรียบเทียบ 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 เหมาะกับงานที่ต้องการขั้นตอนการทำงานที่เรียบง่ายและตรงไปตรงมา

การเลือกกระบวนทัศน์ขึ้นอยู่กับความต้องการของโปรเจกต์และลักษณะของปัญหาที่ต้องการแก้ไข