Pendahuluan

Fluent Interface is an object-oriented API whose design relies extensively on method chaining. Its goal is to increase code legibility by creating a domain-specific language (DSL)

Fluent Interface

Artinya :

Fluent Interface adalah desain OOP (Object Oriented Programming) untuk API yang pemberian nilai atribut nya menggunakan method chaining. Tujuannya agar mudah dibaca dengan menjadikannya sebuah domain-specific language (DSL)

Fluent Interface

Dimana kita melihat penggunaan fluent interface ini ?

Banyak sekali contoh penggunaan fluent interface ini.

  • java lambda stream api.
  • java 2 SDK AWS builder api.
  • jquery library misalnya untuk akses ajax call, database query, dll.
  • dll

Contohnya : di dalam bahasa Java


List<String> mobilList = Arrays.asList("Mobil1", "Mobil2", "Mobil3", "Mobil4", "Mobil5");

List<String> filteredMobilList = mobilList.stream().filter(mobil -> mobil.equals("Mobil1"))
    .collect(Collectors.toList());

Di code diatas, kita lihat object mobilList yang awalnya berupa Array of List , kemudian dijadikan stream.

Setelah menjadi object Stream, kemudian bisa dilakukan operasi manipulator terhadap objek tersebut dengan menggunakan fluent interface.

Kalau kita lihat ada 2 fungsi manipulator yang dibuat dengan cara fluent interface, yaitu :

  • .filter , yang melakukan fungsi filter terhadap list, dan mengembalikan Stream of String lagi.
  • .collect , yang melakukan pembuatan Array Of String dari hasil filter diatas, dan mengembalikan Array Of String kembali.

Kalau kita lihat, fluent interface ini sebenarnya lebih kepada wrapper fungsi yang menyembunyikan fungsi detailnya, yang kemudian bisa dichained dengan fungsi lain.

Yang ditekankan di alam fluent interface ini adalah masalah method chained nya, sehingga memudahkan bagi Software Engineer dalam membuat/membentuk sesuatu.

Dari code luar sebagai pengguna library lambda, kita cuma melihat bahwa fungsi chained ini ada sebagai bagian dari class Stream.

Apa saja kasus yang mungkin menjadi kandidat menggunakan fluent interface ini ?

Banyak kasus ketika orang cenderung menggunakan fluent interface, diantaranya :

  • Ketika ingin membuat atau menginstansiasi sebuah objek secara “natural”. Hal ini biasanya dibuat dengan menggunakan Builder Design Pattern.
  • Ketika ingin meng-assign attribut sebuah objek dengan konsep DSL (Domain Spesific Language).
  • Ketika membutuhkan fungsi yang berfungsi sebagai manipulator, seperti yang kita lihat di java fungsional stream.

Apa saja yang perlu kita ketahui mengenai fluent interface ini ?

  • return dari fluent interface tidak harus selalu dalam bentuk yang sama. misalnya kita lihat di lambda stream API, yang bisa fluent interface nya mengembalikan object, optional., dll. Tidak harus mengembalikan object Stream lagi.

  • fluent interface ini terkadang digunakan untuk tujuan meningkatkan loosely coupling untuk fungsi. Misalkan ada tambahan fungsi dan fitur, maka bisa saja ditambahkan tanpa harus takut mengganggu fungsi atau method lain. Hal ini seperti kasus OOP tapi di dalam level class, bukan di level code dibawahnya.

Apa kelebihan dan kekurangan memakai fluent interface ini ?

Kelebihan dari fluent interface ini :

  • mudah digunakan, jelas, dan singkat, natural.
  • bisa digunakan untuk menghindari kerumitan fungsi tertentu.
  • bisa digunakan untuk melakukan optimasi terhadap fungsi tertentu yang disembunyikan dalam fungsi fluent interface.
  • bisa digunakan untuk menambah tingkat keamanan terhadap fungsi tertentu yang disembunyikan dalam fungsi fluent interface.
  • bisa dijadikan alat untuk menjamin immutability ketika membuat sebuah objek.
  • menghindari casting sebuah object, misalnya menggunakn fluent interface .asJson, .asPlainText()
  • menyembunyikan code internal, misalnya inisiasi object ataupun decorator di dalam fungsi.
  • bisa memanfaatkan keuntungan builder pattern, misalnya untuk setting default value kalau tidak ada passing parameter dari luar.

Kekurangannya :

  • code untuk membuat fungsi isi dari fluent interface ini pastinya akan lebih banyak, kecuali sudah diakomodasi oleh library/frameworknya, seperti yang kita lihat di java stream API.
  • class nya akan berkembang membesar, ketika banyak fungsi tambahan yang diperlukan oleh karenanya perlu ada design secara hati-hati untuk menangani penambahan fungsi

Kesimpulan

Fluent Interface sering digunakan untuk membuat inisiasi objek, attribute, serta fungsi menjadi lebih “terasa” OOP secara fungsi.

Kita seakan mempunyai sebuah objek yang didalamnya kita bisa menemukan fungsi-fungsi yang terikat kepada “domain” dari objek tersebut.

Hal ini yang membuat fluent interface dirasakan natural, mudah, jelas bagi sebagian besar orang.

Penggunannya tentu saja terserah dari Software Engineer yang menggunakannya.