Fakultas Ilmu Komputer UI

Skip to content
Snippets Groups Projects
user avatar
Muhammad Rafif Elfazri authored
49ce2dc9
History

Diskuy Backend

Tentang Aplikasi

Diskuy adalah sebuah aplikasi forum berbasis web. Thread-thread diskusi dengan topic yang bermacam-macam. Pengguna diwajibkan untuk mebuat akun apabila pengguna ingin mebuat topic, thread dan komen baru.

Penerapan Functional Programming

Pure Function

Pure Function adalah sebuah konsep dimana fungsi yang hanya bergantung pada argumen yang diberikan sehingga jika argumen yang sama diberikan, maka fungsi tersebut akan mengembalikan nilai yang sama dari sebelumnya. Fungsi ini tidak dipengaruhi oleh variabel-variabel di luar argumen dan tidak memutasi variabel apapun. Contoh Penerapan:

diskuy@c80fdf94

File yang highlight adalah guardian.ex dan fungsi yang saya highlight adalah fungsi validate_password yang menerima password dan encrypted_password. Fungsi ini hanya memeriksa apakah argumen password dan encrypted_password sama sehingga tidak membutuhkan variabel lain selain dua argumen dan fungsi tersebut konsisten memetakan dari argumen-argumen fungsi tersebut ke satu nilai.

Higher Order Function (Map) + Partially Applied Function + Pure FunctionHigher

Order function adalah sebuah konsep dimana sebuah fungsi menerima atau mengembalikan suatu fungsi. Higher order function yang saya gunakan adalah Map yang memetakan setiap elemen dari data enumerable ke dengan argumen fungsi yang diberikan.Argumen fungsi yang diberikan menggunakan konsep ke dalam fungsi map menggunakan partially applied function, yaitu sebuah fungsi yang saat diaplikasikan tidak memerlukan argumen penuh, fungsi tersebut dapat menerima secara terpisah. Contoh penerapan:

https://gitlab.cs.ui.ac.id/functional-programming/diskuy/-/blob/master/diskuy_back/lib/diskuy/utility/utility.ex

Fungsi yang saya highlight dari file ini adalah fungsi capitalize_string yang menerima input text yang berupa string. Fungsi ini mengkapitalisasi setiap huruf pertama dari suatu kata dalam string tersebut. Fungsi tersebut menggunakan melakukan split pada text dengan dengan delimiter single white space yang menghasilkan list of string dan kemudian dengan hasil tersebut dimasukkan ke dalam fungsi Enum.map_join (Fungsi yang melakukan map dan melakukan konkantenasi elemen map dengan delimiter tertentu) sebagai argumen pertama, argumen kedua whitespace “ “, dan argumen ketiga fungsi String.capitalize/1 yang diubah menjadi partial function dengan & operator pada fungsi tersebut yang menyebabkan fungsi tidak perlu diaplikasikan dengan argumen penuh / dapat menunggu argumen. Fungsi ini juga merupakan pure function karena hanya membutuhkan argumen fungsi dan tidak mengubah variabel apapun.

Pattern Matching

Pattern Matching adalah sebuah konsep functional programming dimana kita dapat mendefinisikan fungsi dengan beberapa pattern argumen yang dimana setiap pattern argumen memiliki function body yang dapat memiliki behaviour yang berbeda satu sama lain.

Contoh Penerapan Pattern Matching:

https://gitlab.cs.ui.ac.id/functional-programming/diskuy/-/blob/master/diskuy_back/lib/diskuy_web/views/user_view.ex

Pattern matching yang dilakukan diatas adlah pattern matching pada pada argumen pertama dari fungsi render yang body dari functionnya memiliki behaviour yang berbeda-beda dalam men-serialize suatu struct menjadi JSON.

Pipe Operator

Pipe Operator adalah sebuah konsep dimana hasil dari suatu fungsi dapat diberikan ke fungsi yang lain yang dihubungkan dengan pipe operator. Pipe operator sangat mirip sekali dengan function composition, yang membedakannya urutan menjalankan fungsi. Pipe operator menjalankan fungsi dari yang pertama didefinisikan (dari kiri ke kanan) sedangkan function composition menjalankan fungsi dari yang terakhir didefinisikan (dari kanan ke kiri). Contoh Penerapan Pipe Operator:

https://gitlab.cs.ui.ac.id/functional-programming/diskuy/-/blob/master/diskuy_back/lib/diskuy/account.ex

Lambang pipe operator pada programming language yang saya gunakan, elixir adalah “|>” dan Pipe operator pada elixir akan mengambil mengisi argumen pertama dari sebuah fungsi yang diteruskan menggunakan pipe operator.

Pipe operator tersebut akan ditulis menjadi user |> User.changeset(attrs) |> Repo.update() yang ekuivalen dengan Repo.update(User.changeset(user, attrs)). Dapat dilihat bahwa pipe operator membuat kode tersebut menjadi lebih readable

Cara Menjalankan Aplikasi

Cara menyalakan server Phoenix untuk aplikasi ini :

  • Install dependencies dengan mix deps.get
  • Setup file config/dev.exs dan isi credential username dan password user pada database postgresql.
  • Buat dan lakukan migrate pada database dengan mix ecto.setup
  • Nyalakan server Phoenix dengan mix phx.server

Sekarang anda bisa mengakses localhost:4000 dari browser anda.

Sudah ready untuk dijalankan di production? Mohon lihat deployment guide berikut ini.

Pelajari lebih lanjut

Authors

Kelompok 18

  • Fadhil Pradipta - 1806205344
  • Jonathan - 1806204985
  • Muhammad Rafif ELfazri- 1806205722
  • Ryo Axton Lie - 1806205571

Acknowledgements

  • CS UI - Functional Programming 2020