Kenapa ada Builder Pattern - Joshua Bloch ?

Karena memang Builder Pattern yang dikenal di dunia Software Engineering itu ada 2 :

  1. Builder Pattern di dalam buku Effective Java, karangan Joshua Bloch.
  2. Builder Patter di dalam buku Design Pattern : Element of Reusable Object Oriented Software, karangan Erich Gamma, Richard Helm, Ralph Johnson, and John Vlissides

Dua-duanya membahas masing-masing mengenai cara membuat Object yang rumit secara elegan dan fleksibel. Tetapi masing-masing berada pada fokus dan jenis kerumitan yang berbeda.

Ok, sekarang kita bahas tentang Builder Pattern nya Joshua Bloch ?

Iyes.

Apa isinya sebenarnya ?

Builder Patternnya Joshua Bloch di dalam buku Effective Java berkaitan dengan menyelesaikan permasalahan pertama di artikel sebelumnya yaitu : bagaimana membuat sebuah object yang attributnya banyak dengan cara elegan dan fleksibel..

Bagi yang mau melihat Artikel awal tentang Builder Pattern

Coba kita lihat artikel awal tersebut :

Sebuah objek mobil :

public class Mobil {

	private String nomorStnk;
	private String nomorMesin;
	private String nomorRangka;
	private String merekBan;
	private String merekRadio;
	private String merekKacaFilm;
	private Integer tahunProduksi;
	private Integer kapasitasCc;
	private String merekJok;

	public Mobil(String nomorStnk, String nomorMesin, String nomorRangka,
               String merekBan, String merekRadio,String merekKacaFilm,
               Integer tahunProduksi, Integer kapasitasCc, String merekJok) {
		super();
		this.nomorStnk = nomorStnk;
		this.nomorMesin = nomorMesin;
		this.nomorRangka = nomorRangka;
		this.merekBan = merekBan;
		this.merekRadio = merekRadio;
		this.merekKacaFilm = merekKacaFilm;
		this.tahunProduksi = tahunProduksi;
		this.kapasitasCc = kapasitasCc;
		this.merkJok = merekJok;
	}
}

Permasalahannya ketika membuat sebuah objek mobil adalah ada attribut yang wajib untuk mobil, dan ada juga attribut yang opsional untuk mobil.

Attribut yang wajib misalnya nomorMesin, nomor Rangka, merekBan, kapasitasCc. Attribut yang opsional misalnya STNK, merekRadio, merek kaca film, merekJok, dll.

Dan kadangkala kita ingin agar attribut yang opsional ini mempunyai default value, walaupun kita tidak menentukan inputnya, dan akan otomatis terset ke nilai defaultnya. Misalnya untuk kapasitasCc, kalau tidak kita definisikan, misalnya mestinya nilai defaultnya 1300 cc.

Bagaimana cara mencapai hal seperti itu ?


Pertama : dengan cara sederhana, namanya Telescoping Constructor

Artinya : bikin constructor yang berisikan semua parameter yang ada di objek tersebut. Kemudian passing saja semua parameternya, kalau tidak ada nilainya, ya diset null saja.

Itulah yang kita lakukan di code diatas. Telescoping Constructor.

Contoh :

Mobil mobil = new Mobil("STNK01","NM908212121","NR87212111", "GOODYEAR", null, null, 2021, null, null);
Kelebihannya :
Mudah diimplementasikan, sangat natural dan tidak perlu ada desain.
Kekurangannya :
Secara konsep jelek, kita harus hapal posisi attribut tersebut dalam argumen constructor nya. Tidak mudah mencocokkan posisinya kalau attributnya cukup banyak. Code kita akan break kalau ada attribut baru dari objek tersebut. Hal ini karena kita harus menambah argumen constructor nya setiap kali ada tambahan attribute. Atau harus mengurangi argumen constructor nya setiap kali ada attribute yang didelete.


Kedua : dengan cara lebih bagus, Multiple Constructor

Artinya : bikin banyak constructor yang berisikan semua kombinasi atau kombinasi mayoritas parameter yang ada di objek tersebut.

Untuk kasus mobil diatas, maka kita akan buat 1 constructor mobil dengan parameter nomorMesin, nomor Rangka, merekBan, kapasitasCc saja, sementara lainnya kita anggap null atau diisi dengan nilai default.

Kemudian ditambah lagi dengan satu constructor yang parameternya bukan saja nomorMesin, nomor Rangka, merekBan, kapasitasCc, tetapi ada nomorStnk nya. Sehingga kalau sebuah mobil sudah mempunyai STNK, maka waktu create object mobil ini, maka bisa dipanggil constructor yang kedua.

Begitulah seterusnya, sampai semua constructor yang kita butuhkan tercapai.

public class Mobil {

	private String nomorStnk;
	private String nomorMesin;
	private String nomorRangka;
	private String merekBan;
	private String merekRadio;
	private String merekKacaFilm;
	private Integer tahunProduksi;
	private Integer kapasitasCc;
	private String merekJok;

	public Mobil(String nomorMesin, String nomorRangka,
               String merekBan, Integer kapasitasCc) {
		super();
		this.nomorMesin = nomorMesin;
		this.nomorRangka = nomorRangka;
		this.merekBan = merekBan;
		this.kapasitasCc = kapasitasCc;
		this.tahunProduksi = 2021;
	}

  public Mobil(String nomorStnk, String nomorMesin, String nomorRangka,
               String merekBan, String merekRadio,String merekKacaFilm,
               Integer tahunProduksi, Integer kapasitasCc, String merekJok) {
    super();
    this.nomorStnk = nomorStnk;
    this.nomorMesin = nomorMesin;
    this.nomorRangka = nomorRangka;
    this.merekBan = merekBan;
    this.merekRadio = merekRadio;
    this.merekKacaFilm = merekKacaFilm;
    this.tahunProduksi = tahunProduksi;
    this.kapasitasCc = kapasitasCc;
    this.merkJok = merekJok;
  }
}
Kelebihannya :
Mudah diimplementasikan, tidak banyak parameter yang dipassing null. Banyak pilihan ketika membuat sebuah objek.
Kekurangannya :
Membingungkan. Bisa jadi salah passing parameter ketika ada 2 atau lebih constructor yang punya jumlah argumen yang sama, tetapi berbeda tipe. Constructor nya bertebaran dimana-mana. Orang tidak akan seragam dalam membuat constructor.

Ketiga : dengan cara lebih bagus, Mandatory Constructor

Artinya : bikin hanya satu constructor yang berisikan semua attribut wajib untuk object tersebut. Attribut opsional silahkan memakai fungsi setter.

Kelebihannya :
Mudah diimplementasikan, tidak ada parameter yang dipassing null. Hanya satu pilihan constructor. Tidak membingungkan orang yang butuh create sebuah objek.
Kekurangannya :
Akibatnya membuat sebuah objek menjadi sebuah fungsi sendiri, tidak cukup constructor saja. Membuat sebuah object minimal ada 1 line untuk constructor , ditambah x Line sebanyak setter yang dibutuhkan untuk argumen opsionalnya.

Efeknya juga adalah, object yang kita buat menjadi object mutable setelah kita buat. Kita tidak akan tahu kapan sebuah atribute diubah setelah kita membuat sebuah objek. Apakah oleh kita sendiri atau kolega Software Engineer yang lain. Akan sangat berbahaya kalau ternyata atribut yang diubah tersebut digunakan untuk alur bisnis/teknis di line code setelahnya, dan kita tidak mengetahui logic barunya dimana dipanggil setter tersebut.



Keempat : dengan cara yang diadopsi oleh banyak bahasa pemrograman yaitu default value untuk atribut di sebuah objek.

Artinya : ini adalah fitur dari bahasa pemrogramannya, bahwasanya di constructor nya , Software Engineer bisa saja mendefinisikan apa default value dari sebuah atribute jika tidak diinput waktu memanggil constructor tersebut.

Bahasa apa yang mempunyai fitur ini ?

  • Groovy
  • JavaScript
  • Phyton
  • Ruby
  • PHP
  • Scala
  • Visual Basic
  • C++
  • dll

Contoh :

Groovy

def Mobil(kapasitasCc=1300) {
    print kapasitasCc
}

Sayangnya Java tidak mengakomodasi default value untuk constructor ini.

Kelebihannya :
Mudah diimplementasikan, tidak ada parameter yang dipassing null. Difasilitasi oleh bahasa pemrogramannya.
Kekurangannya :
Tidak semua bahasa pemrograman mempunyai fitur ini. Kasus object nya masih tetap mutable (bisa berubah di logic selanjutnya, bukan yang sekali bikin akan tetap seperti itu). Immutable Object artinya sekali object itu dibuat, maka state dari object itu tidak pernah berubah (karena set attribut baru atau mengubah nilainya).


Kelima : dengan Builder Pattern

Kelebihannya :
Mengakomodasi attribut objek yang wajib dan opsional dengan cara yang elegan. Juga menjamin Immutability dari object yang dibuat tersebut. Sekali object dibuat, maka object tersebut tidak diubah lagi.
Kekurangannya :
Diperlukan desain dan konsep untuk mengimplementasikan ini. Code yang dibutuhkan akan lebih banyak dan kalau tidak diimplementasikan dengan tepat, maka akan membingungkan.


Detail Builder Pattern - Joshua Bloch ini akan dibahas di artikel selanjutnya.