เข้าใจ Object ใน OOP: รูปแบบของ “สถานะ” และ “พฤติกรรม”

บทนำ: การเปลี่ยนมุมมอง

จนถึงตอนนี้ เราเขียนโปรแกรม แบบ Procedural – คิดเป็น “คำสั่ง (Instructions)” และ “ข้อมูล (Data)” แยกกัน

ตั้งแต่บัดนี้ต้อง เปลี่ยนมุมมองให้คิดแบบ Object-Oriented – คิดเป็น “วัตถุ (Objects)” ที่มีอยู่ในโลกจริง แต่ละวัตถุมีทั้ง “สถานะ (State)” และ “พฤติกรรม (Behavior)”

ทำไมต้องคิดแบบนี้?

  • ตรงกับความคิดของมนุษย์มากกว่า
  • ง่ายต่อการออกแบบระบบใหญ่
  • โค้ดสามารถขยายและดูแลรักษาได้ง่ายกว่า
ยาวไปอยากเลือกอ่าน
  1. บทนำ: การเปลี่ยนมุมมอง
  2. Object: วัตถุในโปรแกรม
  3. Object คืออะไร?
  4. State: สถานะ (ข้อมูลของ Object)
  5. State คืออะไร?
  6. ตัวอย่าง: State ของ Student
  7. State แบบต่างๆ
  8. Behavior: พฤติกรรม (สิ่งที่ Object ทำได้)
  9. Behavior คืออะไร?
  10. ตัวอย่าง: Behavior ของ Bank Account
  11. ตัวอย่าง: Behavior ของ Student
  12. ตัวอย่าง: Behavior ของ Light Bulb
  13. ความสัมพันธ์ระหว่าง State และ Behavior
  14. Behavior นำไปสู่การเปลี่ยนแปลง State
  15. ตัวอย่างที่ 1: ระบบสินค้าในตะกร้า (Shopping Cart)
  16. State ของ Cart Item
  17. ตัวอย่างที่ 2: ระบบจัดการอุณหภูมิ (Temperature Control)
  18. State ของ Thermostat
  19. ตัวอย่างที่ 3: ระบบจัดการพนักงาน (Employee Management)
  20. State ของ Employee
  21. ตัวอย่างที่ 4: ระบบการจัดการเกม (Game Character)
  22. State ของ Character ในเกม
  23. แบบแผน: State & Behavior Pattern
  24. Template
  25. วิธีเลียน Object จากโลกจริง
  26. ขั้นตอนการคิด Object
  27. ขั้นตอนที่ 1: เลือกสิ่งของจริง
  28. ขั้นตอนที่ 2: ระบุ State
  29. ขั้นตอนที่ 3: ระบุ Behavior
  30. ขั้นตอนที่ 4: คิดความสัมพันธ์
  31. ตัวอย่างการคิด Object: ระบบห้องสมุด (Library System)
  32. ขั้นตอนที่ 1: เลือก Objects
  33. ขั้นตอนที่ 2: ระบุ State ของแต่ละ Object
  34. ขั้นตอนที่ 3: ระบุ Behavior
  35. ขั้นตอนที่ 4: ทำการเปลี่ยนแปลง State
  36. สรุป: Object = State + Behavior
  37. ตัวอย่างสุดท้าย: การประมวลผลการสั่งซื้อ

Object: วัตถุในโปรแกรม

Object คืออะไร?

Object คือ สิ่งมีตัวตนเดียว ที่มี:

  1. State (สถานะ) – ข้อมูลที่อธิบายว่า object นี้เป็นแบบไหน
  2. 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 เพิ่ม