วันจันทร์ที่ 19 มกราคม พ.ศ. 2552

บทที่ 1 แนะนำการเขียนโปรแกรมเชิงวัตถุ

บทที่ 1 แนะนำการเขียนโปรแกรมเชิงวัตถุ



โอโอพี (OOP) หรือออบเจ็กต์โอเรียนเท็ดโปรแกรมมิ่ง (Object Oriented Programming) เป็นแนวคิดในการเขียนโปรแกรมแบบหนึ่ง ที่ผู้รู้หลายๆ ท่านได้สรุปหรือได้ให้คำนิยามไว้ว่า เป็นการเขียนโปรแกรมเชิงวัตถุ บางท่านก็สรุปว่าเป็นการเขียนโปรแกรมแบบอ้างอิงวัตถุ ซึ่งก็เป็นการให้ความหมายที่ตรงมากเลยทีเดียว

OOP เป็นวิธีการเขียนโปรแกรม โดยอาศัยแนวคิดของวัตถุชิ้นหนึ่ง มีความสามารถในการปกป้องข้อมูล และการสืบทอดคุณสมบัติ ซึ่งทำให้แนวโน้มของ OOP ได้รับการยอมรับและพัฒนามาใช้ในระบบต่างๆ มากมาย เช่น ระบบปฏิบัติการ วินโดวส์ เป็นต้น

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



ความเป็นมาของแนวคิดแบบ OOP

แนวความคิดดั้งเดิมของการเขียนโปรแกรม ก็คือ การแก้ปัญหาโดยใช้คอมพิวเตอร์เป็นเครื่องมือ แนวคิดนี้คล้ายกับการใช้เครื่องคิดเลขในการแก้ปัญหาทางคณิตศาสตร์ ดังนั้น การพัฒนาตัวล่ามแปลภาษาไม่ว่าจะเป็นภาษาเครื่อง ภาษาแอสเซมบลี ภาษาซี และภาษาอื่นๆ ก็มีแนวการเขียนโปรแกรมแบบเดียวกัน เพียงแต่เปลี่ยนรูปแบบและกฎเกณฑ์ของภาษาเท่านั้น ด้วยเหตุนี้เอง เมื่อมีการเสนอแนวคิดใหม่ในการเขียนโปรแกรมทีเรียกว่า การเขียนโปรแกรมเชิงวัตถุ นักเขียนโปรแกรมรุ่นเก่าๆ ก็ทำความเข้าใจได้ยาก

แนวความคิดแบบใหม่ที่ใช้ในการเขียนโปรแกรม ก็คือ การเน้นถึงปัญหาและองค์ประกอบของปัญหา (เพื่อแก้ปัญหา) การเน้นที่ปัญหาและองค์ประกอบของการแก้ปัญหา (Problem Space) จะคล้ายกับการแก้ไขปัญหาและชีวิตความเป็นอยู่ของมนุษย์ที่จะต้องมี คน สัตว์ สิ่งของ เพื่อแก้ปัญหา (มีหน้าที่แก้ปัญหา) มากกว่าจะมองที่วิธีการแก้ปัญหานั้นๆ หรือขั้นตอนในการแก้ปัญหา (Solution Space) ซึ่งเป็นวิธีการเขียนโปรแกรมแบบเก่านั่นเอง

อาลัน เคย์ (Alan Kay) เป็นผู้บุกเบิกแนวความคิดการเขียนโปรแกรมเชิงวัตถุคนหนึ่ง และเป็นผู้ที่มีส่วนในการพัฒนาตัวแปลภาษา Small Talk ที่เป็นต้นแบบของการเขียนโปรแกรมเชิงวัตถุได้เสนอกฎ 5 ข้อ ที่เป็นแนวทางของภาษาคอมพิวเตอร์เชิงวัตถุ หรือที่เรียกว่า Object-Oriented Programming (OOP) ไว้ดังนี้

1.ทุกๆ สิ่งเป็นวัตถุ (Everything is an Object)

2.โปรแกรม ก็คือ กลุ่มของวัตถุที่ส่งข่าวสารบอกกันและกันให้ทำงาน (A Program is a Bunch of Object Telling Each Other What to do by Sending Messages)

3.ในวัตถุแต่ละวัตถุจะต้องมีหน่วยความจำและประกอบไปด้วยวัตถุอื่นๆ (Each Object has Its Own Memory Made Up of Other Objects)

4.วัตถุทุกชนิดจะต้องจัดอยู่ในประเภทใดประเภทหนึ่ง (Every Object has a Type)

5.วัตถุที่จัดอยู่ในประเภทเดียวกันย่อมได้รับข่าวสารเหมือนกัน (All Objects of a Particular Type Can Receive the Same Messages)



แนวคิดแบบ OOP

ถ้าเราไม่มองในแง่มุมของการเขียนโปรแกรมเพียงอย่างเดียว ให้มองไปในภาพรวม มองไปในสิ่งรอบๆ ตัว เราสามารถบอกได้ว่าแนวคิดของ OOP ก็คือ “ธรรมชาติของวัตถุ” หมายความว่า OOP จะมองสิ่งแต่ละสิ่งถือเป็น “วัตถุชิ้นหนึ่ง” (Object) มันจะมีสีแดงหรือสีเขียวยาวหรือสั้น มันก็คือวัตถุชิ้นหนึ่งหมือนกัน และเราสามารถกำหนดประเภทหรือคลาสให้กับวัตถุเหล่านั้นได้ เช่น วัตถุสีแดงก็มารวมอยู่ในกลุ่มเดียวกัน หรือวัตถุที่มีขนาดยาวก็มารวมอยู่ในกลุ่มเดียวกัน เป็นต้น

นอกจากนี้ เมื่อ OOP มองทุกสิ่งถือเป็นวัตถุชิ้นหนึ่งแล้ว ยังสามารถคิดต่อไปอีกว่า

“วัตถุแต่ละอย่งนั้น ต่างก็มีลักษณะและวิธีการใช้งานเป็นของตัวเอง”

ประโยคนี้มีความหมายว่า วัตถุแต่ละชนิดหรือแต่ละชิ้นต่างก็มีรูปร่าง ลักษณะ และการใช้งาน (การกระทำ) ที่แตกต่างกันออกไป เราจะเรียนคุณลักษณะของวัตถุว่า แอตทริบิวต์ (Attribute) และจะเรียกวิธีการใช้งานวัตถุว่า เมธทอด (Method) ยกตัวอย่างเช่น

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

จากประโยคในข้างต้นเราสามารถจับใจความได้ว่า คุณลักษณะของวัตถุ (Attribute) ก็คือ “ยาวเรียว ภายในเป็นไส้ถ่าน” ส่วนการใช้งาน (Method) ก็คือ “ใช้มือจับและเขียนลงบนวัสดุรองรับ”


Object-> วัตถุ-> ดินสอ



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

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



ข้อควรรู้เกี่ยวกับ OOP

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



การเชื่อมต่อ (Interface)

อินเตอร์เฟส (Interface) หมายถึง การเชื่อมต่อ ถ้าเป็นการเชื่อมต่อระหว่างผู้ใช้กับคอมพิวเตอร์ จะเรียกการเชื่อมต่อนั้นว่า ยูสเซอร์อินเตอร์เฟส (User Interface) ซึ่งโดยปกติจะหมายถึง ส่วนของหน้าจอที่ผู้ใช้ส่ง (ติดต่อ) ให้คอมพิวเตอร์ทำงาน แต่ในการเขียนโปรแกรมเชิงวัตถุ การเชื่อมต่อยังรวมไปถึงวัตถุ (Object) เพราะในวัตถุจะต้องมีอินเตอร์เฟส อันเป็นส่วนที่วัตถุนั้นๆ จะให้บริการหรือเป็นส่วนที่บอกว่าวัตถุนั้นๆ สามารถทำอะไรได้บ้าง ซึ่งบางครั้งเรียกว่า เมธทอด (Method)

ข้อดีของการมีอินเตอร์เฟส ก็คือ การเปลี่ยนแปลงที่เกิดขึ้นภายในวัตถุจะไม่กระทบต่ออินเตอร์เฟส ดังนั้น ภายในวัตถุผู้เขียนคำสั่งสามารถดัดแปลง แก้ไข หรือเพิ่มเติมได้ตลอดเวลา นอกจากนี้ ภายในวัตถุยังสามารถเก็บค่าต่างๆ ได้อีกด้วย แนวความคิดนี้เองที่เป็นจุดเด่นของการเขียนโปรแกรมเชิงวัตถุ เนื่องจากผู้ใช้สามารถเรียกใช้วัตถุต่างๆ โดยไม่จำเป็นต้องทราบกลไกการทำงานภายใน เมื่อใช้ก็เพียงแต่เรียกส่วนของอินเตอร์เฟส (หรือที่เรียกว่า Method) นี้โดยการส่งข่าวสาร (Message) ไปยังวัตถุที่ต้องการ ยกตัวอย่างเช่น การทำงานระหว่างโทรทัศน์กับรีโมท ซึ่งการใช้งานของโทรทัศน์มีดังต่อไปนี้ คือ เปิด ปิด เปลี่ยนช่อง เมื่อผู้ใช้ต้องการเปิดสัญญาณ โดยกดปุ่มสัญลักษณ์เปิดส่งไปยังตัวรับที่โทรทัศน์ หลังจากนั้นโทรทัศน์ก็จะทำงานในกลไกของการเปิด ซึ่งเราไม่ต้องรับรู้ถึงวงจรที่อยู่ภายในเลย โดย เปิด ปิด และเปลี่ยนช่อง ก็คือ Method ของโทรทัศน์ เป็นต้น



การซ่อนรายละเอียด (Encapsulation)

ส่วนประกอบของวัตถุตามแนวความคิดการเขียนโปรแกรมเชิงวัตถุ จะต้องประกอบด้วยสองส่วนเป็นอย่างน้อย คือ ส่วนของคุณสมบัติใช้เก็บข้อมูลรายละเอียด สถานะ โดยใช้ตัวแปรเก็บค่าต่างๆ ไว้ และส่วนของเมธทอดที่เป็นตัวเชื่อมการทำงานของวัตถุนั้นๆ โดยผู้ใช้จะไม่สามารถติดต่อใช้งานตัวแปรที่อยู่ข้างในได้ ในภาษา C++ จะใช้คำ Public,Private และ Protected เข้ามาช่วยกำหนดขอบเขตการใช้









Private
Protected
Public







รูปที่ 1-2 คำที่ช่วยกำหนดขอบเขตการใช้ในภาษา C++





การนำวัตถุมาใช้ใหม่ (Reuse the Object)

จุดประสงค์ใหญ่ของการเขียนโปรแกรมเชิงวัตถุ ก็คือ การนำส่วนต่างๆ ของวัตถุที่สร้างขึ้นกลับมาใช้ใหม่หรือที่เรียกในภาษาอังกฤษว่า “Reuse” เมื่อผู้เขียนโปรแกรมสร้างวัตถุมีจำนวนมากพอก็สามารถนำวัตถุที่สร้างขึ้นมาประกอบเป็นวัตถุใหม่ หรือที่เรียกว่าคอมโพสิตชั่น “Composition” ดังตัวอย่างการสร้างรถยนต์ ผู้ใช้ไม่จำเป็นจะต้องสร้างรถโดยเริ่มจากส่วนประกอบต่างๆ ที่ทำใหม่ทุกครั้ง แต่ผู้ใช้สามารถสร้างจากส่วนประกอบที่มีอยู่แล้วได้










รูปที่ 1-3 รถยนต์และส่วนประกอบของรถยนต์ เช่น ล้อ หลังคา ฝากระโปรง





นอกจากวิธีการคอมโพสิตแล้ว ผู้ใช้ยังสามารถ Reuse ส่วนของวัตถุโดยการใช้สืบทอดคุณสมบัติ (Inheritance) จากคลาส ลักษณะเช่นนี้ คือ เป็นการนำส่วนของวัตถุทั้งหมดมาใช้ ซึ่งปกติแล้ววัตถุที่นำมาใช้ในลักษณะนี้จะมีขนาดใหญ่ ถ้าเป็นคอมโพสิตจะประกอบขึ้นจากส่วนของวัตถุที่มีขนาดเล็กกว่า อย่างไรก็ตาม ขนาดของวัตถุมิได้เป็นตัวกำหนดที่แน่นอนตายตัวเสมอไป



การพ้องรูป (Polymorphism)

รากฐานของการพ้องรูป (Polymorphism) ก็คือ การถ่ายทอดคุณสมบัติ เพราะถ้าไม่มีการถ่ายทอดคุณสมบัติก็จะไมเกิดสภาวะการพ้องรูป การถ่ายทอดคุณสมบัติเป็นเครื่องยืนยันได้ว่า คลาสลูกที่เกิดจากคลาสแม่เดียวกันย่อมมีคุณสมบัติเหมือนกัน



การเขียนโปรแกรมและการออกแบบระบบงาน

โดยปกติก่อนที่ผู้เขียนโปรแกรมจะสามารถเขียนคำสั่งได้ จะต้องมีการออกแบบระบบงานก่อนแล้วจึงเขียนโปรแกรมเป็นภาษาต่างๆ ตามชนิดของงานและความเหมาะสม การเขียนโปรแกรมเชิงวัตถุก็เช่นเดียวกัน จะต้องมีการออกแบบระบบงานก่อน หลักสำคัญสำหรับการออกแบบเชิงวัตถุ ก็คือ การหาวัตถุให้พบ เมื่อพบวัตถุแล้วจะต้องจำแนกวัตถุออกเป็นส่วนที่เปลี่ยนแปลงและส่วนที่อยู่คงที่ วัตถุที่ไม่เปลี่ยนแปลงสามารถนำไปใช้ได้เมี่อมีการปรับปรุงระบบงานใหม่ นั่นเป็นเหตุผลที่ทำให้ต้องมีการออกแบบระบบงาน วัตถุที่มีการเปลี่ยนแปลงบ่อย ก็ได้แก่ วัตถุที่ทำหน้าที่เป็นอินเตอร์เฟส เป็นต้น





ประโยชน์ของการโปรแกรมแบบ OOP

เทคโนโลยีของออบเจ็กต์โอเรียนเท็ดได้นำประโยชน์ของการพัฒนาซอฟต์แวร์มาให้ ดังนี้

1.ความสามารถในการเรียกใช้ได้หลายครั้ง ออบเจ็กต์ได้ถูกออกแบบตามหลักการที่ว่าสามารถเรียกใช้งานได้หลายๆ ครั้ง ในหลักการนี้ทำให้ Application ของ OOP ตัวแรกอาจจะทำได้ยาก แต่ว่าโปรแกรมแอปพลิเคชันที่เขียนภายหลังจะสร้างง่ายเพราะสามารถเรียกใช้ออบเจ็กต์ที่ถูกสร้างไว้ตั้งแต่โครงงานแรกได้

2.ความเชื่อถือได้ โปรแกรมแอปพลิเคชันของ OOP จะมีความเชื่อถือได้สูงเพราะจะรวมเอาส่วนย่อยที่ทดสอบจนได้มาตรฐานแล้วมารวมเข้าไว้ด้วยกัน รหัส (Code) ที่เขียนขึ้นมาใหม่ในแต่ละแอพพลิเคชันจะมีไม่มากนัก เนื่องจากรหัสส่วนใหญ่จะถูกดึงมาจากไลบรารีที่มีความเชื่อถือได้สูงอยู่แล้ว และในการโปรแกรมภาษา C++ ยังมีคุณประโยชน์อื่นอีก

3.ความต่อเนื่องกัน การพัฒนาซอฟต์แวร์แบบ OOP ใน C++ จะเปลี่ยนไปตามฝีมือและจำนวนนักเขียนโปรแกรมภาษา C นักโปรแกรมภาษา C ที่ชำนาญสามารถเรียนรู้หลักการของ OOP ได้ภายในเวลาไม่นาน และสามารถเข้าใจในเนื้อหาได้ไม่ยาก อีกทั้งสามารถแปลงโปรแกรมแอพพลิเคชั่นของ C เป็น C++ ได้