Memahami Cara Kerja Builder Di Groovy


Saya akan mengawali tulisan pertama di tahun 2013 ini dengan topik yang belum pernah saya bahas sebelumnya yaitu bahasa pemograman Groovy.  Bahasa pemograman Groovy adalah sebuah bahasa pemograman yang berjalan di atas platform Java.  Dengan demikian, Groovy dapat memakai semua class yang sudah ada di Java.   Hal ini akan sangat membantu, karena Java memiliki sangat banyak API yang beragam; sebuah bahasa yang baru lahir mustahil memiliki daftar class selengkap Java yang teruji selama bertahun-tahun (baik yang resmi maupun oleh komunitas open-source).  Sebenarnya tidak hanya Groovy yang dapat memanggil class Java, JRuby (implementasi bahasa pemograman Ruby di Java) dan Jython (implementasi bahasa pemograman Python di Java) juga dapat melakukannya.

Kelebihan Groovy dibanding bahasa pemograman Java adalah syntax-nya yang lebih sederhana sehingga coding bisa lebih ringkas.  Tapi bukan hanya itu saja, Groovy juga memiliki fitur yang tidak ada di Java seperti GString (seperti String di PHP), operator untuk regex seperti di Perl,  mendukung Invoke Dynamic Java 7 (memanggil method tanpa perlu mengetahui apa method tersebut), dan sebagainya.

Salah fitur Groovy adalah ia memiliki Builder yang menerapkan Builder pattern.  Sebagai contoh, saya bisa menghasilkan XML secara singkat dengan memakai class MarkupBuilder, seperti yang terlihat pada kode program Groovy berikut ini:

def writer = new StringWriter()
def builder = new groovy.xml.MarkupBuilder(writer)
builder.daftar {
    mahasiswa(nim: "99887766", nama: "Sandu Kosaso") {
        matakuliah(nama: "data structure", nilai: "D")
        matakuliah(nama: "character building", nilai: "E")
        matakuliah(nama: "business plan", nilai: "A")
    }
    mahasiswa(nim: "99887755", nama: "Ide O") {
        matakuliah(nama: "java programming", nilai: "A")
        matakuliah(nama: "business plan", nilai: "B")
        matakuliah(nama: "system architecture", nilai: "C")
    }
}
print writer

Hasilnya adalah sebuah XML yang terlihat seperti berikut ini:

<daftar>
  <mahasiswa nim='99887766' nama='Sandu Kosaso'>
    <matakuliah nama='data structure' nilai='D' />
    <matakuliah nama='character building' nilai='E' />
    <matakuliah nama='business plan' nilai='A' />
  </mahasiswa>
  <mahasiswa nim='99887755' nama='Ide O'>
    <matakuliah nama='java programming' nilai='A' />
    <matakuliah nama='business plan' nilai='B' />
    <matakuliah nama='system architecture' nilai='C' />
  </mahasiswa>
</daftar>

Kode program ini benar-benar sangat singkat bila dibandingkan dengan cara yang harus ditempuh melalui Java.

Tapi pertanyaannya adalah kenapa bisa demikian?  Tidak ada method daftar di MarkupBuilder, bukan? Juga tidak ada definisi method mahasiswa dan matakuliah, bukan?  Lalu kenapa bisa jadi XML??

Hal ini berkaitan dengan apa yang disebut dengan Meta Object Protocol (MOP) yang memungkinkan programmer untuk mengubah atau menambah method pada class secara dinamis.   Setiap class milik Groovy selalu mengimplementasikan interface groovy.lang.GroovyObject.   Terdapat juga sebuah class GroovyObjectSupport sebagai class utility yang mengimplementasikan interface GroovyObjectSupport.   Sebagai contoh, class MarkupBuilder diturunkan dari BuilderSupport yang diturunkan dari GroovyObjectSupport. UML Class Diagram berikut ini memperlihatkan struktur class yang ada:

Hierari Class MarkupBuilder

Hierari Class MarkupBuilder

Jika pada saat program dikerjakan, sebuah method yang dipanggil tidak ditemukan dalam definisi class tersebut, maka method getProperty(), setProperty(), atau invokeMethod() milik GroovyObject tersebut akan dikerjakan.

Dengan demikian, pada kode program saya, method daftar(), mahasiswa(), dan matakuliah() yang pada dasarnya tidak ada di MarkupBuilder, akan menyebabkan method invokeMethod() di class BuilderSupport dikerjakan,  yang dimana selanjutnya akan memanggil method createNode()untuk membentuk XML.

Dengan MOP, saya dapat mengubah perilaku sebuah object pada saat program dijalankan.  Proses membuat kode program di sebuah bahasa pemograman agar bahasa pemograman tersebut berperilaku sesuai dengan yang saya harapkan disebut sebagai metaprogramming.

Hal yang membedakan metaprogramming dan membuat bahasa pemograman baru adalah pada metaprogramming, saya memakai kemampuan MOP dari bahasa pemograman tersebut untuk mengubah perilaku bahasa pemograman itu sendiri dimana perubahan perilaku ini akan terjadi setelah program dijalankan.

Hasil akhir metaprogramming bisa saja membentuk sebuah bahasa pemograman mini yang spesifik sesuai kebutuhan dan nantinya dipakai oleh metaprogrammer.  Bahasa seperti ini disebut sebagai Domain-specific Language(DSL).

Perihal Solid Snake
I'm nothing...

Apa komentar Anda?

Please log in using one of these methods to post your comment:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s

%d blogger menyukai ini: