บทนำ: การเปลี่ยนมุมมอง
จนถึงตอนนี้ เราเขียนโปรแกรม แบบ Procedural – คิดเป็น “คำสั่ง (Instructions)” และ “ข้อมูล (Data)” แยกกัน
ตั้งแต่บัดนี้ต้อง เปลี่ยนมุมมองให้คิดแบบ Object-Oriented – คิดเป็น “วัตถุ (Objects)” ที่มีอยู่ในโลกจริง แต่ละวัตถุมีทั้ง “สถานะ (State)” และ “พฤติกรรม (Behavior)”
ทำไมต้องคิดแบบนี้?
- ตรงกับความคิดของมนุษย์มากกว่า
- ง่ายต่อการออกแบบระบบใหญ่
- โค้ดสามารถขยายและดูแลรักษาได้ง่ายกว่า
- บทนำ: การเปลี่ยนมุมมอง
- Object: วัตถุในโปรแกรม
- Object คืออะไร?
- State: สถานะ (ข้อมูลของ Object)
- State คืออะไร?
- ตัวอย่าง: State ของ Student
- State แบบต่างๆ
- Behavior: พฤติกรรม (สิ่งที่ Object ทำได้)
- Behavior คืออะไร?
- ตัวอย่าง: Behavior ของ Bank Account
- ตัวอย่าง: Behavior ของ Student
- ตัวอย่าง: Behavior ของ Light Bulb
- ความสัมพันธ์ระหว่าง State และ Behavior
- Behavior นำไปสู่การเปลี่ยนแปลง State
- ตัวอย่างที่ 1: ระบบสินค้าในตะกร้า (Shopping Cart)
- State ของ Cart Item
- ตัวอย่างที่ 2: ระบบจัดการอุณหภูมิ (Temperature Control)
- State ของ Thermostat
- ตัวอย่างที่ 3: ระบบจัดการพนักงาน (Employee Management)
- State ของ Employee
- ตัวอย่างที่ 4: ระบบการจัดการเกม (Game Character)
- State ของ Character ในเกม
- แบบแผน: State & Behavior Pattern
- Template
- วิธีเลียน Object จากโลกจริง
- ขั้นตอนการคิด Object
- ขั้นตอนที่ 1: เลือกสิ่งของจริง
- ขั้นตอนที่ 2: ระบุ State
- ขั้นตอนที่ 3: ระบุ Behavior
- ขั้นตอนที่ 4: คิดความสัมพันธ์
- ตัวอย่างการคิด Object: ระบบห้องสมุด (Library System)
- ขั้นตอนที่ 1: เลือก Objects
- ขั้นตอนที่ 2: ระบุ State ของแต่ละ Object
- ขั้นตอนที่ 3: ระบุ Behavior
- ขั้นตอนที่ 4: ทำการเปลี่ยนแปลง State
- สรุป: Object = State + Behavior
- ตัวอย่างสุดท้าย: การประมวลผลการสั่งซื้อ
Object: วัตถุในโปรแกรม
Object คืออะไร?
Object คือ สิ่งมีตัวตนเดียว ที่มี:
- State (สถานะ) – ข้อมูลที่อธิบายว่า object นี้เป็นแบบไหน
- Behavior (พฤติกรรม) – สิ่งที่ object นี้ทำได้
ตัวอย่างในชีวิตจริง:
textObject: รถยนต์ (Car)
├─ State (สถานะ/ข้อมูล):
│ ├─ ยี่ห้อ: "Toyota"
│ ├─ สี: "สีแดง"
│ ├─ ปีผลิต: 2023
│ ├─ ระยะวิ่ง: 1,500 km
│ └─ ความเร็ว: 0 km/h
│
└─ Behavior (พฤติกรรม/การทำงาน):
├─ เดินเครื่อง (start())
├─ เบรก (brake())
├─ เพิ่มความเร็ว (accelerate())
├─ หยุดเครื่อง (stop())
└─ แสดงข้อมูล (displayInfo())
อีกตัวอย่าง: บัญชีธนาคาร (Bank Account)
textObject: Account (บัญชี ABC123)
├─ State:
│ ├─ accountNumber: "ABC123"
│ ├─ accountHolder: "John Doe"
│ ├─ balance: 50,000 บาท
│ └─ accountType: "Savings"
│
└─ Behavior:
├─ ฝากเงิน (deposit())
├─ ถอนเงิน (withdraw())
├─ ตรวจสอบยอด (checkBalance())
├─ โอนเงิน (transfer())
└─ แสดงประวัติ (displayHistory())
State: สถานะ (ข้อมูลของ Object)
State คืออะไร?
State คือ ข้อมูล ที่บ่งบอก “object นี้เป็นอยากไง ณ เวลาใดเวลาหนึ่ง”
textที่เวลา T1:
บัญชี ABC123 มี State:
- accountNumber: "ABC123"
- balance: 50,000 บาท
ที่เวลา T2 (หลังฝากเงิน 10,000 บาท):
บัญชี ABC123 มี State:
- accountNumber: "ABC123"
- balance: 60,000 บาท ← State เปลี่ยนแปลง!
ตัวอย่าง: State ของ Student
java// Object: Student ชื่อ "John"
Student john = new Student();
// State ของ john:
john.studentID = "6501001"; // State 1
john.name = "John Doe"; // State 2
john.gpa = 3.75; // State 3
john.year = 2; // State 4
john.isActive = true; // State 5
// ตอนนี้: john เป็น "นักศึกษา ปีที่ 2 ที่มี GPA 3.75"
State เปลี่ยนตามเวลา:
java// เดิม: GPA 3.75
john.gpa = 3.75;
// วิชาใหม่ลงทะเบียน
// ... (กำลังเรียน)
// ใหม่: GPA ลดลง
john.gpa = 3.50; // State เปลี่ยน!
State แบบต่างๆ
State ตัวเลข:
javaint age = 25;
double salary = 30,000;
int quantity = 100;
State ข้อความ:
javaString name = "John";
String address = "123 Main St";
String status = "Active";
State จริง-เท็จ:
javaboolean isActive = true;
boolean isLoggedIn = false;
boolean hasPermission = true;
Behavior: พฤติกรรม (สิ่งที่ Object ทำได้)
Behavior คืออะไร?
Behavior คือ สิ่งที่ object สามารถทำได้ มันอธิบาย “object นี้ทำอะไรได้บ้าง”
Behavior = Methods/Functions ที่เป็นของ Object
ตัวอย่าง: Behavior ของ Bank Account
textObject: BankAccount
├─ State:
│ └─ balance = 50,000
│
└─ Behaviors:
├─ deposit(amount) - ฝากเงิน
├─ withdraw(amount) - ถอนเงิน
├─ getBalance() - ดูยอดเงิน
└─ transfer(toAccount) - โอนเงิน
ทำไมเรียกว่า Behavior?
- เพราะ behavior เปลี่ยนแปลง state ของ object
- ตัวอย่าง: เมื่อเรียก
withdraw(10,000)balance จะลดลง
textเดิม: balance = 50,000
withdraw(10,000) ← call behavior นี้
ใหม่: balance = 40,000 ← state เปลี่ยน!
ตัวอย่าง: Behavior ของ Student
javaStudent john = new Student();
// Behaviors ของ john:
john.study(); // ทำให้ GPA เพิ่ม
john.skipClass(); // ทำให้ความมุ่งเน้นลด
john.completeAssignment(); // ส่งการบ้าน
john.takeMidtermExam(); // สอบกลางภาค
john.displayInfo(); // แสดงข้อมูลของตัวเอง
แต่ละ Behavior มีผลต่อ State:
java// เดิม
john.gpa = 3.75;
// Behavior: study
john.study(); // ทำการบ้าน, อ่านหนังสือ, ฝึก
// ใหม่: State เปลี่ยน
john.gpa = 3.80; // GPA เพิ่ม!
ตัวอย่าง: Behavior ของ Light Bulb
textObject: LightBulb (หลอดไฟ)
├─ State:
│ ├─ isOn: false (เดิมปิด)
│ ├─ brightness: 100%
│ ├─ color: "yellow"
│ └─ lifespan: 10,000 hours
│
└─ Behaviors:
├─ turnOn() ← เปลี่ยน state: isOn = true
├─ turnOff() ← เปลี่ยน state: isOn = false
├─ setBrightness()
└─ displayStatus()
ตัวอย่างการเปลี่ยน State:
javaLightBulb bulb = new LightBulb();
// เดิม: isOn = false
System.out.println(bulb.isOn); // false
// ทำ Behavior: turnOn()
bulb.turnOn();
// ใหม่: isOn = true
System.out.println(bulb.isOn); // true
ความสัมพันธ์ระหว่าง State และ Behavior
Behavior นำไปสู่การเปลี่ยนแปลง State
text call Behavior
↓
┌───────────────┐
│ Old State │
└───────────────┘
│
↓
[Behavior (Method)]
↓
┌───────────────┐
│ New State │
└───────────────┘
ตัวอย่างจริง: ระบบ ATM
java// Object: ATM Machine
BankAccount account = new BankAccount();
// State เดิม
account.balance = 50,000; // ยอดเงิน 50,000 บาท
// Behavior: ถอนเงิน
account.withdraw(10,000); // Behavior นี้
// อ่าน State: balance = 50,000
// ทำการคำนวณ: 50,000 - 10,000 = 40,000
// เปลี่ยน State: balance = 40,000
// State ใหม่
account.balance = 40,000; // ยอดเงินเปลี่ยนแปลง!
ตัวอย่างที่ 1: ระบบสินค้าในตะกร้า (Shopping Cart)
State ของ Cart Item
textObject: CartItem (สินค้าในตะกร้า)
├─ State:
│ ├─ productName: "Laptop"
│ ├─ price: 25,000 บาท
│ ├─ quantity: 2 ชิ้น
│ ├─ discount: 10%
│ └─ totalPrice: 45,000 บาท (25,000 × 2 × 90%)
│
└─ Behavior:
├─ addToCart(amount)
├─ removeFromCart(amount)
├─ applyDiscount(discountPercent)
├─ updateQuantity(newQuantity)
└─ calculateTotal()
วิธีทำงาน:
java// สร้าง object
CartItem item = new CartItem("Laptop", 25000);
// State เดิม
item.quantity = 1;
item.totalPrice = 25000;
// เรียก Behavior: addToCart()
item.addToCart(1); // เพิ่มจำนวน 1 ชิ้น
// State เปลี่ยน
item.quantity = 2;
item.totalPrice = 50000;
// เรียก Behavior: applyDiscount()
item.applyDiscount(10); // ลด 10%
// State เปลี่ยนอีก
item.discount = 0.10;
item.totalPrice = 45000; // 50000 × 90%
ตัวอย่างที่ 2: ระบบจัดการอุณหภูมิ (Temperature Control)
State ของ Thermostat
textObject: Thermostat (เครื่องควบคุมอุณหภูมิ)
├─ State:
│ ├─ currentTemperature: 25°C
│ ├─ targetTemperature: 22°C
│ ├─ isACRunning: true
│ ├─ mode: "cool"
│ └─ power: "on"
│
└─ Behavior:
├─ setTargetTemperature(temp)
├─ increaseTemp()
├─ decreaseTemp()
├─ turnOn()
├─ turnOff()
└─ displayStatus()
วิธีทำงาน:
javaThermostat thermostat = new Thermostat();
// State เดิม
thermostat.currentTemperature = 28°C;
thermostat.targetTemperature = 25°C;
thermostat.isACRunning = false;
// Behavior: setTargetTemperature()
thermostat.setTargetTemperature(22);
// State เปลี่ยน
thermostat.targetTemperature = 22;
// Behavior: turnOn() - เปิด AC
thermostat.turnOn();
// State เปลี่ยน
thermostat.isACRunning = true;
// (เมื่อเวลาผ่านไป)
// currentTemperature จะค่อยๆ ลดลง
// → 27°C → 26°C → 25°C → 24°C → 23°C → 22°C
// เมื่อถึง 22°C
// Behavior: turnOff()
thermostat.turnOff();
// State เปลี่ยน
thermostat.isACRunning = false;
ตัวอย่างที่ 3: ระบบจัดการพนักงาน (Employee Management)
State ของ Employee
textObject: Employee (พนักงาน)
├─ State:
│ ├─ employeeID: "EMP001"
│ ├─ name: "John Doe"
│ ├─ position: "Developer"
│ ├─ salary: 30,000 บาท
│ ├─ department: "IT"
│ ├─ workHours: 0 ชม.
│ └─ isWorking: false
│
└─ Behavior:
├─ clockIn() ← เปลี่ยน isWorking = true
├─ clockOut() ← เปลี่ยน isWorking = false
├─ addWorkHours() ← เพิ่ม workHours
├─ giveRaise(amount) ← เปลี่ยน salary
├─ changeDepartment()
└─ displayInfo()
วิธีทำงาน:
javaEmployee employee = new Employee("EMP001", "John Doe");
// State เดิม (เช้ายังไม่เข้าทำงาน)
employee.isWorking = false;
employee.workHours = 0;
employee.salary = 30,000;
// Behavior: clockIn()
employee.clockIn(); // มาทำงาน
// State เปลี่ยน
employee.isWorking = true;
// (ระหว่างวัน) Behavior: addWorkHours()
employee.addWorkHours(8); // ทำงาน 8 ชม.
// State เปลี่ยน
employee.workHours = 8;
// Behavior: clockOut()
employee.clockOut(); // หมดเวลาทำงาน
// State เปลี่ยน
employee.isWorking = false;
// (ตอนสิ้นปี) Behavior: giveRaise()
employee.giveRaise(2000); // ขึ้นเงินเดือน 2,000 บาท
// State เปลี่ยน
employee.salary = 32,000; // เดิม 30,000 + 2,000
ตัวอย่างที่ 4: ระบบการจัดการเกม (Game Character)
State ของ Character ในเกม
textObject: GameCharacter (ตัวละครในเกม)
├─ State:
│ ├─ characterName: "Hero"
│ ├─ level: 1
│ ├─ experience: 0 XP
│ ├─ health: 100 HP
│ ├─ mana: 50 MP
│ ├─ position: (x=0, y=0)
│ ├─ inventory: []
│ └─ isAlive: true
│
└─ Behavior:
├─ attack(enemy) ← ลด enemy.health
├─ takeDamage(amount) ← ลด health
├─ heal(amount) ← เพิ่ม health
├─ gainXP(amount) ← เพิ่ม experience
├─ levelUp() ← เปลี่ยน level
├─ move(newX, newY) ← เปลี่ยน position
├─ useItem(item)
└─ die() ← เปลี่ยน isAlive = false
วิธีทำงาน:
javaGameCharacter hero = new GameCharacter("Hero");
// State เดิม (เพิ่งเริ่มเกม)
hero.level = 1;
hero.experience = 0;
hero.health = 100;
hero.position = (0, 0);
// Behavior: move() - เดินไปหาศัตรู
hero.move(10, 5);
// State เปลี่ยน: position = (10, 5)
// Behavior: attack() - โจมตีศัตรู
hero.attack(enemy);
// State: ได้ experience
// Behavior: gainXP()
hero.gainXP(100);
// State เปลี่ยน: experience = 100
// เมื่อ experience เพียงพอ
// Behavior: levelUp()
hero.levelUp();
// State เปลี่ยน:
// - level = 2
// - health = 120 (เพิ่มตามการ level up)
// - experience = 0 (รีเซ็ต)
// Behavior: takeDamage() - ถูกศัตรูโจมตี
hero.takeDamage(30);
// State เปลี่ยน: health = 90
// Behavior: heal() - ใช้ยา
hero.heal(20);
// State เปลี่ยน: health = 110
แบบแผน: State & Behavior Pattern
Template
textObject: [Object Name]
├─ State (เก็บข้อมูล):
│ ├─ attribute1: type = initial value
│ ├─ attribute2: type = initial value
│ └─ attribute3: type = initial value
│
└─ Behavior (ทำงาน):
├─ behavior1() ← ทำให้ state เปลี่ยน
├─ behavior2() ← ทำให้ state เปลี่ยน
└─ behavior3()
วิธีเลียน Object จากโลกจริง
ขั้นตอนการคิด Object
ขั้นตอนที่ 1: เลือกสิ่งของจริง
เลือก entity ที่ต้องจัดการในระบบ
textตัวอย่าง:
- รถยนต์
- นักศึกษา
- บัญชีธนาคาร
- พนักงาน
- ตัวละครในเกม
ขั้นตอนที่ 2: ระบุ State
คิดว่า object นั้นมี ข้อมูลอะไรบ้าง
textสำหรับ นักศึกษา:
- studentID
- name
- gpa
- year
- email
- phone
- major
ขั้นตอนที่ 3: ระบุ Behavior
คิดว่า object นั้น ทำอะไรได้บ้าง
textสำหรับ นักศึกษา:
- enroll() - ลงทะเบียนวิชา
- study() - เรียน
- submitAssignment() - ส่งการบ้าน
- takeMidtermExam() - สอบกลางภาค
- changeGrade() - อัพเดทคะแนน
- graduate() - จบการศึกษา
ขั้นตอนที่ 4: คิดความสัมพันธ์
คิดว่า Behavior ไหนเปลี่ยนแปลง State ไหน
textBehavior → State ที่เปลี่ยนแปลง:
- study() → gpa เพิ่ม
- submitAssignment() → assignment ในรายวิชา
- takeMidtermExam() → exam score
- graduate() → status เปลี่ยนเป็น "Graduated"
ตัวอย่างการคิด Object: ระบบห้องสมุด (Library System)
ขั้นตอนที่ 1: เลือก Objects
textObjects ที่ต้อง:
- Book (หนังสือ)
- Member (สมาชิก)
- BorrowRecord (บันทึกการยืม)
ขั้นตอนที่ 2: ระบุ State ของแต่ละ Object
textObject 1: Book
├─ State:
│ ├─ isbn: "978-0134685991"
│ ├─ title: "Effective Java"
│ ├─ author: "Joshua Bloch"
│ ├─ isbn: "978-0134685991"
│ ├─ quantity: 5
│ ├─ availableCopies: 3
│ └─ isBorrowable: true
Object 2: Member
├─ State:
│ ├─ memberID: "M001"
│ ├─ name: "John Doe"
│ ├─ membershipDate: "2024-01-15"
│ ├─ borrowedBooks: []
│ └─ totalBorrowedCount: 5
Object 3: BorrowRecord
├─ State:
│ ├─ recordID: "R001"
│ ├─ member: (ชี้ไป Member object)
│ ├─ book: (ชี้ไป Book object)
│ ├─ borrowDate: "2024-10-01"
│ ├─ returnDate: null (ยังไม่คืน)
│ └─ status: "borrowed"
ขั้นตอนที่ 3: ระบุ Behavior
textObject: Book
├─ Behaviors:
│ ├─ borrowBook() ← ลด availableCopies
│ ├─ returnBook() ← เพิ่ม availableCopies
│ ├─ displayInfo()
│ └─ isAvailable()
Object: Member
├─ Behaviors:
│ ├─ borrowBook(book) ← เพิ่ม borrowedBooks
│ ├─ returnBook(book) ← ลบจาก borrowedBooks
│ ├─ getHistoryBooks()
│ └─ displayProfile()
Object: BorrowRecord
├─ Behaviors:
│ ├─ createRecord()
│ ├─ returnBook() ← เปลี่ยน status
│ ├─ extendBorrowDate()
│ └─ calculateLateFee()
ขั้นตอนที่ 4: ทำการเปลี่ยนแปลง State
textScenario: สมาชิก John (Member) ยืมหนังสือ "Effective Java" (Book)
เดิม:
- Member.borrowedBooks = []
- Book.availableCopies = 3
Action: Member.borrowBook(Book)
↓
Step 1: Book.borrowBook() - ลด availableCopies
Step 2: Member.borrowBook() - เพิ่ม borrowedBooks
Step 3: BorrowRecord.createRecord() - บันทึกการยืม
ใหม่:
- Member.borrowedBooks = [Book object]
- Book.availableCopies = 2
- BorrowRecord.status = "borrowed"
สรุป: Object = State + Behavior
| ส่วนประกอบ | ความหมาย | ตัวอย่าง |
|---|---|---|
| State | ข้อมูลของ object ณ เวลาใดเวลาหนึ่ง | name = “John”, age = 25, balance = 50000 |
| Behavior | สิ่งที่ object สามารถทำได้ | study(), withdraw(), attack() |
| ความสัมพันธ์ | Behavior ทำให้ State เปลี่ยนแปลง | withdraw(10000) → balance ลดลง 10000 |
ตัวอย่างสุดท้าย: การประมวลผลการสั่งซื้อ
textระบบ: Online Shopping System
Object 1: Customer
├─ State:
│ ├─ customerID
│ ├─ name
│ ├─ email
│ ├─ accountBalance
│ └─ orderHistory = []
│
└─ Behavior:
├─ browse()
├─ placeOrder()
└─ payOrder()
Object 2: Order
├─ State:
│ ├─ orderID
│ ├─ customer
│ ├─ items = []
│ ├─ totalPrice
│ ├─ status = "pending"
│ └─ createdDate
│
└─ Behavior:
├─ addItem()
├─ removeItem()
├─ calculateTotal()
├─ confirmOrder()
└─ cancelOrder()
Object 3: Product
├─ State:
│ ├─ productID
│ ├─ name
│ ├─ price
│ ├─ quantity
│ └─ available = true
│
└─ Behavior:
├─ decreaseStock()
├─ increaseStock()
└─ isInStock()
Scenario ของการซื้อสินค้า:
text1. Customer browse products
- Behavior: browse()
2. Customer add product to cart
Order.addItem(Product)
- Order.items.length = 1
- Order.totalPrice เพิ่ม
3. Customer click order
Customer.placeOrder(Order)
- Order.status = "pending"
- Customer.accountBalance ลด
4. System confirms order
Order.confirmOrder()
- Order.status = "confirmed"
- Product.decreaseStock()
- Product.quantity ลด
5. Order ships
Order.status = "shipped"
6. Customer receives
Order.status = "delivered"
- Customer.orderHistory เพิ่ม
