Apa itu declarative programming?
Declarative programming adalah metode pemrograman yang mengabstraksi alur kontrol (control flow) dari logika yang diperlukan agar perangkat lunak bisa melakukan suatu aksi. Alih-alih menjabarkan langkah-langkahnya, pendekatan ini lebih fokus pada menyatakan *apa* tugas atau hasil akhir yang diinginkan.
Declarative programming merupakan konsep pemrograman tingkat tinggi, yang merupakan kebalikan dari imperative programming. Dalam pendekatan ini, programmer menulis kode yang mendeskripsikan *apa* yang ingin dicapai dan *apa* hasil yang diharapkan, bukan *bagaimana* cara mencapainya. Tugas menentukan caranya diserahkan pada compiler dari program tersebut.
Model deklaratif mengandalkan kapabilitas yang telah dikonfigurasi dalam bahasa pemrograman tanpa memberikan instruksi eksplisit langkah demi langkah. Pendekatan ini biasanya digunakan dalam database dan perangkat lunak configuration management, dan umumnya memakai domain-specific language (DSL).
Declarative programming dan konteks independen
Karena program deklaratif hanya menyatakan tujuan akhir (apa), tanpa menyebutkan langkah-langkah menuju ke sana (bagaimana), maka program ini dikatakan bersifat kontekstual-independen. Artinya, ekspresi dalam program tersebut punya arti yang tetap, dan bisa digunakan di berbagai konteks yang berbeda.
Contohnya, dalam bahasa C, ekspresi while/if sudah didefinisikan secara permanen dalam bahasa tersebut, beserta urutan dari ekspresi yang mengikutinya. Jadi, maknanya tetap sama di mana pun digunakan—alias konteks-independen.
Keuntungan declarative programming
Program deklaratif lebih mudah dikerjakan karena hanya mengekspresikan logika komputasi tanpa memperumit kode dengan alur kontrol. Program seperti ini juga minim prosedur yang membingungkan, dependensi implisit, dan state yang bisa berubah, sehingga menyederhanakan proses pemrograman.
Declarative programming meminimalkan perubahan state. Objek immutable dalam kode bikin kode lebih mudah dibaca dan dipahami meskipun tanpa banyak komentar. Kode immutable juga lebih gampang di-*update*, di-*test*, di-*debug*, dan dikelola, karena proses latar belakang tidak bisa mengubah state tanpa sepengetahuan programmer. Selain itu, kode seperti ini juga lebih mudah dilacak—jadi kita bisa tahu data apa yang berubah dan di bagian mana, lalu cukup memuat ulang bagian tersebut.
Declarative programming juga menghindari efek samping pada state, seperti ketika sebuah fungsi secara tidak langsung mengubah variabel global atau menghasilkan output yang tak bisa diprediksi.
Contoh declarative programming
Dalam konfigurasi sistem, kalau seorang admin ingin menyalin file ke server, pendekatan pseudocode dengan cara iteratif mungkin akan terlihat seperti ini, dengan banyak if/then:

Sedangkan versi declarative-nya jauh lebih simpel, seperti ini:

Tidak ada logika kondisional. Cuma menyatakan aksi apa yang diinginkan dan server mana yang terlibat.
Cara kerja declarative programming
Declarative programming bergantung pada constraint dan logika (aturan) untuk mendefinisikan setup dan hasil akhir, serta menggunakan pernyataan deklaratif (makanya disebut declarative) untuk menyatakan niat programmer.
Constraint mendefinisikan properti yang dianggap benar dalam skenario pemrograman, seperti kesamaan (equality) atau ketidaksamaan (inequality) antar variabel. Constraint ini bisa sudah ada dalam bahasa atau disediakan lewat library tertentu.
Logic programming menyatakan fakta dan aturan dalam domain tertentu. Untuk bisa berjalan, pendekatan ini harus memisahkan kontrol dan logika. Constraint logic programming menggabungkan keduanya.
Biasanya declarative programming dilakukan dengan DSL, karena alur kontrolnya udah tertanam dalam bahasa tersebut, bukan ditulis eksplisit.
Jenis-jenis declarative programming
Ada tiga jenis utama dari declarative programming:
Constraint programming
Disebut juga constraint optimization, jenis ini menyatakan constraint (batasan) untuk sejumlah variabel keputusan. Constraint yang arbitrer ini membantu memodelkan masalah tanpa menyebutkan langkah-langkah penyelesaiannya.
Logic programming
Logic programming menggunakan pernyataan logis berupa aturan dan fakta serta inferensi logika berdasarkan data yang tersedia. Bahasa ini memakai query untuk menampilkan data, basis logika berupa predikat, dan fakta berbentuk atom.
Constraint logic programming
Jenis ini menyisipkan constraint ke dalam sejumlah klausa. Proses eksekusinya dilakukan oleh interpreter, yang akan membaca dan mengevaluasi klausa serta constraint-nya untuk membuktikan apakah sebuah goal bisa dicapai.
Declarative programming vs. imperative programming
Declarative programming bergantung pada komponen bahasa untuk menjalankan proses mencapai hasil. Dalam pendekatan ini, struktur umum seperti loop dan kondisi if/then tidak digunakan karena itu bersifat instruksional.
Declarative programming fokus pada hasil akhir, sementara imperative fokus pada bagaimana mencapainya. Analogi simpelnya, saat naik taksi, kita cuma bilang tujuannya, bukan ngasih petunjuk belok kanan atau kiri. Petunjuk arah itu kayak imperative programming.
Declarative programming membiarkan compiler menentukan cara mencapai tujuan, sedangkan imperative tidak. Selain itu, declarative menghindari variabel yang bisa berubah (mutable).
Declarative programming dibangun di atas fondasi yang dimungkinkan oleh imperative programming, tapi memungkinkan developer fokus menyelesaikan masalah ketimbang mikirin struktur kode. Ini bikin struktur kodenya jadi lebih simpel.
Banyak bahasa pemrograman modern memungkinkan gabungan antara pendekatan imperative dan declarative. Contohnya, bahasa Java memungkinkan developer menambahkan anotasi ke kode, yang memberi kemampuan deklaratif pada kode yang secara tradisional bersifat imperatif.
Contoh kode berikut menunjukkan penggunaan anotasi @Enumerated
untuk menyatakan bahwa properti clientGesture
adalah tipe enum yang harus disimpan dalam bentuk string di database:
@Enumerated(EnumType.STRING)
private Gesture clientGesture;
Bahasa pemrograman modern lainnya juga punya fitur serupa untuk mendukung pendekatan deklaratif.
Penggunaan declarative programming
Relational database adalah contoh populer dari declarative programming. Programmer menulis perintah dalam DSL bernama Structured Query Language (SQL) untuk mengontrol database. Query SQL seperti SELECT * FROM <TableName>
akan mengembalikan data tanpa perlu loop atau logika kondisional.
Alat configuration management seperti Chef, Puppet, dan PowerShell DSC juga pakai pendekatan declarative. Meskipun dibangun dengan bahasa iteratif seperti Ruby, Python, atau PowerShell, user cukup mendefinisikan kebutuhan mereka, dan alat tersebut akan menjalankan tugasnya tanpa perlu instruksi detail.