Ruby: ความแตกต่างระหว่างการ ส่ง message และ เรียก method

เรียก method

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

num = str.to_i

จะหมายถึงว่าเราเรียก method to_i ของ object str

ส่ง message

แต่ในอีกมุมนึงความสำคัญของ Object Oriented นั้นไม่ได้อยู่ที่ตัว Object เอง แต่อยู่ที่การสื่อสารกันระหว่างแต่ละ Object ผ่านการส่ง message หากัน

Alan Kay ที่เรายกให้เขาเป็นผู้ให้กำเนิดแนวคิด OOP (จริงๆแล้วก็ช่วยกันหลายคน) ได้เคยตอบเมลลิ้งลิสต์เรื่อง prototypes vs classes was: Re: Sun’s HotSpot ซึ่งพูดถึงเรื่อง Object เอาไว้ว่า

I’m sorry that I long ago coined the term “objects” for this topic because it gets many people to focus on the lesser idea. The big idea is “messaging”

และสำหรับ Ruby ถ้าเราเลือกที่จะพูดว่า str.to_i คือการส่ง message to_i ไปให้ object str แล้ว object str ค่อยเป็นคนตัดสินใจเองว่าได้รับ message to_i แล้วจะเรียก method ไหนให้ทำงานจะดูชัดเจนกว่า เพราะในโลกของ Ruby นั้น เราสามารถทำให้ object ตัดสินใจภายหลังได้ว่าจะทำอะไร โดยที่เราไม่ต้องสร้าง method ชื่อเดียวกันกับ message ที่ได้รับเสมอไป โดยการ implement method ชื่อ method_missing นั่นเอง เช่น

class C
  def method_missing(m, *args, &block)
    puts "Receiving message: %s" % m
  end
end

c = C.new
c.hello_world

จากโค้ด class C ไม่มี method hello_world มีแค่ method_missing แต่เราสามารถส่ง message hello_world ไปให้ object ของ class C ทำงานได้ ซึ่งผลลัพธ์ที่ได้จากโค้ดข้างบนคือข้อความ Receiving message: hello_world

comments powered by Disqus