บทเรียนที่ 2 • Introduction to Object-Orientation and Abstractions

การนำไปสู่หลักการเชิงวัตถุและแนวคิดเชิงนามธรรม

บทเรียนนี้ต่อยอดจากบทที่ 1 โดยอธิบายว่า Object-Orientation คืออะไร ทำไมต้องมองระบบผ่าน Problem Domain, Class, Object และ Abstraction พร้อมลงรายละเอียดความสัมพันธ์สำคัญ ได้แก่ Association, Aggregation, Generalization และ Specialization

ObjectClient / Server
Abstractionคิดเชิงนามธรรม
RelationsAssociation / Aggregation
Lesson Roadmap

จาก Object → Abstraction

1
Object-Orientation
Relationship, Interaction, Event-driven
2
Problem Domain
Object, Class, Abstract Object, Attribute, Function
3
OOSE
OOA, OOD, OOP และ Object-Oriented Project
4
Abstractions
Classification, Association, Aggregation, Generalization
ผู้สอน
ผู้ช่วยศาสตราจารย์ ดร. นัฐพงศ์ ส่งเนียม
xnattapong@gmail.com
Chapter Introduction

บทที่ 2 เรียนเรื่องอะไร

บทที่ 2 เป็นบทที่พาผู้เรียน “เข้าสู่โลกของการออกแบบเชิงวัตถุ” อย่างเป็นระบบ หลังจากบทที่ 1 ได้ปูพื้นฐานเรื่อง Class, Object และหลักการเชิงวัตถุเบื้องต้นแล้ว บทนี้จะขยายความว่าเมื่อนำแนวคิดเชิงวัตถุไปใช้ในการวิเคราะห์และออกแบบระบบจริง เราต้องมองอะไรบ้าง และต้องแยกแยะ “สิ่งจริงในโลกจริง” ออกจาก “แบบจำลองในระบบคอมพิวเตอร์” อย่างไร

สไลด์บทนี้เริ่มจากการทบทวนความหมายของ Object-Orientation ผ่านแนวคิด Relationship และ Interaction จากนั้นเชื่อมไปสู่ Problem Domain ซึ่งเป็นขอบเขตของปัญหาหรือโลกจริงที่เรากำลังนำมาสร้างระบบ ต่อด้วยการอธิบาย Object, Class, Abstract Object, Attribute และ Function ก่อนเข้าสู่กระบวนการ OOSE ได้แก่ OOA, OOD และ OOP

ตอนท้ายของบทจะลงลึกเรื่อง Abstraction หรือแนวคิดเชิงนามธรรม ซึ่งเป็นหัวใจสำคัญของ OOAD เพราะนักวิเคราะห์ระบบต้องสามารถ “เลือกเฉพาะสิ่งที่สำคัญ” จากโลกจริง เพื่อนำไปสร้างเป็น Class, Object และความสัมพันธ์ในระบบได้

วัตถุประสงค์การเรียนรู้
  • อธิบายแนวคิด Object-Orientation และการมองระบบเป็นวัตถุได้
  • เข้าใจคำศัพท์พื้นฐาน เช่น Problem Domain, Class, Object, Attribute และ Function
  • แยกความแตกต่างระหว่าง Real World และ Computer World ได้
  • อธิบาย Classification, Association, Aggregation, Generalization และ Specialization ได้
  • นำแนวคิด Abstraction ไปใช้วิเคราะห์ตัวอย่างระบบจริงได้
Object-Orientation

Object-Orientation คืออะไร

แนวคิดเชิงวัตถุไม่ได้เริ่มจากการถามว่า “โปรแกรมต้องมีคำสั่งอะไรบ้าง” แต่เริ่มจากการถามว่า “ในระบบมีวัตถุอะไรบ้าง และวัตถุเหล่านั้นสัมพันธ์กันอย่างไร”

มองระบบเป็นกลุ่มของ Object

การพัฒนาระบบแบบเชิงวัตถุเน้นที่ วัตถุ (Object) เป็นหลัก แต่ละ Object จะมีข้อมูลของตนเองและมีพฤติกรรมของตนเอง เช่น นักศึกษา อาจารย์ รถยนต์ ตู้ ATM หรือบัญชีธนาคาร เมื่อระบบทำงาน Object เหล่านี้จะส่งข้อความหรือเรียกใช้บริการระหว่างกัน

ตัวอย่างเช่น ในระบบให้คำปรึกษา นักศึกษาเป็น Client ที่ส่งคำขอปรึกษาไปยังอาจารย์ ส่วนอาจารย์ตอบกลับด้วยการให้คำปรึกษา ในระบบขนส่ง คนเป็น Client ที่ร้องขอบริการ “ขึ้นรถ” และรถยนต์เป็น Server ที่ให้บริการการเดินทาง

เกี่ยวข้องกับ Event-Driven Programming

สไลด์อธิบายว่าเมื่อโปรแกรมพัฒนาจากยุค DOS/Console Application ไปสู่ Desktop GUI, Web Application และ Mobile Application การทำงานของโปรแกรมเริ่มไม่ได้เป็นเส้นตรงอย่างเดียว แต่ตอบสนองต่อเหตุการณ์ เช่น คลิกปุ่ม เลือกเมนู พิมพ์ข้อมูล หรือแตะหน้าจอ

แนวคิดแบบ Event-driven และ Visual Programming จึงสอดคล้องกับ OOP เพราะใน GUI มักมีวัตถุต่าง ๆ เช่น Button, Menu, Textbox และแต่ละวัตถุมีเหตุการณ์และพฤติกรรมของตนเอง

ภาพประกอบ: จาก Console → GUI → Web/Mobile และ Object-Oriented
DOS / Console ทำงานตามลำดับคำสั่ง Input → Process → Output Desktop GUI Event-driven Button / Menu / Textbox Web Client / Server TCP/IP Mobile Touch App Objects Object-Oriented Thinking : มองทุกส่วนเป็นวัตถุที่มีข้อมูลและพฤติกรรม
ภาพนี้สรุปแนวคิดในสไลด์ช่วงต้นที่เปรียบเทียบยุค DOS/Console, Desktop GUI, Web Application และ Mobile Application กับแนวคิด Event-driven และ OOP
Relationship & Interaction

Relationship และ Interaction ระหว่าง Object

ในระบบเชิงวัตถุ Object ไม่ได้อยู่โดดเดี่ยว แต่มีความสัมพันธ์และโต้ตอบกัน ตัวอย่างในสไลด์ใช้ภาพ นักศึกษา (Client) กับ อาจารย์ (Server) นักศึกษามี Attribute เช่น ชื่อ นามสกุล รหัสนักศึกษา และมี Function เช่น ขอปรึกษา หรือเรียน ส่วนอาจารย์มี Attribute เช่น ชื่อ นามสกุล ตำแหน่ง และมี Function เช่น ให้คำปรึกษา

ความสัมพันธ์นี้ทำให้เห็นว่า Object หนึ่งสามารถ “ร้องขอ” การทำงานจากอีก Object หนึ่งได้ โดยไม่จำเป็นต้องรู้รายละเอียดภายในทั้งหมด เพียงรู้ว่าจะส่ง message อะไรไปและคาดหวังผลลัพธ์อะไรกลับมา

แนวคิดสำคัญ: Client คือผู้ร้องขอบริการ ส่วน Server คือผู้ให้บริการ ใน OOAD เรานำแนวคิดนี้มาอธิบายการสื่อสารระหว่าง Object ได้
ภาพประกอบ: นักศึกษาและอาจารย์ในมุมมอง Client/Server
Attributes • ชื่อ • นามสกุล • รหัสนักศึกษา Functions • ขอปรึกษา() • เรียน() นักศึกษา (Client) อาจารย์ (Server) ขอคำปรึกษา() ให้คำปรึกษา() อาจารย์ • ชื่อ • ตำแหน่ง • เบอร์โทร • สอน() • ตรวจ()
ภาพนี้ดัดแปลงแนวคิดจากตัวอย่างในสไลด์ที่ใช้ Client/Server เพื่ออธิบาย Object, Attribute, Function และ Interaction
ตัวอย่าง คนกับรถยนต์

อีกตัวอย่างหนึ่งในสไลด์คือ คนเป็น Client และรถยนต์เป็น Server คนมี Function คือ ขับ() ส่วนรถยนต์มี Function เช่น วิ่ง(), ถอยหลัง(), เลี้ยว()

// Conceptual Message
person.drive(car);
car.moveForward();
car.turnLeft();
car.stop();
1-Tier, 2-Tier และ N-Tier

สไลด์แสดงแนวคิดจาก Standalone Application ไปสู่ Client-Server และ Web-based/N-Tier เช่น Word/Accounting แบบเครื่องเดียว, MIS/HRM/Inventory แบบ 2-Tier และระบบ Web-based ที่มี Cloud/Server และ Client จำนวนมาก

1-Tier Standalone 2-Tier Client/Server N-Tier Web-based Mobile Client
Problem Domain

Problem Domain: มองโลกของปัญหาก่อนออกแบบระบบ

ก่อนออกแบบ Class หรือ Object เราต้องเข้าใจก่อนว่าปัญหาที่ต้องแก้คืออะไร อยู่ในบริบทใด และมีวัตถุใดเกี่ยวข้องบ้าง

Problem Domain คืออะไร

Problem Domain คือขอบเขตของโลกจริงที่ระบบต้องเข้าไปช่วยแก้ปัญหา เช่น ระบบ ATM, ระบบงานธนาคาร, เกม Puzzle Number, เกม TicTacToe หรือระบบทะเบียนนักศึกษา การเข้าใจ Problem Domain ช่วยให้เรารู้ว่า “มีสิ่งใดอยู่ในระบบ” และ “สิ่งเหล่านั้นทำงานหรือสัมพันธ์กันอย่างไร”

จากสไลด์มีตัวอย่างการแยกปัญหาแบบ Top-Down เช่น ปัญหาการทำงานของ ATM/ADM แตกออกเป็นเมนู ฝาก ถอน โอน อัปเดตสมุด หรือระบบงานธนาคารแตกออกเป็นระบบ Queue, ระบบบัญชีธนาคาร, สินเชื่อ และฝากเงิน

หลักคิด: ก่อนจะสร้าง Class Diagram ต้องรู้จัก Problem Domain ให้ดี ไม่เช่นนั้น Class ที่ได้อาจไม่ตรงกับโลกจริงของระบบ
ภาพประกอบ: Top-Down Design ของระบบ ATM/ADM
ปัญหาการทำงานของตู้ ATM/ADM เมนู ฝาก ถอน โอน รับเงินฝาก อัปเดตสมุด แสดงยอดคงเหลือ
ภาพนี้เรียบเรียงจากแนวคิดในสไลด์เรื่อง Top-Down Design และตัวอย่างปัญหาการทำงานของตู้ ATM/ADM
Object, Class & Abstract Object

Object, Class, Abstract Object, Attribute และ Function

หัวใจสำคัญของการวิเคราะห์เชิงวัตถุคือการแยกให้ได้ว่าอะไรคือวัตถุ อะไรคือคลาส และอะไรคือคุณสมบัติหรือพฤติกรรมของสิ่งนั้น

Object กับ Class ต่างกันอย่างไร

Object คือสิ่งใดสิ่งหนึ่งที่มีอยู่ในโลกจริงหรือในระบบ เช่น แมวสีแดง แมวสีขาว แมวสีดำ, อาจารย์นัฐพงศ์, รถยนต์โตโยต้า หรือโทรศัพท์มือถือเครื่องหนึ่ง ส่วน Class คือแบบจำลองหรือหมวดหมู่ที่ใช้รวม Object ที่มีคุณสมบัติร่วมกัน เช่น แมว, อาจารย์, รถยนต์ หรือโทรศัพท์มือถือ

สไลด์ยกตัวอย่าง อาจารย์ โดยมี Attribute เช่น ชื่อ ตำแหน่ง เบอร์โทร อีเมล และมี Function เช่น สอน เช็คชื่อ ออกข้อสอบ ตรวจข้อสอบ ตัดเกรด ตัวอย่างนี้ช่วยให้เห็นว่า Class ไม่ได้มีเพียงข้อมูล แต่ยังรวมพฤติกรรมที่เกี่ยวข้องกับบทบาทนั้นด้วย

// ตัวอย่างแนวคิด Class fruit จากสไลด์
class fruit {
  private Color color;
  private double weight;
  private String name;
  private Seed seed;

  public void eatable() { }
  public void setName(n) { name = n; }
  public String getName(){ return name; }
}
ภาพประกอบ: Classification Abstraction ของแมว
Class: แมว มีขา • มีหาง • จับหนูได้ แมวสีแดง Object แมวสีขาว Object แมวสีดำ Object Object หลายตัวที่มีคุณสมบัติร่วมกัน ถูกจัดเป็น Class เดียวกัน
ภาพนี้เรียบเรียงจากตัวอย่างในสไลด์ที่ใช้แมวสีต่าง ๆ เพื่ออธิบาย Classification Abstraction
Attribute

ข้อมูลหรือคุณลักษณะของ Object/Class เช่น ชื่อ รุ่น ยี่ห้อ ราคา สี น้ำหนัก ตำแหน่ง เบอร์โทร

Function / Method

พฤติกรรมหรือความสามารถ เช่น สอน(), ตรวจข้อสอบ(), วิ่ง(), ให้ความเย็น(), โทรออก()

PDT และ ADT

Primitive Data Type เช่น integer, floating-point, char ส่วน Abstract Data Type เป็นชนิดข้อมูลที่ซับซ้อนขึ้นและมีพฤติกรรมร่วมด้วย

OOSE

Object-Oriented Software Engineering

การทำงานเชิงวัตถุไม่ได้หมายถึงการเขียนโปรแกรมเท่านั้น แต่ครอบคลุมตั้งแต่การวิเคราะห์ ออกแบบ ไปจนถึงการพัฒนาและจัดการโครงงาน

OOA

Object-Oriented Analysis

การวิเคราะห์ระบบโดยค้นหา Object, Class, Relationship และ Requirement จาก Problem Domain

วิเคราะห์สิ่งที่ระบบต้องมี
OOD

Object-Oriented Design

การออกแบบโครงสร้างระบบ เช่น Class Diagram, Interaction, Interface, Component และการจัดความสัมพันธ์

ออกแบบก่อนพัฒนา
OOP

Object-Oriented Programming

การนำแบบออกแบบไปเขียนโปรแกรมจริงด้วยภาษาเชิงวัตถุ เช่น Java, C#, VB.NET, Python หรือภาษาอื่น

เขียนโปรแกรมจริง
ลำดับที่ควรเข้าใจ: OOA ช่วยตอบว่า “ระบบควรมีอะไร” → OOD ช่วยตอบว่า “ควรออกแบบอย่างไร” → OOP ช่วยตอบว่า “จะเขียนให้ทำงานจริงอย่างไร”
Abstractions

Abstraction: การคิดเชิงนามธรรม

Abstraction คือการเลือกมองเฉพาะประเด็นที่สำคัญต่อระบบ และละรายละเอียดที่ยังไม่จำเป็นออกไป

Abstraction สำคัญอย่างไร

ในโลกจริง สิ่งหนึ่งสิ่งมีรายละเอียดจำนวนมาก แต่ในการออกแบบระบบ เราไม่จำเป็นต้องนำทุกอย่างเข้ามาในแบบจำลอง เช่น ถ้าจะออกแบบระบบทะเบียนนักศึกษา เราอาจสนใจรหัสนักศึกษา ชื่อ คณะ และสถานะการลงทะเบียน แต่ไม่จำเป็นต้องสนใจสีรองเท้าหรืออาหารที่ชอบ

สไลด์บทนี้อธิบาย Abstraction หลายแบบ เช่น Classification Abstraction, Association Abstraction, Aggregation Abstraction และ Generalization/Specialization ซึ่งเป็นเครื่องมือทางความคิดสำหรับจัดระเบียบวัตถุในระบบ

สรุปสั้น ๆ: Abstraction คือการลดความซับซ้อนของโลกจริงให้กลายเป็นแบบจำลองที่นำไปออกแบบระบบได้
ภาพประกอบ: Real World → Concept → Computer World
Real World รถยนต์โตโยต้า รถจักรยานยนต์ซูซูกิ เรืออันดามันปริ๊นเซส รถไฟ รถจักรยาน BMX Concept ยานพาหนะ เคลื่อนที่ได้ โดยสารได้ Computer World class Vehicle brand model move() transport()
ภาพนี้สรุปแนวคิดจากสไลด์เรื่อง Real world, Computer world และ Concept โดยใช้ตัวอย่างยานพาหนะ
Classification Abstraction

การจัดกลุ่ม Object ที่มีคุณสมบัติร่วมกันให้เป็น Class เช่น แมวสีแดง แมวสีขาว และแมวสีดำ เป็น Object ที่จัดอยู่ใน Class “แมว”

Object จัดกลุ่ม Class
Association Abstraction

การมองความสัมพันธ์ระหว่าง Object/Class เช่น คน “นั่ง” เครื่องบิน หรือ คน “จอง” ตั๋วเครื่องบิน ซึ่งเป็นความสัมพันธ์ที่มีความหมายในระบบ

Person --นั่ง--> Airplane
Person --จอง--> Ticket
Aggregation Abstraction

Aggregation: ความสัมพันธ์แบบส่วนประกอบ

Aggregation คือความสัมพันธ์แบบ “มีส่วนประกอบ” หรือ “ประกอบด้วย” เช่น รถยนต์ประกอบด้วยล้อ เครื่องยนต์ หลังคารถ กระจก ประตู ตัวถัง ที่นั่ง และพวงมาลัย ความสัมพันธ์นี้ช่วยให้นักวิเคราะห์ระบบเข้าใจว่า Object ใหญ่หนึ่งตัวประกอบด้วย Object ย่อยอะไรบ้าง

ในการออกแบบเชิงวัตถุ Aggregation ช่วยให้เราแบ่งระบบใหญ่เป็นส่วนย่อยที่จัดการง่ายขึ้น เช่น Computer ประกอบด้วย CPU, Monitor, Keyboard, Mouse หรือ Human ประกอบด้วย Head, Body, Arm, Leg

คำถามช่วยคิด: ถ้าไม่มีส่วนประกอบนี้ Object หลักยังคงมีอยู่ได้หรือไม่? ถ้าเป็นเพียงส่วนประกอบที่แยกออกได้ มักมองเป็น Aggregation
ภาพประกอบ: Aggregation ของรถยนต์
รถยนต์ ล้อ เครื่องยนต์ หลังคา กระจก ประตู พวงมาลัย Car has-a Wheel, Engine, Door, Steering Wheel ...
ภาพนี้เรียบเรียงจากสไลด์ที่ใช้รถยนต์เป็นตัวอย่าง Aggregation
Generalization & Specialization

Generalization และ Specialization

แนวคิดนี้ใช้จัดลำดับชั้นของ Class โดยดูคุณสมบัติร่วมและคุณสมบัติเฉพาะของแต่ละกลุ่ม

Generalization คืออะไร

Generalization คือการสรุปคุณสมบัติร่วมของหลาย Class ขึ้นไปไว้ใน Class ที่กว้างกว่า เช่น รถบรรทุก รถเก๋ง และรถสปอร์ต ต่างก็มีคุณสมบัติร่วมคือเป็น “รถยนต์” จึงสามารถดึงคุณสมบัติร่วม เช่น มีล้อ มีเครื่องยนต์ ไปไว้ที่ Class รถยนต์

Specialization คืออะไร

Specialization คือการสร้าง Class เฉพาะจาก Class ที่กว้างกว่า เช่น รถยนต์แตกออกเป็นรถบรรทุกและรถเก๋ง โดยรถบรรทุกมีความสามารถบรรทุกของ ส่วนรถเก๋งใช้โดยสาร และรถสปอร์ตเป็นความเฉพาะต่อจากรถเก๋งที่อาจวิ่งได้เร็วหรือเปิดประทุนได้

ภาพประกอบ: ลำดับชั้นของรถยนต์
รถยนต์ มีล้อ • มีเครื่องยนต์ รถบรรทุก บรรทุกของได้ รถเก๋ง ใช้โดยสาร มี 4 ประตู รถสปอร์ต Specialization จากล่างขึ้นบนคือ Generalization / จากบนลงล่างคือ Specialization
ภาพนี้สรุปตัวอย่างในสไลด์เรื่องรถยนต์ รถบรรทุก รถเก๋ง และรถสปอร์ต
ตัวอย่างสัตว์ปีก

สัตว์ปีกมีคุณสมบัติร่วมคือมีปีกและมีขา 2 ขา จากนั้นแตกเป็นนกและไก่ โดยนกบินได้ ไก่ขันได้ และไก่ชนเป็นความเฉพาะต่อจากไก่ที่ชนไก่ได้

ตัวอย่าง Computer

Computer อาจมองเป็น Concept ที่ใช้ไฟฟ้า มีการประมวลผล และจัดเก็บข้อมูลได้ แล้วแตกเป็น PC, Notebook, PDA หรืออุปกรณ์อื่น เช่น เครื่องคิดเลขไฟฟ้าและมือถือในบางบริบท

Summary

สรุปบทเรียนที่ 2

1) Object-Orientation เริ่มจากการมองโลกเป็น Object

Object มี Attribute, Function และมี Interaction กับ Object อื่น

2) Problem Domain คือโลกของปัญหา

ก่อนออกแบบระบบต้องเข้าใจวัตถุและบริบทในโลกจริงก่อน

3) OOSE ครอบคลุม OOA, OOD และ OOP

วิเคราะห์ก่อน ออกแบบก่อน แล้วจึงพัฒนาเป็นโปรแกรม

4) Abstraction ช่วยลดความซับซ้อน

เลือกเฉพาะข้อมูลและพฤติกรรมที่สำคัญต่อระบบ

5) ความสัมพันธ์คือหัวใจของแบบจำลอง

Association, Aggregation, Generalization และ Specialization ช่วยจัดระบบความคิดของ Class

แบบฝึกหัดท้ายบทที่ 2

  1. จงอธิบายความหมายของ Object-Orientation ด้วยภาษาของตนเอง พร้อมยกตัวอย่าง 1 ระบบ
  2. จงอธิบายความแตกต่างระหว่าง Object และ Class โดยใช้ตัวอย่างจากชีวิตประจำวัน
  3. ให้เลือก Problem Domain 1 เรื่อง เช่น ระบบ ATM, ระบบธนาคาร หรือระบบร้านค้า แล้วระบุ Object ที่เกี่ยวข้องอย่างน้อย 5 ตัว
  4. จงยกตัวอย่าง Association Abstraction เช่น คนจองตั๋วเครื่องบิน หรืออาจารย์สอนวิชา พร้อมอธิบายความสัมพันธ์
  5. จงเขียน Aggregation ของสิ่งใดสิ่งหนึ่ง เช่น Computer, Human, รถยนต์ หรือมหาวิทยาลัย
  6. จงเขียน Generalization/Specialization ของสัตว์บก หรืออุปกรณ์คอมพิวเตอร์ อย่างน้อย 3 ระดับ
  7. จงให้ Concept ของสิ่งต่อไปนี้ เลือกทำ 5 ข้อ: Notebook, โทรศัพท์มือถือ, โทรทัศน์, คน, โรงพยาบาล, ตู้เย็น, ธนาคาร, ตู้ ATM, ห้องปฏิบัติการคอมพิวเตอร์, มหาวิทยาลัย
แนวทางการตอบ: พยายามแยกให้ได้ว่าอะไรคือ Class, Object, Attribute, Function และความสัมพันธ์ ถ้าเป็นงานออกแบบเชิงวัตถุที่ดี ควรสะท้อนโลกจริงของระบบและนำไปวาด UML ต่อได้

เรียนจบบทที่ 2 แล้ว

บทถัดไปจะต่อยอดจากแนวคิดเชิงวัตถุและนามธรรม ไปสู่กระบวนการพัฒนาระบบแบบ Unified Process และกรอบการทำงานในโครงการ OOAD