Objects คืออะไร?
บทความนี้เป็นบทความที่ต่อเนื่องจาก "Object-Oriented Programming (OOP) คืออะไรกันแน่?" โดยในบทความนี้เราจะมาดูกันว่าออบเจกต์ใน Java หน้าตาเป็นอย่างไร? และโปรแกรมยอดฮิตอย่าง Hello World ในเวอร์ชันของ OOP มันควรจะเป็นแบบไหน?
ออบเจกต์คืออะไร?
เรารู้แล้วว่าการเขียนโปรแกรมแบบ OOP ก็คือการแบ่งแอพพลิเคชันออกเป็นออบเจกต์ย่อยๆ แล้วออบเจกต์หน้าตาเป็นอย่างไร? ออบเจกต์ในทางปฏิบัติก็คือคลาส (Class) หากเราอยากได้ออบเจกต์มาใช้งาน เราก็ต้องเขียนคลาสขึ้นมา ตอนเราเขียนโค้ด (ในไฟล์เก็บในฮาร์ดดิสก์) เราก็เรียกมันว่าคลาส แต่พอเราจะรันใช้งานมันคลาสถูกโหลดมาอยู่ในเมมโมรี่ เราจะเรียกสถานภาพนั้นว่าออบเจกต์ ดังนั้นคลาสจึงเปรียบเสมือนต้นแบบของออบเจกต์ (Blueprint of Objects) และเมื่อเราเปิด IDE/Editor ขึ้นมาทุกครั้ง เราเปิดมาก็เพื่อเขียนคลาส แล้วภายในคลาสเขียนอะไรได้บ้าง? คลาสประกอบไปด้วยสองอย่างหลักๆคือ
- ตัวแปร (Variable/Attribute)
- เมธอด (Method/Operation)
ตัวแปรใช้สำหรับเก็บค่า แม้ว่าข้อมูลต่างๆจะถูกเก็บอยู่ในระบบฐานข้อมูลหรือไฟล์ แต่ค่าข้อมูลเหล่านั้นก็ต้องถูกโหลดมาอยู่ในเมมโมรี่ก่อนประมวลผล และเจ้าพื้นที่ในเมมโมรีที่เก็บค่าเหล่านั้นเราเรียกมันว่าตัวแปรนั่นเอง เช่น ตัวแปรเก็บรหัสสินค้า, ตัวแปรเก็บชื่อลูกค้า เป็นต้น ส่วนเมธอดคือที่ที่เราเขียนโค้ด Logic ประมวลผลต่างๆ เช่นโค้ดคิดราคารวม, โค้ดแสดงจำนวนสินค้า, โค้ดดึงข้อมูลออกจากระบบฐานข้อมูล เป็นต้น ไม่ว่าคลาสหรือออบเจกต์นั้นจะอยู่ในบทบาทอะไรของแอพพลิเคชัน มันก็จะมีตัวแปรและเมธอดที่เกี่ยวข้องกับบทบาทนั้นๆเสมอ
มาลองดูตัวอย่างกัน สมมุติว่าผมต้องการทำแอพพลิเคชันสำหรับบริหารจัดการข้อมูลพนักงาน (Employee Management System) ผมก็จะออกแบบให้มีคลาส Employee
โดยมันรับบทบาทหน้าที่เป็น Model หรือ Entity นั่นก็คือเป็นตัวแทนของข้อมูล ดูตัวอย่างก่อนแล้วกันดังนี้
public class Employee{
public int id;
public String name;
public double salary;
public String getDetails(){
return (id + ", " + name + ", " + salary);
}
}
อันนี้เป็นตัวอย่างแบบง่ายๆนะครับจึงไม่ได้ใส่รายละเอียดมาก แต่จะเห็นได้ว่ามันประกอบไปด้วยตัวแปรเก็บข้อมูลของความเป็นพนักงานคนหนึ่ง (id
,name
,salary
) และมีเมธอด getDetails()
เพื่อรีเทิร์นรายละเอียดข้อมูลของพนักงานคนนั้นๆ ไม่ว่าเราจะใช้เทคโนโลยีใดในการจัดเก็บข้อมูล สุดท้ายมันก็จะถูกโหลดมาอยู่ในรูปของออบเจกต์ Employee
ในแอพพลิเคชันของเราเสมอ ทีนี้ถ้าเราจะทดลองรันใช้งานคลาส Employee
เราจำเป็นต้องสร้างคลาสใหม่ขึ้นมาเพื่อใช้ทดสอบ นั่นก็คือคลาสที่ประกอบไปด้วยเมธอด main()
ซึ่งจะต้องมีรูปแบบดังนี้:
public static void main(String [] args)
แล้วทำไมเราไม่เขียนเมธอด main()
ไว้ภายในคลาส Employee
ซะเลยหล่ะ? ทั้งนี้เพราะคลาส Employee
ไม่ได้อยู่ในบทบาทที่ใช้รันแอพพลิเคชัน ไม่ว่าแอพพลิเคชันของเราจะประกอบไปด้วยคลาสมากมายเพียงใดก็ตาม เราเพียงต้องการคลาส main เพียงคลาสเดียวเท่านั้นที่ใช้สำหรับรันแอพพลิเคชัน แต่ตอนนี้เราต้องการคลาสสำหรับทดสอบออบเจกต์ เราจึงสร้าง TestEmployee.java ขึ้นมาดังแสดงในตัวอย่างที่ 2
public class TestEmployee{
public static void main(String [] args){
Employee emp1 = new Employee();
emp1.id = 1;
emp1.name = "James";
emp1.salary = 15000;
System.out.println( emp1.getDetails() );
}
}
จะเห็นได้ว่าเราโหลดออบเจกต์ Employee
จากคลาสที่เราสร้างด้วยคีย์เวิร์ด new
จากนั้นเราจึงเข้าถึงตัวแปรในออบเจกต์เพื่อกำหนดค่าด้วยเครื่องหมายจุด ".
" เช่น emp1.id
เป็นต้น จากตัวอย่างข้างต้นถ้าเราต้องการสองออบเจกต์ เราจะต้อง new
สองครั้ง เริ่มเห็นความแตกต่างของคลาสกับออบเจกต์หรือยังครับ? คลาสเป็นเพียงแค่โครงของออบเจกต์ไม่มีค่าข้อมูลใดๆ แต่ทว่าเมื่อโหลดมาอยู่ในเมมโมรี่เป็นออบเจกต์แล้วมันสามารถมีค่าข้อมูลได้ และจะโหลดเป็นกี่ออบเจกต์ก็ได้ สุดท้ายเราทดลองพิมพ์ค่าออกแสดงที่ Command Line (CLI) โดยการเรียกเมธอด System.out.println()
โดยค่าที่พิมพ์นั้นได้จากการเรียกเมธอด getDetails()
ของแต่ละออบเจกต์อีกทีหนึ่ง รูปที่ 1 แสดงภาพจำลองในเมมโมรี่ของการโหลดออบเจกต์ Employee
Employee
เท่านี้เราก็ได้ตัวอย่างออบเจกต์แบบง่ายๆและพร้อมที่จะพัฒนามันต่อไปให้กลายเป็นแอพพลิเคชันที่สมบูรณ์แบบแล้ว เพียงแค่เราเปลี่ยนโค้ดจากการกำหนดค่าข้อมูลพนักงานแบบตายตัว เช่น emp1.id = 1
ไปเป็นการดึงค่าจากระบบฐานข้อมูลขึ้นมา และเปลี่ยนการแสดงผลจากแบบ CLI ไปเป็นการแสดงผลแบบ GUI แทนดังแสดงในรูปที่ 2 พอเห็นภาพแล้วใช่ไหมครับ :)
Employee
บทสรุป
และนี่ก็คือตัวอย่าง Hello World แบบง่ายๆในแบบของ OOP แทนที่จะ System.out.println("Hello World")
มันตรงๆทื่อๆ ก็เปลี่ยนมาเป็นการโหลดออบเจกต์ และพิมพ์ค่าที่อยู่ในออบเจกต์แทนเท่านั้น สุดท้ายผมหวังว่าบทความนี้จะช่วยให้คุณเริ่มต้นศึกษาภาษาแบบ Object-Oriented ได้ดีและง่ายขึ้นนะครับ ว่าแต่ถ้าจะเขียน Hello World แบบแท้ๆและเป็น OOP จะได้ไหมเอ่ย? ลองหาคำตอบดูเองนะครับ ผมไม่เฉลย :p