Tentang bagaimana saya pindah dari C # ke Elixir / Phoenix

Suatu kali saya harus berganti pekerjaan. Sebelum itu, saya hanya bekerja dengan bahasa seperti Python, C ++, C #, dan beberapa lagi seperti itu. Dan sekarang saya harus mulai bekerja dengan bahasa fungsional. Kesan pertama adalah "apa itu?" Namun, saya berhasil beradaptasi dengan cukup cepat. Selanjutnya, saya akan berbicara tentang poin-poin utama yang harus saya gunakan atau yang harus saya pahami untuk mulai menulis dengan cepat dan memadai.

1. Pencocokan pola

Ini adalah salah satu fitur bahasa utama. Tetapi untuk sepenuhnya memahaminya, sampai Anda benar-benar mulai menulis dalam bahasa agak sulit. Hal pertama yang saya baca tentang pencocokan pola adalah bahwa, berkat hal ini, Anda cukup mengekstrak data dari struktur dan mengikatnya ke variabel. Namun pada kenyataannya, semuanya agak lebih rumit. Pencocokan pola bekerja hampir di semua tempat dalam bahasa tertentu. Saya akan memberikan tiga contoh yang menggambarkan aplikasi utama yang saya gunakan hampir secara konstan.

Contoh 1. Menurut definisi:

{tuple_item_1, tuple_item_2} = tuple 

- Membagi tuple 2-elemen menjadi dua variabel, yang kemudian dapat digunakan.

 [head_item | tail_list] = list 

- Memecah daftar menjadi elemen pertama dalam daftar dan daftar tanpa elemen pertama.

Contoh 2. Perbandingan dalam hal:

 case get_elem(struct) do {:ok, elem} -> … {:error, reason} -> … end 

Fungsi get_elem (struct) mengembalikan tuple, dan case memungkinkan Anda untuk segera mengekstrak data dan memilih urutan tindakan selanjutnya.

Contoh 3. Fitur Pemetaan:

 def function_1(params, :ok) do end def function_1(params, :error) do end def function_1(params, _) do end 

Di sini, pada kenyataannya, fungsi yang sama disajikan yang mengambil dua parameter. Pencocokan pola memungkinkan Anda memilih fungsi mana yang akan dieksekusi.

Sedikit tentang pencocokan pola. Perbandingannya selalu "top-down". Dalam contoh ini, saat memanggil function_1 dari dua parameter, pertama-tama akan memeriksa apakah parameter kedua adalah : ok . Jika pemeriksaan pertama gagal, maka pemeriksaan dilakukan untuk : kesalahan . Dan jika tidak lagi, maka dalam hal apa pun kita akan memasukkan versi ketiga dari metode ini. Garis bawah berarti "data apa pun", serta fakta bahwa data yang diterima tidak menarik bagi kami, yaitu, kami tidak akan menggunakannya. Jika function_1 (params, _) adalah yang pertama dalam daftar, program akan selalu memilihnya, dan dua metode lainnya tidak akan pernah berfungsi. Jika pola yang diinginkan tidak ditemukan, pengecualian akan dibuang.

2. Saluran Pipa

Ini adalah konstruksi dari bentuk berikut:

 param_1 |> func_1() |> func_2(param_2) … 

Sepintas, sepertinya ada sampah. Tetapi perlu diingat bahwa Elixir adalah bahasa fungsional. Dan dalam bahasa fungsional, cukup normal untuk melakukan perhitungan fungsi fungsi, tanpa variabel perantara. Pipeline hanyalah entri yang nyaman. Bahasa itu sendiri meminta kejelasan untuk memulai jalur pipa dengan variabel atau nilai.

Contoh di atas dapat ditulis ulang sebagai berikut:

 func_2(func_1(param_1), param_2) 

Dengan kata lain, pipeline mengalihkan hasil penghitungan fungsi sebelumnya ke fungsi berikutnya dengan argumen pertama.

3. Kurangnya siklus

Tidak ada siklus di Elixir. Fakta ini menyebabkan kejutan terbesar dalam diri saya, dan itulah yang paling sulit dipahami. Berikutnya adalah pendapat dan visi saya, yang mungkin tidak sesuai dengan kenyataan dan teori.

Akar dari fakta ini adalah dalam paradigma pemrograman fungsional, salah satunya menyatakan bahwa hasil dari suatu program adalah pekerjaan dari suatu fungsi yang dapat memanggil fungsi-fungsi lain dan program tidak melibatkan penyimpanan keadaan perantara. Siklus, pada gilirannya, dirancang untuk berulang kali mengubah keadaan eksternal ke siklus.

Dua hal berfungsi sebagai pengganti siklus - metode rekursi dan perpustakaan untuk bekerja dengan elemen bahasa yang tak terhitung jumlahnya.

Sedikit lagi tentang hal-hal kecil.

1. Tidak ada kelas di Elixir, tetapi ada konteks. Pada dasarnya, konteks dalam beberapa cara menggantikan kelas. Deskripsi konteks terdekat melalui mata s-lebih tajam: konteks adalah persilangan antara kelas dan namespace di sharpe, dan konteksnya jauh lebih dekat dengan namespace.

2. Atom. Di Elixir ada yang namanya atom. Atom pada dasarnya adalah semacam "label". Cara termudah untuk memperlakukan mereka adalah sebagai jalur khusus. Contoh dalam artikel ini sudah memiliki dua atom :: ok ,: error . Berkat atom, pencocokan pola dan konstruksi logika yang kompleks jauh lebih mudah. Intinya, ini adalah konstanta yang nilainya adalah nama mereka. Sebuah atom selalu memiliki ":" di depan nama.

3. Cara membaca header metode dengan benar. Dalam Elixir, sudah lazim untuk menunjuk metode sebagai berikut (ini terutama sering terlihat dalam dokumentasi): & function / 2 . Itu dibaca sebagai metode dengan nama "fungsi" dan arity 2. Arity adalah jumlah argumen yang diambil.

Apa yang membantu saya mengintegrasikan ke dalam bahasa.

Pertama, ini adalah direktori di "Tutorial Elixir" android. Ini bagus karena secara singkat mencakup poin utama bahasa dan sintaksisnya, dan dapat dibaca di bus. Lebih sedikit: ini dalam bahasa Inggris, jadi tidak cocok untuk semua orang.

Kedua, buku "Pengantar Elixir" yang ditulis oleh Senloren S., Eisenberg D. ... Buku ini menunjukkan metode bekerja dengan bahasa dan menjelaskannya. Mudah dibaca dan memungkinkan Anda meningkatkan pekerjaan dengan bahasa secara signifikan. Itu juga dapat ditemukan dalam bahasa Rusia.

Ketiga, dokumentasi online resmi. Itu dibuat dengan mudah dan memungkinkan Anda untuk dengan cepat menemukan bagian / metode yang diperlukan, dengan deskripsi dan contoh terperinci.

Itu saja.

Daftar bahan:

1. Tutorial Elixir

2. Senloren S., Eisenberg D. Pengantar Elixir. Pengantar pemrograman fungsional. - O'Reilly, 2017.

3. Dokumentasi resmi.

Source: https://habr.com/ru/post/id435796/


All Articles