Elixir - Hành vi
Behaviors trong Elixir (và Erlang) là một cách để tách và trừu tượng hóa phần chung của một thành phần (trở thành mô-đun hành vi) khỏi phần cụ thể (trở thành mô-đun gọi lại). Hành vi cung cấp một cách để -
- Xác định một tập hợp các chức năng phải được thực hiện bởi một mô-đun.
- Đảm bảo rằng một mô-đun thực hiện tất cả các chức năng trong tập hợp đó.
Nếu phải làm như vậy, bạn có thể nghĩ đến các hành vi như giao diện trong các ngôn ngữ hướng đối tượng như Java: một tập hợp các chữ ký hàm mà một mô-đun phải thực hiện.
Xác định hành vi
Chúng ta hãy xem xét một ví dụ để tạo hành vi của riêng mình và sau đó sử dụng hành vi chung này để tạo mô-đun. Chúng tôi sẽ xác định một hành vi chào đón mọi người xin chào và tạm biệt bằng các ngôn ngữ khác nhau.
defmodule GreetBehaviour do
@callback say_hello(name :: string) :: nil
@callback say_bye(name :: string) :: nil
end
Các @callbackChỉ thị được sử dụng để liệt kê các chức năng mà các mô-đun áp dụng sẽ cần xác định. Nó cũng chỉ định không. trong số các đối số, kiểu của chúng và giá trị trả về của chúng.
Chấp nhận một Hành vi
Chúng tôi đã xác định thành công một hành vi. Bây giờ chúng tôi sẽ áp dụng và triển khai nó trong nhiều mô-đun. Hãy để chúng tôi tạo hai mô-đun thực hiện hành vi này bằng tiếng Anh và tiếng Tây Ban Nha.
defmodule GreetBehaviour do
@callback say_hello(name :: string) :: nil
@callback say_bye(name :: string) :: nil
end
defmodule EnglishGreet do
@behaviour GreetBehaviour
def say_hello(name), do: IO.puts("Hello " <> name)
def say_bye(name), do: IO.puts("Goodbye, " <> name)
end
defmodule SpanishGreet do
@behaviour GreetBehaviour
def say_hello(name), do: IO.puts("Hola " <> name)
def say_bye(name), do: IO.puts("Adios " <> name)
end
EnglishGreet.say_hello("Ayush")
EnglishGreet.say_bye("Ayush")
SpanishGreet.say_hello("Ayush")
SpanishGreet.say_bye("Ayush")
Khi chương trình trên được chạy, nó tạo ra kết quả sau:
Hello Ayush
Goodbye, Ayush
Hola Ayush
Adios Ayush
Như bạn đã thấy, chúng tôi áp dụng một hành vi sử dụng @behaviourchỉ thị trong mô-đun. Chúng ta phải xác định tất cả các chức năng được thực hiện trong hành vi cho tất cả các mô-đun con . Điều này có thể được coi là tương đương với giao diện trong các ngôn ngữ OOP.