DEV Community

Weerasak Chongnguluam
Weerasak Chongnguluam

Posted on

Elixir เรียกฟังก์ชันแบบ dynamic

Elixir เป็น functional language ซึ่งโครงสร้างของโค้ดจะถูกประกอบขึ้นมาจากการ ร้อยเรียงการเรียกใช้งาน function เล็กๆ ให้เป็นการทำงานที่ซับซ้อนขึ้น

โค้ดของ Elixir จะถูกจัดกลุ่ม function ออกเป็น module ตัวอย่างเช่น

defmodule Calc do
  def add(a, b) do
    a + b
  end
end
Enter fullscreen mode Exit fullscreen mode

ก็คือเราสร้าง module Calc ที่มีฟังก์ชันชื่อ add

เวลาเรียกใช้งาน function นั้นต้องใช้ชื่อ module แล้วใช้ . ตามด้วยชื่อ function และ () ที่มี arguments ที่ต้องการส่งใช้ function เช่น

Calc.add(10, 20)
Enter fullscreen mode Exit fullscreen mode

เรียก function แบบ dynamic module

อย่างไรก็ตาม นอกจากความเป็น functional language แล้ว Elixir ยังเป็น dynamic language ด้วย

จริงๆแล้วการเรียก function ด้วย . นั้นประกอบด้วย 3 ส่วน

  • ชื่อ module
  • ชื่อ function
  • ลิสต์ของ arguments (arg1, arg2, ...)

ใน Elixir ชื่อของ module ก็ถือว่าเป็นข้อมูลที่มีประเภทเป็น Atom ดังนั้นถ้าเรามีตัวแปรเก็บชื่อ Atom แบบนี้

mod = Calc
Enter fullscreen mode Exit fullscreen mode

เราสามารถเรียก function ให้ทำงานได้เช่นกันแบบนี้

mod.add(10, 20)
Enter fullscreen mode Exit fullscreen mode

ด้วยเทคนิคนี้เราสามารถเขียนโค้ดซึ่งแยก module ออกเป็น parameter เพื่อที่จะทำให้เราเปลี่ยน module ได้ เพื่อที่จะเปลี่ยนกลไกการทำงานไม่ fix ตายตัว หรือเพื่อทำให้ง่ายต่อการเขียน test เช่น

defmodule Apply do
  def add(mod, a, b) do
    mod:add(a, b)
  end
end
Enter fullscreen mode Exit fullscreen mode

จะเห็นว่า function Apply.add จะรับ parameter mod เข้ามาแล้วเอาไปใช้เพื่อเรียก mod:add(a, b) เราสามารถเรียกใช้ Apply.add ได้โดยส่ง module เป็น argument เข้าไปแบบนี้

Apply.add(Calc, 10, 20)
Enter fullscreen mode Exit fullscreen mode

หรือถ้าเรามี module อื่นที่มีฟังก์ชัน add/2 แบบนี้

defmodule Text do
  def add(a, b) do
    "#{a}, #{b}"
  end
end
Enter fullscreen mode Exit fullscreen mode

เราก็สามารถเรียกใช้ Apply.add ได้แบบนี้เช่นกัน

Apply.add(Text, "Hello", "World")
Enter fullscreen mode Exit fullscreen mode

เรียก function แบบ dynamic module และชื่อ function ด้วย apply

ใน Elixir ชื่อ function ก็เป็นข้อมูลแบบ Atom เช่นกัน เช่นฟังก์ชัน add ก็คือ Atom :add นั่นเอง

และ Elixir มีฟังก์ชันชื่อ apply ที่จะรับชื่อ module, ชื่อ function ที่เป็น Atom และ ลิสต์ของ arguments เพื่อเรียกฟังก์ชันแบบ dynamic ให้กับเราเช่น เราจะเรียก Calc.add ผ่าน apply ได้ดังนี้

apply(Calc, :add, [10, 20])
Enter fullscreen mode Exit fullscreen mode

และเรียก Text.add ผ่าน apply ได้แบบนี้

apply(Text, :add, ["Hello", "World"])
Enter fullscreen mode Exit fullscreen mode

สรุป

ดัวยความเป็น dynamic ของ Elixir ทำให้เราสามารถ apply function โดย แยก module ออกไปเป็น parameter ได้

หรือเมื่อใช้ apply function ก็ทำให้เราแยกชื่อฟังก์ชันเป็น parameter ได้เช่นกัน

ช่วยให้เราสามารถเขียนโค้ดที่รองรับการเปลี่ยนการทำงานโดยการเขียนเป็น module ให้แล้ว apply แบบ dynamic ได้เลย

สามารถเขียนโค้ดส่วนที่ซ้ำกันออกมาแล้วทำให้ส่วนที่ไม่ซ้ำแยกเป็น module ใหม่ที่รับเป็นแค่ parameter เข้ามาได้ง่ายๆ และทำให้ทดสอบได้ง่ายอีกด้วย

Top comments (0)