การเขียนโปรแกรมแบบวัตถุวิธีในภาษาซีชาร์ป (OOP with C#) ตอนที่ 1
การออกแบบและเขียนโปรแกรมแบบวัตถุวิธี
(Object Oriented Programming: OOP ออพเจ็กต์โอเรียนเท็ดโปรแกรมมิง)
ตั้งอยู่บนหลักการสามประการที่เปรียบได้กับสามเสาหลัก ประกอบด้วย หลักการเอนแคปซูเลชัน (Encapsulation) , อินเฮียริแตนซ์ (Inheritance) และ โพลิมอร์ฟิสซึม (Polymorphism) หากท่านเข้าใจหลักการทั้งสามนี้ ก็เท่ากับว่าท่านเข้าใจหัวใจของ OOP ทั้งหมดแล้ว
บทความตอนนี้ผู้เขียนจะอธิบายหลักการเอนแคปซูเลชันเบื้องต้น โดยจะอธิบายความหมาย วิธีใช้งาน และ วิธีเขียนโค้ดในภาษาซีชาร์ปเพื่อใช้หลักการนี้ การทำเอนแคปซูเลชัน ทำได้โดยการนิยามคลาส และ เรียกใช้สมาชิกของคลาส ผู้เขียนจะแสดงโค้ดที่เขียนโดยไม่ใช้หลักการ OOP เปรียบเทียบกับ โค้ดงานเดียวกันแต่เขียนตามหลักการ OOP เพื่อให้ท่านเห็นภาพเปรียบเทียบได้อย่างชัดเจน
เอนแคปซูเลชันเป็นหลักการพื้นฐานที่สุดและสำคัญที่สุดในวิชา OOP คำว่าเอนแคปซูเลชัน ถ้าแปลตรงตัวหมายถึงการทำให้เป็นแคปซูล (Capsule) แต่ในบริบทนี้จะหมายถึงการนำเอาข้อมูลและโค้ดมารวมไว้เป็นหน่วยเดียว เรียกว่าคลาส (Class)
คำว่าข้อมูลในที่นี้หมายถึงตัวที่ทำหน้าที่เก็บข้อมูล อาทิ ตัวแปรธรรมดา อาเรย์ ลิงค์ลิสต์ สตรัคเจอร์ คิว และโครงสร้างข้อมูลอื่น ๆ ส่วนคำว่าโค้ดหมายถึงฟังก์ชัน (อย่างฟังก์ชันในภาษาซี) หรือเมธอดในภาษาจาวาและซีชาร์ป ในภาษาที่ไม่ได้ถูกออกแบบมาให้เขียนโปรแกรมแบบ OOP การนำข้อมูลและโค้ดมารวมไว้เป็นหน่วยเดียวกันไม่สามารถทำได้หรือทำได้แต่ไม่สะดวกนัก เช่นภาษาซี ขณะที่ภาษาซึ่งถูกออกแบบมาให้เป็น OOP โดยตรงอย่างภาษาซีชาร์ปสามารถทำได้ง่ายมาก
โปรดพิจารณาโค้ดต่อไปนี้
โปรแกรมนี้เป็นตัวอย่างโค้ดที่ควบคุมการทำงานเครื่องจักร จะเห็นว่ามีทั้งส่วนที่เป็นโค้ด คือฟังก์ชัน run (บรรทัดที่ 14 ถึง 18) และฟังก์ชัน stop (บรรทัดที่ 19 ถึง 23) และมีส่วนที่เป็นข้อมูลคือตัวแปรชื่อ isRun (ถูกประกาศไว้ในบรรทัดที่ 6 และถูกเปลี่ยนแปลงค่าในบรรทัดที่ 16 และ 21)
นี่เป็นตัวอย่างโค้ดในภาษาซีที่เขียนแบบไม่เป็น OOP และไม่ได้ใช้หลักการเอนแคปซูเลชัน ข้อมูลและโค้ดปนกันอยู่อย่างกระจัดกระจาย ไม่ได้ผนึกไว้เป็นก้อนเดียวกัน
เมื่อต้องการควบคุมเครื่องจักรเราจะใส่โค้ดไว้ใน main (บรรทัดที่ 8 ถึง 13) เพื่อเรียก run และ stop ซึ่งทั้งสองฟังก์ชันนี้จะเปลี่ยนแปลงค่าตัวแปร isRun ที่เป็นตัวแปรโกบัล (global variable ตัวแปรสาธารณะ) ซึ่งเป็นการออกแบบที่ไม่ดีนัก เพราะการใช้ตัวแปรโกบัลในลักษณะนี้ทำให้เราไม่รู้ว่าในขณะหนึ่งๆ ตัวแปร isRun ถูกโค้ดใดเปลี่ยนแปลงค่าไปบ้าง ยากแก่การดีบักโปรแกรม
หากเราต้องการเขียนโปรแกรมนี้ขึ้นใหม่โดยออกแบบให้เป็น OOP เราจะต้องนำส่วนโค้ด (คือฟังก์ชัน run และ stop) และส่วนดาต้า (คือตัวแปร isRun) มาผนึกไว้เป็นก้อนเดียวกัน นั่นคือเขียนขึ้นใหม่โดยใช้หลักการเอนเคปซูเลชันดังนี้