Fluent Interface
Fluent interface itu dicetuskan oleh si Eric Evans dan Martin Fowler. Intinya adalah style interface tertentu. Tertentu gimana ? Mmm dari contoh aja … Contoh ini menggunakan TimeAndMoney library dari eric evans.
Biasanya kita bikin interval waktu dgn cara seperti ini :
TimePoint fiveOClock, sixOClock; ... TimeInterval meetingTime = new TimeInterval(fiveOClock, sixOClock);
artinya adalah dari interval dari jam 5 sampai jam 6. Garing sekali ya penyampainnya. Tidak bersahabat. Old fashion. Cara lama. Nah dengan timeandmoney library kita bisa melakukan dengan cara
TimeInterval meetingTime = fiveOClock.until(sixOClock);
Wah. lebih jelas bukan ? lebih mencerminkan maksudnya apa. Programming intention yg jelas. Readable dan clarity. cool
Nah skarang kita ke contoh yg lebih real. Coba dengan order dari customer. Order memiliki LineItems dengan quantity dan product. Line item bisa diabaikan. Jadi hanya satu aja yg diabaikan atau di delay klo mw ngirim ketimbang semuanya. Dan ordernya ditandai dengan rush status.
bagaimana kita menuliskan codenya ?
private void makeNormal(Customer customer) { Order o1 = new Order(); customer.addOrder(o1); OrderLine line1 = new OrderLine(6, Product.find("TAL")); o1.addLine(line1); OrderLine line2 = new OrderLine(5, Product.find("HPK")); o1.addLine(line2); OrderLine line3 = new OrderLine(3, Product.find("LGV")); o1.addLine(line3); line2.setSkippable(true); o1.setRush(true); }
Kesimpulannya adalah kita bikin object2nya dan menghubungkannya dengan method yg disediakan. atau diikat. Misalkan kita bisa membuatnya dengan constructor tetap saja kita harus membuat temp variable dan kemudian mempassnya ke constructor. Contohny menambahkan item ke dalam collection.
Nah ini dengan fluent style :
private void makeFluent(Customer customer) { customer.newOrder() .with(6, "TAL") .with(5, "HPK").skippable() .with(3, "LGV") .priorityRush(); }
yeah… cool isn’t it…
Ini katanya sih erat hubungan nya dengan DSL atau Domain Spesific Languange. Blum baca sih gw … Ntar selesai ini dibaca. Satu satu dulu.
Tapi untuk membuat fluent API kita membutuhkan usaha extra. Karena mendesign API agar mudah dipahami dan digunakan adalah satu pekerjaan. Tambah lagi kita harus mengatur strukturnya agar bisa fluent. Huff. Tapi begitu selesai nikmat. Tinggal dot and gunakan fasilitas intelesense anda. hahaha. Tapi bukan hanya sebatas itu loh fluent interface.
Nah contoh yg bagus untuk fluent API adalah NMock. Padanan dari JMock untuk .NET.
Expect.Once.On(mockCurrencyService). Method("GetConversionRate"). With("GBP", "CAD"). Will(Return.Value(2.20));
Membangun API yg fluent ini bukan seperti kebiasaan membanguna API biasa. Ga sama. Salah satu yg jelas dari code diatas adalah setter yg mereturn value. Pada contoh order diatas with method menambahkan order line pada order dan mereturn order. Padahal konvensi kebanyakan adalah setter adalah void. Jadi menyalahi aturn command query separation.
Jadi kita harus memilih value yg akan direturn menurut apa yg dibutuhkan untuk melanjutkan aksi berikut. Jadi bisa seperti air mengalir. dot dot dot. wkwkwkwk. hidup jadi lebih mudah. yg sulit yg bikin API nya.
Nah masalahnya adalah… klo misalnya interface itu ga begitu jelas artinya kalo sendiri. Jadi harus ada komposisi baru jelas. Coba misalya kita lihat dokumentasi methodnya. Trus kita lihat ada method with. Oala.. apa maksud method nih … with .. dengan apa maksudnya… ?? alhasil jadi bingung sendiri. Jadi klo misalnya berdiri sendiri jadi jelek intentionnya. walah. Diperbaiki di satu sisi.Muncul sisi buruk di tempat yg lain.
Contoh yg paling cocok buat fluent interface ini adalah konfigurasi value object. jadi ga ada masalah dengan identitas. Bisa dicreate atau dimusnahkan. Jadi fluent interface mengembalikan object baru dari hasil pengolahan object yg lama. Ingat value object diusahakan imut imut. Eh.. Immutable maksudnya. Nah trus gimana dengan order yg diatas.Bukankah itu entity ?? menurut evans itu tidak bisa. makanya dia milih time and money. tul ga ??
Hohoho….comment pertama utk postingan ini π
Mending dimanage pake tag “more” setelah bbrp line, utk setiap postingan, say…jadi keliatan juga postingan2 sblumnya
Oya, about-nya diedit dunk π
apa2an ini ces…
da lama aq meninggalkan dunia pe-coding-an…
wakakakaka… π
*titip salam si Ali
hebat wel.. benar2 postingan sang programmer.. the real programmer… tapi klo dah ada kau buat APInya, aku pesan satu ya… wakakakaka
@debora
hahaha.. thax debz .. itulah masalah nya debz. masih pemula aku di bidang blog ini. thax ya debz ..
kagak ngartiiii :))