บทเรียนนี้ต่อยอดจากบทที่ 1 โดยอธิบายว่า Object-Orientation คืออะไร ทำไมต้องมองระบบผ่าน Problem Domain, Class, Object และ Abstraction พร้อมลงรายละเอียดความสัมพันธ์สำคัญ ได้แก่ Association, Aggregation, Generalization และ Specialization
บทที่ 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) เป็นหลัก แต่ละ Object จะมีข้อมูลของตนเองและมีพฤติกรรมของตนเอง เช่น นักศึกษา อาจารย์ รถยนต์ ตู้ ATM หรือบัญชีธนาคาร เมื่อระบบทำงาน Object เหล่านี้จะส่งข้อความหรือเรียกใช้บริการระหว่างกัน
ตัวอย่างเช่น ในระบบให้คำปรึกษา นักศึกษาเป็น Client ที่ส่งคำขอปรึกษาไปยังอาจารย์ ส่วนอาจารย์ตอบกลับด้วยการให้คำปรึกษา ในระบบขนส่ง คนเป็น Client ที่ร้องขอบริการ “ขึ้นรถ” และรถยนต์เป็น Server ที่ให้บริการการเดินทาง
สไลด์อธิบายว่าเมื่อโปรแกรมพัฒนาจากยุค DOS/Console Application ไปสู่ Desktop GUI, Web Application และ Mobile Application การทำงานของโปรแกรมเริ่มไม่ได้เป็นเส้นตรงอย่างเดียว แต่ตอบสนองต่อเหตุการณ์ เช่น คลิกปุ่ม เลือกเมนู พิมพ์ข้อมูล หรือแตะหน้าจอ
แนวคิดแบบ Event-driven และ Visual Programming จึงสอดคล้องกับ OOP เพราะใน GUI มักมีวัตถุต่าง ๆ เช่น Button, Menu, Textbox และแต่ละวัตถุมีเหตุการณ์และพฤติกรรมของตนเอง
ในระบบเชิงวัตถุ Object ไม่ได้อยู่โดดเดี่ยว แต่มีความสัมพันธ์และโต้ตอบกัน ตัวอย่างในสไลด์ใช้ภาพ นักศึกษา (Client) กับ อาจารย์ (Server) นักศึกษามี Attribute เช่น ชื่อ นามสกุล รหัสนักศึกษา และมี Function เช่น ขอปรึกษา หรือเรียน ส่วนอาจารย์มี Attribute เช่น ชื่อ นามสกุล ตำแหน่ง และมี Function เช่น ให้คำปรึกษา
ความสัมพันธ์นี้ทำให้เห็นว่า Object หนึ่งสามารถ “ร้องขอ” การทำงานจากอีก Object หนึ่งได้ โดยไม่จำเป็นต้องรู้รายละเอียดภายในทั้งหมด เพียงรู้ว่าจะส่ง message อะไรไปและคาดหวังผลลัพธ์อะไรกลับมา
อีกตัวอย่างหนึ่งในสไลด์คือ คนเป็น Client และรถยนต์เป็น Server คนมี Function คือ ขับ() ส่วนรถยนต์มี Function เช่น วิ่ง(), ถอยหลัง(), เลี้ยว()
สไลด์แสดงแนวคิดจาก Standalone Application ไปสู่ Client-Server และ Web-based/N-Tier เช่น Word/Accounting แบบเครื่องเดียว, MIS/HRM/Inventory แบบ 2-Tier และระบบ Web-based ที่มี Cloud/Server และ Client จำนวนมาก
ก่อนออกแบบ Class หรือ Object เราต้องเข้าใจก่อนว่าปัญหาที่ต้องแก้คืออะไร อยู่ในบริบทใด และมีวัตถุใดเกี่ยวข้องบ้าง
Problem Domain คือขอบเขตของโลกจริงที่ระบบต้องเข้าไปช่วยแก้ปัญหา เช่น ระบบ ATM, ระบบงานธนาคาร, เกม Puzzle Number, เกม TicTacToe หรือระบบทะเบียนนักศึกษา การเข้าใจ Problem Domain ช่วยให้เรารู้ว่า “มีสิ่งใดอยู่ในระบบ” และ “สิ่งเหล่านั้นทำงานหรือสัมพันธ์กันอย่างไร”
จากสไลด์มีตัวอย่างการแยกปัญหาแบบ Top-Down เช่น ปัญหาการทำงานของ ATM/ADM แตกออกเป็นเมนู ฝาก ถอน โอน อัปเดตสมุด หรือระบบงานธนาคารแตกออกเป็นระบบ Queue, ระบบบัญชีธนาคาร, สินเชื่อ และฝากเงิน
หัวใจสำคัญของการวิเคราะห์เชิงวัตถุคือการแยกให้ได้ว่าอะไรคือวัตถุ อะไรคือคลาส และอะไรคือคุณสมบัติหรือพฤติกรรมของสิ่งนั้น
Object คือสิ่งใดสิ่งหนึ่งที่มีอยู่ในโลกจริงหรือในระบบ เช่น แมวสีแดง แมวสีขาว แมวสีดำ, อาจารย์นัฐพงศ์, รถยนต์โตโยต้า หรือโทรศัพท์มือถือเครื่องหนึ่ง ส่วน Class คือแบบจำลองหรือหมวดหมู่ที่ใช้รวม Object ที่มีคุณสมบัติร่วมกัน เช่น แมว, อาจารย์, รถยนต์ หรือโทรศัพท์มือถือ
สไลด์ยกตัวอย่าง อาจารย์ โดยมี Attribute เช่น ชื่อ ตำแหน่ง เบอร์โทร อีเมล และมี Function เช่น สอน เช็คชื่อ ออกข้อสอบ ตรวจข้อสอบ ตัดเกรด ตัวอย่างนี้ช่วยให้เห็นว่า Class ไม่ได้มีเพียงข้อมูล แต่ยังรวมพฤติกรรมที่เกี่ยวข้องกับบทบาทนั้นด้วย
ข้อมูลหรือคุณลักษณะของ Object/Class เช่น ชื่อ รุ่น ยี่ห้อ ราคา สี น้ำหนัก ตำแหน่ง เบอร์โทร
พฤติกรรมหรือความสามารถ เช่น สอน(), ตรวจข้อสอบ(), วิ่ง(), ให้ความเย็น(), โทรออก()
Primitive Data Type เช่น integer, floating-point, char ส่วน Abstract Data Type เป็นชนิดข้อมูลที่ซับซ้อนขึ้นและมีพฤติกรรมร่วมด้วย
การทำงานเชิงวัตถุไม่ได้หมายถึงการเขียนโปรแกรมเท่านั้น แต่ครอบคลุมตั้งแต่การวิเคราะห์ ออกแบบ ไปจนถึงการพัฒนาและจัดการโครงงาน
การวิเคราะห์ระบบโดยค้นหา Object, Class, Relationship และ Requirement จาก Problem Domain
วิเคราะห์สิ่งที่ระบบต้องมีการออกแบบโครงสร้างระบบ เช่น Class Diagram, Interaction, Interface, Component และการจัดความสัมพันธ์
ออกแบบก่อนพัฒนาการนำแบบออกแบบไปเขียนโปรแกรมจริงด้วยภาษาเชิงวัตถุ เช่น Java, C#, VB.NET, Python หรือภาษาอื่น
เขียนโปรแกรมจริงAbstraction คือการเลือกมองเฉพาะประเด็นที่สำคัญต่อระบบ และละรายละเอียดที่ยังไม่จำเป็นออกไป
ในโลกจริง สิ่งหนึ่งสิ่งมีรายละเอียดจำนวนมาก แต่ในการออกแบบระบบ เราไม่จำเป็นต้องนำทุกอย่างเข้ามาในแบบจำลอง เช่น ถ้าจะออกแบบระบบทะเบียนนักศึกษา เราอาจสนใจรหัสนักศึกษา ชื่อ คณะ และสถานะการลงทะเบียน แต่ไม่จำเป็นต้องสนใจสีรองเท้าหรืออาหารที่ชอบ
สไลด์บทนี้อธิบาย Abstraction หลายแบบ เช่น Classification Abstraction, Association Abstraction, Aggregation Abstraction และ Generalization/Specialization ซึ่งเป็นเครื่องมือทางความคิดสำหรับจัดระเบียบวัตถุในระบบ
การจัดกลุ่ม Object ที่มีคุณสมบัติร่วมกันให้เป็น Class เช่น แมวสีแดง แมวสีขาว และแมวสีดำ เป็น Object ที่จัดอยู่ใน Class “แมว”
การมองความสัมพันธ์ระหว่าง Object/Class เช่น คน “นั่ง” เครื่องบิน หรือ คน “จอง” ตั๋วเครื่องบิน ซึ่งเป็นความสัมพันธ์ที่มีความหมายในระบบ
Aggregation คือความสัมพันธ์แบบ “มีส่วนประกอบ” หรือ “ประกอบด้วย” เช่น รถยนต์ประกอบด้วยล้อ เครื่องยนต์ หลังคารถ กระจก ประตู ตัวถัง ที่นั่ง และพวงมาลัย ความสัมพันธ์นี้ช่วยให้นักวิเคราะห์ระบบเข้าใจว่า Object ใหญ่หนึ่งตัวประกอบด้วย Object ย่อยอะไรบ้าง
ในการออกแบบเชิงวัตถุ Aggregation ช่วยให้เราแบ่งระบบใหญ่เป็นส่วนย่อยที่จัดการง่ายขึ้น เช่น Computer ประกอบด้วย CPU, Monitor, Keyboard, Mouse หรือ Human ประกอบด้วย Head, Body, Arm, Leg
แนวคิดนี้ใช้จัดลำดับชั้นของ Class โดยดูคุณสมบัติร่วมและคุณสมบัติเฉพาะของแต่ละกลุ่ม
Generalization คือการสรุปคุณสมบัติร่วมของหลาย Class ขึ้นไปไว้ใน Class ที่กว้างกว่า เช่น รถบรรทุก รถเก๋ง และรถสปอร์ต ต่างก็มีคุณสมบัติร่วมคือเป็น “รถยนต์” จึงสามารถดึงคุณสมบัติร่วม เช่น มีล้อ มีเครื่องยนต์ ไปไว้ที่ Class รถยนต์
Specialization คือการสร้าง Class เฉพาะจาก Class ที่กว้างกว่า เช่น รถยนต์แตกออกเป็นรถบรรทุกและรถเก๋ง โดยรถบรรทุกมีความสามารถบรรทุกของ ส่วนรถเก๋งใช้โดยสาร และรถสปอร์ตเป็นความเฉพาะต่อจากรถเก๋งที่อาจวิ่งได้เร็วหรือเปิดประทุนได้
สัตว์ปีกมีคุณสมบัติร่วมคือมีปีกและมีขา 2 ขา จากนั้นแตกเป็นนกและไก่ โดยนกบินได้ ไก่ขันได้ และไก่ชนเป็นความเฉพาะต่อจากไก่ที่ชนไก่ได้
Computer อาจมองเป็น Concept ที่ใช้ไฟฟ้า มีการประมวลผล และจัดเก็บข้อมูลได้ แล้วแตกเป็น PC, Notebook, PDA หรืออุปกรณ์อื่น เช่น เครื่องคิดเลขไฟฟ้าและมือถือในบางบริบท
Object มี Attribute, Function และมี Interaction กับ Object อื่น
ก่อนออกแบบระบบต้องเข้าใจวัตถุและบริบทในโลกจริงก่อน
วิเคราะห์ก่อน ออกแบบก่อน แล้วจึงพัฒนาเป็นโปรแกรม
เลือกเฉพาะข้อมูลและพฤติกรรมที่สำคัญต่อระบบ
Association, Aggregation, Generalization และ Specialization ช่วยจัดระบบความคิดของ Class
บทถัดไปจะต่อยอดจากแนวคิดเชิงวัตถุและนามธรรม ไปสู่กระบวนการพัฒนาระบบแบบ Unified Process และกรอบการทำงานในโครงการ OOAD