Posted by: thitipat | กุมภาพันธ์ 4, 2007

Object Oriented Programming (OOP)

 

ภาพจาก http://www.voidspace.org.uk/

Object Oriented Programming เป็นการเขียนโปรแกรมโดยการมองสิ่งต่างๆ เป็นวัตถุ ซึ่งใน Realworld สิ่งต่างๆ รอบๆ ตัวเราก็เป็นวัตถุ โดยมีแนวคิดที่ว่า สิ่งที่ประกอบกันเป็นวัตถุนั้นจะประกอบไปด้วย

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

เราสามารถทำการ Implement ได้โดยการทำให้อยู่ในรูปของ Class ซึ่งเปรียบเหมือนกับต้นแบบที่ไว้ สร้าง Object (Class ไม่ใช่ object นะ) คุณสมบัติที่สำคัญของ OOP ก็คือ

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

    ตัวหนา คือ Method
    ตัวหนาเอียง คือ Attribute

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

  2. Inheritance
    เป็นการทำให้ Class สามารถสืบทอดต่อกันได้ โดยลักษณะของการสืบทอดนั้นก็เพื่อเพิ่มเติมความสามารถให้สามารถทำงานได้มากกว่าคลาสแม่ที่สืบทอดมา เช่น คลาสของคนสืบทอดมาจากคลาสของสัตว์เลี้ยงลูกด้วยนม โดยที่ Method พื้นฐานของสัตว์เลี้ยงลูกด้วยนมนั้น สมมุติให้มีเพียง กินอาหาร สืบพันธุ์ ขับถ่าย Class ของคนที่สืบทอดมาจากสัตว์เลี้ยงลูกด้วยนม สิ่งที่คนทำได้แตกต่าง เช่น การพูด ก็จะถูกเพิ่มเข้าไปในคลาสของคน สรุปว่าคนสามารถ กิน,สืบพันธุ์,ขับถ่าย และ พูด ได้
  3. Abstraction
    เป็นการสร้าง Method แบบลอยๆ ขึ้นมายังไม่ได้ระบุรายละเอียดว่า Method นั้น ทำงานอย่างไรจะมีการระบุการทำงานในส่วนของ Subclass ที่รับสืบทอดมา สาเหตุที่มีการทำแบบนี้ก็เพื่อให้สามารถใช้ Polymorphism ได้นั่นเอง
  4. Polymorphism
    คือสภาวะที่ Method มีหลายรูปแบบ​ เป็น​วิธีการกำ​หนดรูปแบบการกระทำ​ที่​เหมือน​กัน​แต่​ได้​ผลที่​แตกต่างกัน สมมุติว่ามี Method สำหรับการ sort จากน้อยไปมาก สมมุติว่ามี คลาสแม่(Superclass) ที่เป็นคลาสของสัตว์เลี้ยงลูกด้วยนม โดยมีคลาสลูก(Subclass) คือ คลาสของคนกับสุนัข ซึ่งทั้งคนกับสุนัขมี Method ที่ใช้ในการเปล่่งเสียงซึ่งการเปล่งเสียงระหว่างคนกับสุนัขนั้นไม่เหมือนกันแต่มันก็คือการเปล่งเสียง ดังนั้นเมื่อได้รับ Message ที่บอกให้ทำการเปล่งเสียงทั้งคนและสุนัขก็สามารถเปล่งเสียงได้เพียงแต่มีเสียงที่แตกต่างกันเท่านั้นเอง เพื่อให้สามารถเข้าใจได้ง่ายเราก็จะสร้าง Method ที่ชื่อว่า เปล่งเสียง( ) มาเพียงชื่อเดียวแล้วใช้หลักการ polymorphism นี้เพื่อให้สามารถเปล่งเสียงได้หลายๆ รูปแบบ

การสร้างโครงสร้างการ Design แบบ OO ที่ดีนั้นควรพยายามสร้างตามหลักข้างบนให้ได้นะครับ จะช่วยได้มากเลยทีเดียว แต่ที่แน่ๆ พยายามทำให้คลาสของเรามีลักษณะที่เป็น Encapsulation ตามข้อแรกให้ได้ครับ

นี่ก็เป็นหลักการในการเขียนโปรแกรมแบบ OO ที่ผมสรุปมาจากความเข้าใจของตัวเองนะครับไม่ได้อ้างอิงมาจากที่ไหน ถ้ามีส่วนใดที่ผิดก็แสดงความคิดเห็นมาได้ครับ คราวต่อไปจะมาเล่าเรื่องปัญหาที่เกิดจากการ Design ให้ฟังครับ

Responses

เป็นบทความที่ดีครับ
เพราะหาใครที่จะมาอธิบายเรื่องพวกนี้ยากเหมือนกัน

แต่ผมอ่านไม่ค่อยเข้าใจรายะเอียดเท่าไรครับ
คงเพราะความรู้น้อยเกินไปจริงๆ
อ่านจนจบแล้ว
Attribute Method Object Class
ขนาดมี sub ไทยประกอบแล้ว ยังไม่รู้จักมันเลย

-_-”

ถ้าอธิบายอีกรอบก็คงไม่ต่างจากเดิมเท่าไหร่นะ เดี๋ยวจะพยายามหาวิธีการเล่าแบบอื่นดูใหม่แล้วกัน

แล้วสมบัติ Polymorphism เนี่ยะ ถ้า Message ต่างกันแสดง พฤติกรรม ต่างกันไม่ได้หรอครับ

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

ทำการแก้ไขให้แล้วครับเผอิญข้อมูลผมผิดไปจริงๆ ตรงที่ว่า polymorphism นั้นคือการรับ message ที่ต่างกันแล้วให้ผลเหมือนกัน ที่จริงแล้วต้องรับ message มาเหมือนกันแล้วแสดงผลที่ต่างกันนะครับ ขอบคุณ kojiro540 มากครับที่ช่วยชี้แนะ

วินนิ่งก็ได้ มาดิ -_-!!

Polymorphism
ผมเข้าใจว่า ชื่อ method Parameter เหมือนกัน แต่ Implement ต่างกัน
Overload
ผมเข้าใจว่าชื่อmethod เหมือนกัน Parameter ไม่เหมือนกัน implement ตาม Parameter ว่าจะ
เข้าmethodไหน นี่ผมเข้าใจถูกป่ะครับ

ถ้าไปโฟกัสที่ตรงนั้นอาจจะทำให้สับสนได้นะครับ เพราะว่า polymorphism มันคือการพ้องรูปของ method โดยคลาสแม่จะทำ abstract class เอาไว้แล้วคลาสที่สืบทอดไปก็เอาไป implement เอาเองว่า method นั้นทำงานอย่างไร พารามิเตอร์ก็กำหนดเอาเองว่าจะใช้อะไรบ้าง เราไม่ต้องกังวลในเรื่องของพารามิเตอร์เลยว่าจะต้องเหมือนกัน

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

เราจะทำ overloading ในคลาสด้วยก็ได้ครับ ดูตามตัวอย่างที่ผมเขียนแล้วกันครับอาจจะเข้าใจได้ง่ายขึ้น

class Animal():
abstract speak()

class Human(Animal):
def speak(self):
print “hi”
def speak(self,message):
print message

class Dog(Animal):
def speak(self):
print “Bow”

human = Human()
dog = Dog()

man.speak()
man.speak(”hello world” ;)
dog.speak()

จะเห็นว่า method speak ประกาศไว้ในคลาส Animal ก่อนยังไม่ได้ใส่อะไรลงไป พารามิเตอร์ก็ยังไม่ได้กำหนด

ในคลาส Human เลยมา implement ให้ method speak ที่สืบทอดมาจากคลาส Animal ซึ่งใช้คุณสมบัติของ polymorphism และก็ยังมี method ที่ overload มาด้วย

ส่วนคลาส Dog นั้นมีเพียงแค่ method ที่สืบทอดมาจาก Animal แล้ว Implement วิธีเข้าไปซึ่งก็ใช้คุณสมบัติของ polymorphism เช่นกัน

สรุปตามที่ผมเข้าใจก็คือ polymorphism นั้นช่วยให้มีความรู้สึกว่ามัน make sense ในการใช้งาน object ถึงแม้ object จะต่างชนิดกัน แต่ก็มีประเภทเดียวกัน เช่น Human.eat() กับ Dog.eat() ถ้าต้องตั้งชื่อแตกต่างกันทั้งหมดคงจะใช้ลำบากน่าดู ส่วนพารามิเตอร์จะเป็นยังไงก็ได้ไม่ต้องเหมือนกันทั้งหมดก็ได้

ส่วน overload นั้นเป็นการระบุว่ามีฟังก์ชั่นการทำงานได้หลายแบบขึ้นอยู่กับพารามิเตอร์ ที่ป้อนเข้ามา ซึ่งก็สามารถนำมาใช้ในคลาสที่ method นั้นถูก polymorphism มาก็ได้

ปล. โค้ดนี้เป็น pseudo code นะครับ ไว้ให้เห็นความแตกต่างระหว่าง polymorphism กับ overload

Leave a response

Your response:

หมวดหมู่