Home > Design Pattern > Fluent Interface

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 ??

Categories: Design Pattern Tags: , , ,
  1. debora1207
    February 3, 2009 at 11:19 am

    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😛

  2. February 3, 2009 at 11:20 am

    apa2an ini ces…
    da lama aq meninggalkan dunia pe-coding-an…
    wakakakaka…😀
    *titip salam si Ali

  3. thegands
    February 3, 2009 at 11:21 am

    hebat wel.. benar2 postingan sang programmer.. the real programmer… tapi klo dah ada kau buat APInya, aku pesan satu ya… wakakakaka

  4. weltam
    February 3, 2009 at 11:23 am

    @debora

    hahaha.. thax debz .. itulah masalah nya debz. masih pemula aku di bidang blog ini. thax ya debz ..

  5. ferrycold
    February 4, 2009 at 2:05 am

    kagak ngartiiii :))

  1. No trackbacks yet.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: