Elixir - Perilaku
Behaviors di Elixir (dan Erlang) adalah cara untuk memisahkan dan mengabstraksi bagian generik dari sebuah komponen (yang menjadi modul tingkah laku) dari bagian tertentu (yang menjadi modul callback). Perilaku menyediakan cara untuk -
- Tentukan sekumpulan fungsi yang harus diimplementasikan oleh modul.
- Pastikan bahwa modul mengimplementasikan semua fungsi di set itu.
Jika perlu, Anda dapat memikirkan perilaku seperti antarmuka dalam bahasa berorientasi objek seperti Java: sekumpulan tanda tangan fungsi yang harus diterapkan modul.
Mendefinisikan Perilaku
Mari kita pertimbangkan contoh untuk membuat perilaku kita sendiri dan kemudian menggunakan perilaku umum ini untuk membuat modul. Kami akan mendefinisikan perilaku yang menyapa orang dan selamat tinggal dalam berbagai bahasa.
defmodule GreetBehaviour do
@callback say_hello(name :: string) :: nil
@callback say_bye(name :: string) :: nil
end
Itu @callbackdirektif digunakan untuk membuat daftar fungsi yang mengadopsi modul perlu didefinisikan. Ini juga menentukan tidak. argumen, jenisnya, dan nilai kembaliannya.
Mengadopsi Perilaku
Kami telah berhasil mendefinisikan sebuah perilaku. Sekarang kita akan mengadopsi dan menerapkannya dalam beberapa modul. Mari kita buat dua modul yang menerapkan perilaku ini dalam bahasa Inggris dan Spanyol.
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")
Ketika program di atas dijalankan, menghasilkan hasil sebagai berikut -
Hello Ayush
Goodbye, Ayush
Hola Ayush
Adios Ayush
Seperti yang telah Anda lihat, kami mengadopsi perilaku menggunakan @behaviourdirektif dalam modul. Kita harus mendefinisikan semua fungsi yang diimplementasikan dalam perilaku untuk semua modul anak . Ini kira-kira dapat dianggap setara dengan antarmuka dalam bahasa OOP.