> On 7/31/07, Arie Kusuma Atmaja <[EMAIL PROTECTED]> wrote:rubyist
> yg biasa dari java ada yg bisa terangin sharing maksudnya gak?
>
> ini dari pak jim,
>
> http://onestepback.org/index
> .cgi/Tech/Ruby/DependencyInjectionInOneSentence.red
>
> Dependency Injection in One Sentence
>
> Condensing thoughts down to one sentence …
> In One Sentence …
>
> So I was asked this question in IM today:
>
> If you had one sentence to explain to a Java programmer why Dependency
> Injection is rarely necessary in Ruby, what would it be?
>
> Wow, one sentence! After some thought, here's what I sent back:
>
> Dependency injection provides vital flexibility in Java and unneeded
> overhead in Ruby.
>
> Anyone have other suggestions?
>

Jawaban pendek:
Java -> Static typing.
Ruby -> Dynamic typing.

Implikasi jawaban pendek itu bisa runyam seperti ini:

Di Ruby, karena dynamic typing, kita bisa kapan saja mengganti perilaku "
3.minutes.ago" dengan menyunting sebuah class di ActiveSupport bahkan disaat
aplikasi kita sedang mode production.

Karena static typing (baca: semua harus valid saat compile), kita nggak bisa
seenaknya mengganti "doMinutesAgo(int minuteValue)" setelah aplikasi
di-compile, bahkan itu disaat development sekalipun. Kalau mau ganti, ya
compile.

Sekarang ganti "3.minutes.ago" dengan method yang penting, namun sering
banget berubah misalnya "calculatePPh25()". Kalau yang berubah hanya
parameter-parameter doank sih gampang, taruh saja parameter value di
database misalnya. Masalahnya penghitungan PPh25 itu kerap berubah
algoritmanya dari tahun ke tahun.

Jika perubahannya bisa diantisipasi, maka kita bisa menulis beberapa "the
so-called anticipated classes" yang menerapkan satu interface saja. Nanti
code client hanya perlu mereferensi/memanggil/dependen ke interface tadi.
Implementasi pemanggilan "the so-called anticipated classes" atau sering
dirujuk sebagai "concrete classes", pada umumnya, bisa menggunakan Factory
Method atau Abstract Factory.

(Jadi bisa ngerti sekarang kenapa Ruby nggak perlu Interface --dan hanya
menyediakan Mixins).

Untuk perubahan yang tidak bisa diantisipasi, tentu tidak feasible untuk
menerapkan strategy "code to interface" saja seperti diatas. Karena besar
kemungkinan terjadi perubahan kontrak (nggak pakem ikut Interface), maka
kita butuh bantuan dari luar. Bantuan ini biasa diimplementasikan dalam
bentuk konfigurasi XML, yang ide dasarnya, XML ini bisa diganti-ganti
kapanpun sesuai kebutuhan. Misal:

<xml sit="Up">
   <class nama="HitungPajak2007">
      <property name="addMethod" value="calculatePPh25"/>
      <property name="addMethod" value="calculatePPh21"/>
   </class>
  <class nama="HitungPajak2008">
      <property name="addMethod"
value="hitungPPh25BerdasarkanKeputusanDirjenPajak"/>
      <property name="addMethod" value="hitungPPh21"/>
   </class>
</xml>

(Sampai sini mestinya Rubyist bisa pandai-pandai bersyukur atas karunia
"method_missing").

Terakhir, mekanisme yang mengatur bagaimana XML ini dilem (glued) dengan
class-class yang bersesuaian dilimpahkan bukan pada JVM (karena memang bukan
tugas JVM) tapi pada DI container. Spring, Pico, Guice, dan HiveMind itu
contoh DI container populer.
Tentu saja DI container ini diciptakan bukan hanya untuk setter injection
seperti contoh "calculatePPh25" diatas, tapi juga untuk mengatasi resource
lookup (database connection, LDAP, dll) yang biasanya butuh 'biaya' mahal.

In short, kenapa ada DI di Java? Karena Java -> static typing -> butuh
di-compile.
Untuk bisa "mengganti" barang-barang yang sifatnya static, Java butuh
'trinitas DI':

1. Code client harus luwes dan fleksibel (code to interface).
2. Eksternalisasi Object configurations (XML situp, ataupun @annotations)
3. Sebuah 'mesin' a.k.a container yang bisa merekatkan antara configurations
dengan actual classes.

Ruby, karena dynamic typing -> tidak butuh compile dan mendukung duck
typing/method_missing, ya jelas tidak butuh apa-apa lagi untuk melakukan
perubahan ditengah jalan.

Tinggal tancap dan mainkan. Sama seperti PHP deh, hanya saja lebih baik.
Hihi..



-- 
http://andryshuzain.com


[Non-text portions of this message have been removed]



<*> Kunjungi *arsip milis* id-ruby di
    http://groups.yahoo.com/group/id-ruby/messages
    http://www.mail-archive.com/[email protected]/
    http://news.gmane.org/gmane.comp.lang.ruby.region.indonesia

<*> *Baca peraturan id-ruby* sebelum posting
    http://tech.groups.yahoo.com/group/id-ruby/files/

<*> Ikutilah *Jajak Pendapat ID-Ruby*
    http://tech.groups.yahoo.com/group/id-ruby/polls

<*> *Links ID-Ruby*
    http://tech.groups.yahoo.com/group/id-ruby/links

<*> *Database ID-Ruby*
    http://tech.groups.yahoo.com/group/id-ruby/database

<*> Untuk mengubah settings online, kunjungi
    http://groups.yahoo.com/group/id-ruby/join
    (Anda harus punya Yahoo! ID)

<*> Untuk *mengubah setting lewat email*, kirim email ke
    mailto:[EMAIL PROTECTED]
    mailto:[EMAIL PROTECTED]

<*> Untuk *meninggalkan milis*, kirim email kosong ke
    mailto:[EMAIL PROTECTED]

 
Yahoo! Groups Links

<*> To visit your group on the web, go to:
    http://groups.yahoo.com/group/id-ruby/

<*> Your email settings:
    Individual Email | Traditional

<*> To change settings online go to:
    http://groups.yahoo.com/group/id-ruby/join
    (Yahoo! ID required)

<*> To change settings via email:
    mailto:[EMAIL PROTECTED] 
    mailto:[EMAIL PROTECTED]

<*> To unsubscribe from this group, send an email to:
    [EMAIL PROTECTED]

<*> Your use of Yahoo! Groups is subject to:
    http://docs.yahoo.com/info/terms/
 

Kirim email ke