Belajar Design Pattern Part 1 — Builder

Belajar design pattern untuk membuat struktur code menjadi lebih baik.

Hudya
7 min readDec 14, 2020

Halo semua, Kiddy disini dan pada kali ini saya ingin berbagi insight mengenai design pattern pada Python.

“Kok Python doang sih bang?”

Duh mohon maaf ya, saya ngga punya waktu nulis di berbagai bahasa jadi Python aja ya ehehehe.

Sebelumnya mungkin masih ada yang baru belajar programming, dan masih bingung.

Design pattern tuh apasih?

Kenapasih harus design pattern?

Ngeribetin gue aje lu, udah OOP ribet, lu mau nambah-nambahin lagi bang?

Eits jangan marah-marah dulu, biar tak jelasin secara singkat dan mudah.

Design patterns are typical solutions to common problems in software design. Each pattern is like a blueprint that you can customize to solve a particular design problem in your code. — Refactoring Guru

Nah gampangnya, design pattern adalah sebuah solusi dari permasalahan di desain code, tiap pattern ibarat gambaran yang kamu bisa buat sesuka hati sesuai masalah yang ada pada projekmu.

Kenapa harus pake design pattern?

Pernah ngoding sebuah projek pake Laravel dengan design MVC ngga? atau ngebuat API pake Lumen, atau Flask? Ya, MVC merupakan salah satu design pattern yang sangat terkenal hingga saat ini, tapi design pattern MVC saja tidaklah cukup untuk membuat kode kamu menjadi lebih baik, MVC hanya mempersingkat banyak proses routing, penampilan view dan hal lainnya. Sehingga, kamu masih perlu design pattern yang lainnya.

Bayangkan, semakin projek kamu makin berkembang, dan makin berkembang, apa yang terjadi?

Exactly, controller dan code-code kamu jadi GENDUT!

Gendut? Masa iya bang?

Lah beneran asli deh, mungkin kamu belom merasa projek kamu gendut karena business logic kamu total barisnya belom sampe > 500 line (atau malah kamu yang ngga paham apa itu code gendut?), kalo udah sih fix kamu harus buru-buru masang pattern design yang lebih baik deh.

Jadi sebagian senior software engineer dalam projeknya pasti punya sebuah file yang isinya adalah keseluruhan business logic. Literally semuanya ditumpuk kedalam satu file sehingga code tersebut menggendut karena kita sama-sama tau yah business logic kan banyak banget kondisi if else, terus cek sana sini, eksekusi ke db, termasuk jalanin worker.

Kalo sebuah file service ada 10 fungsi yang memiliki kondisi business logic yang beragam, tentu saja kodenya akan menggendut, alias lebar bro hehehe.

Nah design pattern ini bertugas dalam membuat kode kamu yang tadinya gendut, menjadi rada slim sedikit deh dengan cara memecah-mecah file berdasarkan pattern itu sendiri, sehingga paradigma kamu akan berubah sesuai tatanan kitab suci pattern design itu sendiri.

Nah dalam dunia software engineering menurut mas-mas pembuat refactoring.guru, terdapat tiga kategori pattern design:

  1. Creational Patterns
  2. Structural Patterns
  3. Behavioral Patterns

Nah yang kita akan bahas di part 1 ini adalah creational patterns, yaitu Builder.

Kenalan dulu yuk sama creational patterns.

Creational Patterns

Apasih creational patterns itu? Creational patterns adalah pattern yang menyediakan berbagai mekanisme pembuatan objek, yang akan meningkatkan fleksibilitas dan menggunakan code yang reusable!

Ada beberapa pattern di creational patterns, yaitu:

  • Factory
  • Abstract Factory
  • Builder
  • Prototype
  • Singleton

Nah di tutorial tahap pertama ini kita akan bahas builder terlebih dahulu yaa.

IMPORTANT TO KNOW

PENTING BANGET KAMU KETAHUI!

Design pattern bukanlah potongan kode, melainkan sebuah struktur atau pattern yang dapat kamu olah sesuai kebutuhan kamu. Sehingga, ketika kamu melihat kode saya kamu ngga perlu selalu menerapkannya sama persis dengan yang saya buat!

Kamu adalah sang programmer, kamu adalah sang pencipta kode, tidak perlu harus mengikuti orang lain, gunakan kode saya hanya sebagai referensi saja!

Builder

src: refactoring.guru

Builder adalah design pattern creational yang dikhususkan untuk membuat sebuah object yang kompleks tahap demi tahap. Pattern ini membuat kamu dapat menghasilkan berbagai tipe dan representasi dari sebuah object hanya dengan menggunakan basis kode yang sama.

Studi Kasus

src: refactoring guru

Bayangkan kamu adalah seorang arsitektur ternama (cielah), kamu mendapatkan pekerjaan dari sebuah kontraktor dimana kamu harus punya satu basis rumah, tapi rumah tersebut dapat dibentuk menjadi beberapa rumah, yaitu rumah dengan garasi, rumah dengan kolam renang, rumah dengan patung keren, dan rumah dengan kebun (kayak harvest moon getoh xixixi).

Apa yang harus jadi modal kamu? Tentu saja Objek Rumah itu sendiri, karena rumah adalah objek utamanya yang dapat dibentuk sesuai kasus permintaan kontraktor.

Ada kasus lain lagi loh, gimana kalo tiba-tiba si kontraktor pengen banget membuat rumah tersebut kustom banget? Rumah tipe A bisa aja punya empat jendela, dua pintu, ada kolam renang, sedangkan Rumah tipe B punya tiga jendela, tiga pintu, tidak ada kolam renang, tapi ada kebun. Nah loh gimana tuh?

Solusi

Kamu bisa bentuk Class HouseBuilder yang akan membuat rumah berbasis standar, nantinya juga kamu bisa membuat tipe-tipe rumah sesuai permintaan kontraktor hehehe.

Diibaratkan COC, kamu bisa menyuruh para pekerja untuk membuat bangunan sesuai keinginan kamu, dan tiap pekerja udah punya spesialisasi untuk bangunannya sing masing.

Algoritma

  1. Pastiin kamu udah mendefinisikan semua kebutuhan yang kamu butuhkan untuk membuat sebuah representasi objek. Jikalau kamu belom definisikan, ya gimana mau representasi yang lain? 😜
  2. Deklarasikan fungsi-fungsi dari tahap pembuatan di interface kamu, misalnya setRoof, setDoor (Hampir mirip dengan konsep OOP enkapsulasi). Jangan lupa membuat fungsi build(), dimana ini akan jadi fungsi membangun produkmu, dan fungsi getResult() untuk mengembalikan hasil dari produkmu.
  3. Buat sebuah Class yang akan menjadi Objek pengenal pembuatan produk itu sendiri.
  4. Kode utama kamu akan memanggil objek di Nomor 3, dan memberitahunya untuk bekerja membuatkan produkmu, bisa dengan step by step, atau satu fungsi dasar untuk membentuk semuanya sekaligus (pilihan ada ditanganmu).
  5. Kembalian dari produk akan kamu dapatkan dengan memanggil getResult().

CODING

SPESIAL KALI INI SAYA TIDAK AKAN MENYEDIAKAN COPY PASTE MELAINKAN KAMU HARUS MENULIS SENDIRI DEMI MEMAHAMI STEP BY STEP CODE DESIGN PATTERN ITU SENDIRI KARENA INI CUKUP SAKRAL DAN DENGAN COPY PASTE BELOM TENTU LANGSUNG PAHAM.

Kamu sebagai programmer dituntut memiliki satu base sebuah objek Projek yang sama, tapi dapat menghasilkan dua projek yang berbeda, yaitu E-commerce dan Blog, tiap produk dapat memiliki parameter bahasa pemrograman, pattern, hingga framework yang digunakan dengan bebas, sehingga dapat dilakukan sebuah input. Bagaimana cara kamu menyelesaikannya?

Pertama, siapkan dulu file dengan nama Project.py dan tulis kode berikut:

Lalu buat sebuah file bernama ProjectBuilder.py, file ini akan menjadi abstract method dimana kita akan mewariskan sifat-sifat abstrak dari Builder Project milik kita.

Sekarang buat sebuah file bernama ECommerceProjectBuilder.py, disini kita akan membuat sebuah project builder khusus projek E-commerce, kode ini seperti poin yang saya jelaskan pada point nomor 4 pada bagian algoritma.

Masukkan kode berikut:

Buat juga file bernama BlogProjectBuilder.py, tidak ada perbedaan yang spesifik yang saya gambarkan, hanya saja membedakan dari setName dan setDescription saja. Kamu bisa copy paste kode yang sebelumnya dan ubah pada bagian setName dan setDescription.

Sekarang buat file main.py dan masukkan kode berikut:

Kita memanggil ECommerceProjectBuilder dan BlogProjectBuilder untuk menciptakan dua produk yang berbeda, yang satu E-Commerce, yang satu Blog. Pada contoh ini, kita bisa melakukan kostumisasi Bahasa Pemrograman, Framework, maupun Pattern Design itu sendiri.

Hasil

Another Case Study

Kamu diminta membuat Sebuah Objek Burger dimana Objek Burger ini dapat ditransformasi menjadi Double Burger atau Classic Burger. Bagaimana cara kamu menyelesaikannya?

Pertama kita buat file bernama burger.py yang menjadi Objek Burger, lalu tulis kode dibawah ini (agak panjang):

Sekarang, ingat kembali poin nomor 4, kita harus membuat objek pembuat dari objek itu sendiri. Namun, kita harus membuat file dasar abstraknya terlebih dahulu. Buat sebuah file bernama burger_builder.py dan tulis kode dibawah ini:

Sekarang kita akan membuat si pembuat objek tersebut, buat sebuah file bernama classic_burger_builder.py dan tulis kode dibawah:

Lalu buat juga file bernama extra_burger_builder.py dan tulis kode dibawah:

Sekarang, tambahkan baris kode ini pada file main.py kamu.

Hasilnya akan seperti ini:

Gimana? Mudah kan? Dengan dua kasus diatas saya rasa kamu sudah bisa memiliki gambaran bagaimana pattern builder itu sendiri.

Perlu diingat, bahwa yang saya tuliskan hanyalah sebuah referensi! Kamu tidak harus mengikuti sama persis seperti apa yang saya buat pada projekmu, kamu dapat mengembangkannya dengan versi milikmu, sesuai apa yang kamu percayai sebagai Software Engineer!

Semua sumber dari gambar hingga pengetahuan saya dapatkan salah satunya dari website refactoring.guru yang dibuat oleh Alexander Shvets. Apabila kamu mau penjelasan lebih kompleks kamu dapat mengunjunginya disana, dan jangan lupa beli karya-nya untuk menghargainya!

Buku beliau yang sudah saya beli!

Saya udah beli loh, jangan lupa sisihkan uang kamu juga ya untuk menghargai karyanya! ❤

Kalau begitu sampai jumpa di artikel selanjutnya, saya akan lebih banyak menulis tentang Design Pattern.

Adios, sampai jumpa, dan Happy Coding! ^^

--

--

Hudya
Hudya

Written by Hudya

Which is more difficult, coding or counting? Not both of them, the difficult one is sharing your knowledge to people without asking the payment.

No responses yet