Elixir เป็น functional language ซึ่งโครงสร้างของโค้ดจะถูกประกอบขึ้นมาจากการ ร้อยเรียงการเรียกใช้งาน function เล็กๆ ให้เป็นการทำงานที่ซับซ้อนขึ้น
โค้ดของ Elixir จะถูกจัดกลุ่ม function ออกเป็น module ตัวอย่างเช่น
defmodule Calc do
def add(a, b) do
a + b
end
end
ก็คือเราสร้าง module Calc ที่มีฟังก์ชันชื่อ add
เวลาเรียกใช้งาน function นั้นต้องใช้ชื่อ module แล้วใช้ .
ตามด้วยชื่อ function และ ()
ที่มี arguments ที่ต้องการส่งใช้ function เช่น
Calc.add(10, 20)
เรียก function แบบ dynamic module
อย่างไรก็ตาม นอกจากความเป็น functional language แล้ว Elixir ยังเป็น dynamic language ด้วย
จริงๆแล้วการเรียก function ด้วย .
นั้นประกอบด้วย 3 ส่วน
- ชื่อ module
- ชื่อ function
- ลิสต์ของ arguments (arg1, arg2, ...)
ใน Elixir ชื่อของ module ก็ถือว่าเป็นข้อมูลที่มีประเภทเป็น Atom ดังนั้นถ้าเรามีตัวแปรเก็บชื่อ Atom แบบนี้
mod = Calc
เราสามารถเรียก function ให้ทำงานได้เช่นกันแบบนี้
mod.add(10, 20)
ด้วยเทคนิคนี้เราสามารถเขียนโค้ดซึ่งแยก module ออกเป็น parameter เพื่อที่จะทำให้เราเปลี่ยน module ได้ เพื่อที่จะเปลี่ยนกลไกการทำงานไม่ fix ตายตัว หรือเพื่อทำให้ง่ายต่อการเขียน test เช่น
defmodule Apply do
def add(mod, a, b) do
mod:add(a, b)
end
end
จะเห็นว่า function Apply.add
จะรับ parameter mod
เข้ามาแล้วเอาไปใช้เพื่อเรียก mod:add(a, b)
เราสามารถเรียกใช้ Apply.add ได้โดยส่ง module เป็น argument เข้าไปแบบนี้
Apply.add(Calc, 10, 20)
หรือถ้าเรามี module อื่นที่มีฟังก์ชัน add/2
แบบนี้
defmodule Text do
def add(a, b) do
"#{a}, #{b}"
end
end
เราก็สามารถเรียกใช้ Apply.add ได้แบบนี้เช่นกัน
Apply.add(Text, "Hello", "World")
เรียก 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])
และเรียก Text.add ผ่าน apply ได้แบบนี้
apply(Text, :add, ["Hello", "World"])
สรุป
ดัวยความเป็น dynamic ของ Elixir ทำให้เราสามารถ apply function โดย แยก module ออกไปเป็น parameter ได้
หรือเมื่อใช้ apply function ก็ทำให้เราแยกชื่อฟังก์ชันเป็น parameter ได้เช่นกัน
ช่วยให้เราสามารถเขียนโค้ดที่รองรับการเปลี่ยนการทำงานโดยการเขียนเป็น module ให้แล้ว apply แบบ dynamic ได้เลย
สามารถเขียนโค้ดส่วนที่ซ้ำกันออกมาแล้วทำให้ส่วนที่ไม่ซ้ำแยกเป็น module ใหม่ที่รับเป็นแค่ parameter เข้ามาได้ง่ายๆ และทำให้ทดสอบได้ง่ายอีกด้วย
Top comments (0)