Javascript’s Module Pattern

Benny William Pardede
PPL D7 — Fasilkom UI
5 min readMay 2, 2019

Dirangkum dan diterjemahkan dari Learning JavaScript Design Patterns oleh Addy Osmani, O’Reilly, 2017

Salah satu aspek terpenting dari penulisan kode yang maintainable adalah kemampuan untuk memperhatikan pola yang berulang dalam kode itu dan mengoptimalkannya. Ini adalah area di mana pengetahuan tentang design pattern dapat terbukti sangat berharga.

Design Pattern (selanjutnya disingkat DP) adalah solusi untuk masalah yang biasa terjadi dalam desain perangkat lunak yang dapat digunakan berkali-kali untuk software yang berbeda (reusable). Design Pattern adalah topik yang menarik untuk dijelajahi dalam bahasa pemrograman apapun karena DP dapat membantu kita sebagai developer membangun software yang teroptimisasi berdasarkan pengalaman developer-developer yang sudah membangun software serupa (tak harus sama).

Terminologi design pattern bermuara dari karya awal seorang arsitek bernama Christopher Alexander. Dia sering menulis publikasi tentang pengalamannya dalam memecahkan masalah desain dan bagaimana mereka terkait dengan bangunan dan kota. Suatu hari, terpikir oleh Alexander bahwa ketika sebuah desain digunakan berulang kali, konstruksi desain tertentu menghasilkan efek optimal yang diinginkan. Sekitar 30 tahun yang lalu, para pengembang perangkat lunak mulai memasukkan prinsip-prinsip yang telah ditulis oleh Alexander ke dalam dokumentasi pertama tentang DP, yang akan menjadi panduan bagi developer pemula yang ingin meningkatkan keterampilan coding mereka.

Apakah yang dimaksud sebuah Pattern?

Pattern adalah solusi yang dapat digunakan kembali yang dapat diterapkan pada masalah yang biasa terjadi dalam desain perangkat lunak. Analogi lain untuk menjelaskan pattern adalah sebuah template untuk bagaimana kita memecahkan masalah yang dapat digunakan dalam beberapa situasi yang berbeda.

Lalu mengapa penting bagi kita sebagai software developer untuk mengetahui tentang DP dan menguasainya? DP memiliki tiga keuntungan:

  1. Pattern adalah solusi yang terbukti/teruji: Pattern menyediakan pendekatan yang solid untuk memecahkan masalah dalam pengembangan perangkat lunak menggunakan teknik yang telah terbukti dan yang mencerminkan pengalaman dan wawasan para pengembang yang mendefinisikan teknik tersebut ke dalam sebuah ‘pattern’.
  2. Pattern dapat dengan mudah digunakan kembali: Pattern biasanya mencerminkan solusi out-of-the-box yang dapat disesuaikan dengan kebutuhan kita sendiri.
  3. Pola dapat bersifat ekspresif: Ketika kita melihat sebuah pattern, pada umumnya ada struktur dan kosakata yang ditetapkan untuk solusi yang disajikan yang dapat membantu kita mengekspresikan solusi yang agak besar dengan cukup elegan.

Pattern tertentu dapat mengurangi footprint ukuran file dari keseluruhan kode kita dengan menghindari pengulangan. Pattern dapat mendorong developer untuk mengoptimal kan kode sumber mereka untuk area di mana pengurangan dalam pengulangan baris kode dapat dilakukan, mis. mengurangi jumlah fungsi yang melakukan proses serupa yang mendukung fungsi umum tunggal, ukuran keseluruhan kode sumber dapat dikurangi. Ini juga dikenal sebagai membuat kode lebih DRY (Clean Code!).

Pattern bukanlah solusi yang holistik bahkan bukan solusi final sama sekali. Perlu diingat bahwa peran suatu pattern adalah hanya untuk memberi kita skema solusi. Pattern tidak menyelesaikan semua masalah desain atau mengganti perancang perangkat lunak yang baik, namun mereka mendukungnya.

Kategorisasi jenis Design Pattern

Design pattern dapat dipecah menjadi beberapa kategori yang berbeda:

  1. Creational Design Patterns
    DP jenis Creational berfokus pada penanganan mekanisme pembuatan objek di mana objek dibuat dengan cara yang sesuai untuk situasi yang sedang kita tangani. Pendekatan yang dasar dalam pembuatan objek mungkin akan menambah kompleksitas dalam software dan pattern jenis creational bertujuan untuk menyelesaikan masalah ini dengan mengendalikan proses pembuatan.
  2. Structural Design Patterns
    DP jenis Structural berkaitan dengan komposisi objek dan biasanya mengidentifikasi cara-cara sederhana untuk mewujudkan hubungan antara objek yang berbeda. Mereka membantu memastikan bahwa ketika satu bagian dari suatu sistem berubah, seluruh struktur sistem tidak perlu melakukan hal yang sama. Structural DP juga membantu menyambungkan kembali bagian-bagian sistem yang tidak cocok dengan use case tertentu.
  3. Behavioral Design Patterns
    DP jenis Behavioral berfokus pada peningkatan atau perampingan komunikasi antara objek yang berbeda dalam suatu sistem. Bagaimana caranya agar task dapat dilakukan oleh sebuah objek dengan lebih terstruktur, bagaimana caranya agar task dapat berjalan secara general, namun hasilnya dapat disusun secara custom.

Implementasi

Pada proyek PPL kami dimana kami membangun sebuah service untuk mengingatkan pengguna untuk berbelanja barang yang berkemungkinan sudah habis, kami menggunakan salah satu design pattern yang cukup spesifik untuk bahasa pemrograman Javascript yakni Module Design Pattern. Walaupun sudah disebutkan bahwa design pattern adalah template solusi yang universal untuk seluruh bahasa pemrograman, ada bebarapa pengecualian seperti pada pattern yang kami gunakan ini.

Note: Perlu diingat pattern-pattern di dunia semuanya menjelaskan struktur kode dalam aspek struktur class dalam Object-Oriented Programming. Dalam ES5, JavaScript adalah bahasa tanpa kelas, namun kelas dapat disimulasikan menggunakan fungsi.

Module adalah bagian integral dari arsitektur software yang kuat dan biasanya membantu menjaga kode sumber untuk software yang terpisah dan terorganisir dengan baik. Module awalnya didefinisikan sebagai cara untuk menyediakan enkapsulasi private dan public untuk class dalam rekayasa perangkat lunak konvensional.

Module mengenkapsulasi “privasi”, state, dan organisasi menggunakan closures. Closures menyediakan cara membungkus campuran metode dan variabel public dan private, melindungi potongan-potongan kode bocor ke lingkup global dan secara tidak sengaja berbenturan dengan interface software lain. Dengan pola ini, hanya API publik yang dikembalikan, menjaga semua yang lain dalam penutupan tertutup.

Ini memberi kita solusi bersih untuk melindungi logika yang melakukan fitur-fitur utama sementara kita hanya mengekspos antarmuka yang ingin kita gunakan pada bagian lain dari aplikasi kita atau aplikasi orang lain. Ini persis dari apa yang terjadi pada struktur kode sumber kami untuk melakukan prediksi tanggal belanja untuk satu pengguna.

Gambar di kiri menunjukkan seluruh class (actually functions) yang berperan dalam membuat plotting tanggal-tanggal belanja setiap produk untuk setiap user. Pada akhirnya, semua fungsi tersebut akan dijalankan dalam satu ‘main class’ yang bernama mainPredictor.js. Dengan pemisahan class-class ini menjadi banyak module, kita hanya perlu menyerahkan satu buah kelas main tadi jika ingin dipakai di interface lain seperti frontend. Interface yang ingin menggunakan fitur ini tidak akan bisa melihat logic sebenarnya dari metode plotting yang kami buat karena pecahan algoritmanya tersembunyi dalam modules.

mainPredictor mengimport seluruh module yang dibutuhkan.

Penyembunyian logic ke dalam modul-modul ini tentu saja penting karena yang ‘mahal’ dari setiap fitur yang berhubungan dengan statistical analysis dan plotting adalah algoritmanya. Bagi developer software komersil, membagikan model/algoritma secara cuma-cuma hanya akan menguntungkan pesaing. Selain itu, dari aspek TDD, kami sebagai developer tidak perlu memusingkan bagaimana caranya membuat unit testing untuk satu iterasi algoritma plotting secara menyeluruh. Kami cukup membuat satu unit testing untuk masing-masing module sehingga jika ada error, debugger dapat mendeskripsikan dengan jelas bagian algoritma mana yang error.

Benny William Pardede
Koneg Liquid

--

--