ตอน 3 : ความหมายของ OOP


ไปหน้าแรก      สารบัญ        Laploy.com    ระเบียนบทความ      บทความจากลาภลอย


เว็บไซต์นี้เป็นตัวอย่างเนื้อหาบางตอนในหนังสือ "เรียนรู้ด้วยตนเอง OOP C# ASP.NET" ครอบคลุม บทที่ 1 ถึงบทที่ 6 (ในหนังสือมี 21 บท) เนื้อหาใน Blog อาจอาจแตกต่างจากในหนังสือเพราะเป็นเนื้อหาที่ยังไม่ได้ตรวจแก้ขัดเกลา (edit)

กดที่นี่เพื่อดูรายละเอียดเนื้อหาในแต่ละบท

กดที่นี่เพื่อไปยังเว็บบอร์ด ถาม-ตอบ 

 

 

ความหมายของ OOP

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

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

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

คลาสกับ object

คลาสกับ object เป็นสองสิ่งที่มีความเกี่ยวข้องกันโดยตรง คลาสคือโค้ดที่เราเขียนขึ้นเพื่อทำหน้าที่เป็นพิมพ์เขียวของ object การสร้าง object จากคลาสเรียกว่าการทำ instantiation การสร้าง object จากคลาส เทียบได้กับการทำขนมครกสิงคโปร์ เตาขนมจะมีหลุมหลายหลุม แต่ละหลุมมีลวดลายไม่เหมือนกัน ขนมครกที่ได้จากแต่ละหลุมจึงมีรูปร่างต่างๆ กัน คลาสคือหลุมหนึ่งหลุม ขนมครกที่ได้คือ instance ของ object

เราเรียก object หนึ่ง object ว่าหนึ่ง instance เราสามารถสร้าง object ได้หลายๆ instance จากคลาสเพียงคลาสเดียว จากตัวอย่างขนมครกสิงคโปร์ ในวันหนึ่งๆ แม่ค้าจะทำขนมครกได้เป็นจำนวนมากจากหลุมแต่ละหลุม ส่วนในภาษา C# หากเราสร้างคลาสหนึ่งคลาส ยกตัวอย่างเช่น เป็นคลาสเพื่อนิยาม node หลังจากนั้นเราอาจเขียนโปรแกรมสร้าง binary tree ซึ่งขณะทำงานมันอาจจะสร้าง object จากคลาส node ได้หลายล้าน instance ภายในหนึ่งวินาที

การใช้งานคลาสทำได้สองวิธี วิธีแรกคือการนำไปใช้สร้าง object และใช้งานผ่าน object ดังที่อธิบายไปแล้ว อีกวิธีหนึ่งคือเรียกใช้โดยตรงโดยไม่ต้องสร้าง object เรียกว่า static class แม้การใช้งานคลาสวิธีนี้จะไม่มี object ทำให้ดูเหมือนไม่เป็นหลักการ OOP แต่ในบางสถานการณ์ก็ถือว่ามีความเหมาะสมดี

object กับ type

เรื่องของ type เป็นเรื่องสำคัญในวิชา OOP ในหนังสือนี้ท่านจึงจะพบคำว่า type อยู่เสมอ จึงมีความจำเป็นที่ท่านจะต้องทำความเข้าใจความหมายของคำว่า type ให้ตรงกับความหมายใน OOP และภาษา C# ก่อน

ในภาษาที่ไม่ใช่ภาษา OOP อย่างภาษา C มี type ต่างๆ เตรียมไว้ล่วงหน้า เช่น int (จำนวนเต็ม) float (จำนวนมีทศนิยม) char (ตัวอักษร) เป็นต้น type เหล่านี้คือชนิดของข้อมูล ยกตัวอย่างเช่นเมื่อเราเขียนโค้ดว่า

int foo;

ซึ่งทำหน้าที่นิยามตัวแปรชนิดจำนวนเต็ม compiler (ตัวแปลภาษา) จะรู้ทันทีว่าควรทำเช่นใดกับตัวแปรชนิดนี้ เพราะ int เป็น type ที่ถูกกำหนดไว้ล่วงหน้าแล้ว (ภายในตัว compiler ภาษา C) เรียกว่า build-in type (หรือ primitive type หรือ abstract data type ก็ว่า)

ภาษา C รับรู้ type อยู่จำนวนหนึ่ง หากเราพบว่า type ที่มีมาให้ไม่สามารถตอบสนองต่อความต้องการของเราได้ เราสามารถนิยาม type ขึ้นเองได้ เรียกว่า user defined data type (ต่อไปจะเรียกย่อว่า UDT) โดยใช้ structure

ยกตัวอย่างการสร้าง structure ชื่อ record เพื่อเก็บข้อมูลนักเรียนเป็นดังนี้

 

struct
{
     char cname[8];
     char sname[16];
     char exam[16];
     char grade;
} record;

 

จะเห็นว่าการสร้าง UDT ด้วย structure คือการนำ type ที่มีอยู่มาผสมกันเพื่อให้ได้เป็น type ใหม่

คลาสก็เหมือน structure เรานิยามคลาสเพราะเราต้องการสร้าง UDT ขอใช้อุปมาขนมครกสิงค์โปรอีกครั้ง ขนมครกสิงค์โปรหนึ่งเตาจะมีหลายหลุม แต่ละหลุมมีลวดลายต่างกัน เช่นหลุมหนึ่งมีลายเป็นปลา อีกหลุมหนึ่งมีลายเป็นหอย ขนมครกที่ได้จากหลุมแต่ละหลุมจึงมีรูปร่างต่างกัน หรือมี type ต่างกัน สิ่งที่ทำให้ type ของขนมครกแตกต่างกันคือตัวหลุม

หลุมแต่ละหลุมบนขนมครกสิงค์โปรเทียบได้กับคลาสหนึ่งคลาส จุดมุ่งหมายในการนิยามคลาสก็เหมือน structure คือเราต้องการสร้าง type ใหม่ object ที่ถูกสร้างจากคลาสจะมี type ตามที่คลาสนั้นได้นิยามไว้

ภาษา C# สนับสนุนการสร้าง type ใหม่อย่างพิสดาร เมื่อนิยามแล้ว UDT กับ build-in type จะมีศักดิ์ศรีเสมอกัน (คือ compiler จะปฏิบัติต่อ type ที่เราสร้างในลักษณะ first class เช่นเดียวกับ build-in type).NET Framework library เองก็เป็นแหล่งรวม type หลายพัน type ที่เราสามารถนำมาประกอบเป็น type ใหม่ที่มีการทำงานซับซ้อนได้อย่างสะดวกรวดเร็ว

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

การใช้งาน object

การใช้งาน object ต้องทำได้ง่าย เราอาจมองว่า object เป็น “กล่องดำ” ในทางวิทยาศาสตร์เราจะเรียกอุปกรณ์ที่เราสามารถนำมาใช้ประโยชน์ได้ โดยไม่จำเป็นต้องรู้การทำงานภายในของมันว่า กล่องดำ ยกตัวอย่างเช่นโทรศัพท์ เรานำมันมาใช้ประโยชน์เพื่อการสื่อสารได้ โดยไม่จำเป็นต้องรู้ว่ามันทำงานได้อย่างไร เช่นเดียวกัน ในภาษา C# เราสามารถนำ object มาใช้งานได้โดยไม่จำเป็นต้องรู้ว่ามันมี source code ภายในเป็นอย่างไร

เมื่อเราต้องกาเรียกให้ object ทำงานบางอย่างเราจะเรียก method ของมัน ยกตัวอย่างเช่นโทรศัพท์มี method คือการโทรฯ ออก การวางสาย การพักสาย การบันทึกเลขหมายฯ ในภาษา C# เราจะนิยาม method เหล่านี้โดยการเขียนโค้ดหนึ่งชุด คล้ายการนิยามฟังก์ชันในภาษา C

object จะผนวกกระบวนการ (method) และข้อมูล (information) ไว้ภายในตัวของมันเอง จากตัวอย่างโทรศัพท์เก็บเลขหมายที่เราบันทึกไว้ โดยเราไม่จำเป็นต้องรู้ว่ามันเก็บไว้ที่ไหนอย่างไร เรารู้เพียงวิธีดึงเลขหมายที่บันทึกไว้ออกมาใช้งานก็พอ ในภาษา C# object จะเก็บข้อมูลภายในไว้ใน field (คือตัวแปรท้องถิ่นของคลาส) โปรแกรมที่เรียกใช้ object ไม่จำเป็น (และไม่สามารถ) เข้าถึงหรือเปลี่ยนแปลงข้อมูลใน field ได้โดยตรง แต่สามารถเข้าถึงทางอ้อมได้ผ่านส่วนเชื่อมต่อที่เรียกว่า property

ภาษา C# สนับสนุนหลักการทุกรูปแบบในลัทธิ OOP โดยหลักการนี้ มีเรื่องหลัก 3 หัวข้อที่ท่านจำเป็นต้องเข้าใจ คือ

  • Encapsulation
  • Inheritance
  • Polymorphic

ผู้เขียนจะอธิบายหลักการแต่ละหัวข้อต่อไปในบทนี้

ตอนต่อไป : Encapsulation

Post a comment or leave a trackback: Trackback URL.

ใส่ความเห็น

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / เปลี่ยนแปลง )

Twitter picture

You are commenting using your Twitter account. Log Out / เปลี่ยนแปลง )

Facebook photo

You are commenting using your Facebook account. Log Out / เปลี่ยนแปลง )

Google+ photo

You are commenting using your Google+ account. Log Out / เปลี่ยนแปลง )

Connecting to %s

%d bloggers like this: