Okey ... mungkin sekarang gw aga kontroversial lagi nih.

Dengan adanya annotation sebenernya boleh dikatakan fungsi dari interface
dapat digantikan !!!

Kenapa ??? ijinkan gw menshare opini gw ehmmm ehmmm ....  ??

Mungkin boleh gw mulai ada apa dengan interface :)

Jaman dulu sebelum ada annotation kita menggunakan interface salah satu
kegunaannya
1. Mengikat kontrak
2. Mendecoupled application

1. Contoh mengikat kontrak
* Runnable interface mengikat kontrak dengan Thread Object
* UnitTest interface mengikat kontrak dengan JUnit framework
* EJB 2.1 mengikat kontrak dengan container
dll

2. Contoh mendecoupled application
* DI dengan menggunakan interface untuk mendecoupled application
* contoh yang ferdi sebutin :D

Pertanyaan ... apakah annotation bisa menggantikan fungsi diatas dalam hal
standarisasi ??
Jawabannya BISA !

Contoh
Buat kasus ferdinand bisa kita lihat dengan cara seperti ini.

secara interface kita bisa buat seperti ini misalll :

public interface MoneyTransferable{
   public Double getMoney();
   public String getAccountNo();
   public void feedBack(String msg);
}

public class BankOneProduct implements MoneyTransferable{
.....
}

public class WesternUnionProduct implements MoneyTransferable{
.....
}

nah implementasinya dengan menggunakan DI framework pasti kita buat engine
yang melakukan transfering money

....
public class MoneyTransferBean{
    private MoneyTransferable transferBean;
    public void setTransferBean(MoneyTransferable transferBean){
       this.transferBean = transferBean;
    }

    public void execute(){
...
...
      String accountNo = transferBean.getAccountNo();
      Double amount = transferBean.getMoney();
      begin();
      boolean validAccount = validateAccount(accountNo,amount);
      .... // do something here
      String feedBackMsg = .....
      commit();
      transferBean.feedBack(feedBackMsg);
...
...
    }
....


Nah kita sekarang punya standard dan kontrak nih,
1 standardnya bahwa untuk mentransfer money kita butuh bean yang implements
MoneyTransferable
2 kontraknya untuk mentransfer money bean tersebut harus menyediakan
account, money, dan method untuk feedbak markAsTransfered. Implementasinya
bisa macem2 tergantung designnya.

Nah apakah kita bisa menggantikan interface diatas dengan annotation ???
jawabannya
BISA !!

===================================================================================================
sekarang kita design ulang applikasi diatas

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface MoneyTransferable {
    String moneyFunction();
    String accountNoFunction();
    String feedBackFunction();
}

@MoneyTransferable(moneyFunction="getMoney",accountFunction="getAccount",feedBackFunction="feedBack")
public class BankOneProduct {
.....
}

@MoneyTransferable(moneyFunction="getMoney",accountFunction="getAccount",feedBackFunction="feedBack")
public class WesternUnionProduct{
.....
}

kita tinggal rubah di beannya

public class MoneyTransferBean{
    private Object transferBean;
    public void setTransferBean(Object transferBean){
       this.transferBean = transferBean;
    }

    public void execute(){
...
...
      if(!transferBean.getClass().isAnnotationPresent(
MoneyTransferable.class)){
         return; // or do something else here
      }
      MoneyTransferable transferAnnotation = transferBean.getClass
().getAnnotation(MoneyTransferable.class);
      // sekarang kita baca methodnya ..
      transferAnnotation.
      MoneyTransferable transferAnnotation = User.class.getAnnotation(
MoneyTransferable.class);
      String moneyFunction = transferAnnotation.moneyFunction();
      Method method =    User.class.getMethod(moneyFunction, null);
      Double amount = (Double) method.invoke(obj, null);
      String accountNo = ...// sama seperti diatas
      begin();
      boolean validAccount = validateAccount(accountNo,amount);
      .... // do something here
      String feedBackMsg = .....
      commit();
      ...//panggil feedback method
...
...
    }

cara diatas adalah salah satu cara dari berbagai macam cara pendekatan untuk
kasus yang sama menggunakan annotation, misalnya kalau mau design yang lebih
clear tentunya kita bisa memecah2 tiap function dalam annotation yang
berbeda beda.

* Terus apakah sekarang sudah standard ???

Sudah ... kenapa standard, sebab kita menstandardkan bahwa agar bean
tersebut bisa digunakan untuk transfer money kita harus mendeklarasikan
method2 yang dibutuhkan.

* Apakah sekarang ada kontrak seperti halnya interface ??

Sudah ... sebab dengan annotation kita pun bisa membuat unit testing tanpa
harus mengimplemetasikan satu object yang menggunakan annotatio tsb.

Sekarang apakah interface dapat digantikan dalam OOP. Harus dikatakan
annotation dapat menggantikan interface tetapi dengan cara ini kita sangat
bergantung reflection.

* Bukankah dengan cara diatas lebih repot ?? kode di bean bisa membludak
kalau kita harus mengecek annotation satu per satu ??

Kita bisa membuat util class agar kode lebih sederhana.

Annotation dapat menggantikan interface ... benar ... tetapi annotation
tidak dapat menggantikan abstract class. :)

just my 2 cent

2008/1/30 Ferdinand Neman <[EMAIL PROTECTED]>:

>   Programming To Interface, tidak semata-mata untuk testing.
>
> 1. Bayangkan sebuah business logic, sebut saja Money Transfer Processing
> (MTP).
> 2. Business logic ini, MTP, telah dibuatkan implementasinya dengan
> menggunakan mekanisme standard transfer data uang via encrypted XML ke
> host yang berada di BANK ONE.
> 3. Banyak proses-proses lain yang yang memanfaatkan business logic ini
> untuk melakukan transfer duit, diantaranya Automated Payment System,
> dan ada 10 system yang lain.
> 4. Suatu saat BANK ONE ingin melakukan perubahan mekanisme transfer
> dengan teknologi yang berbeda dan caraya yang berbeda pula karena satu
> dan lain hal.
> 5. Anda harus mengakomodasi perubahan yang terjadi, sementara anda
> sadar pada sistem Money Transfer Processing anda ada beberapa system
> yang tergantung dengan system ini.
>
> Mari kita leverage kasusnya....
>
> 6. Ada bank lain, BANK ZERO menawarkan jasa yang sama, dengan rate
> yang berbeda tetapi tentusaja membawa teknologi yang berbeda pula.
> 7. Sesuai keputusan manajemen, 3 dari 10 system yang ada akan
> menggunakan transfer via BANK ONE, 3 via BANK TWO sisanya via BANK
> ZERO. Menjadikan Money Transfer Processing ini harus dapat menangani
> dua atau lebih implementasi teknologi untuk masing-masing bank.
> 8. Seluruh 10 system harus melihat Money Transfer Processing sebagai 1
> (satu) model business logic karena logicnya memang benar-benar sama,
> yaitu transfer duit via bank, hanya saja implementasi dibelakangnya
> bisa saja berbeda.
>
> Nah dengan kasus diatas, Bayangkan... bagaimana bila tanpa inteface,
> bagaimana bila menggunakan interface. Both way works... But each way
> shares different work load and pain.
> Kuncinya adalah "standard"... sekarang, apakah yang bisa digunakan
> untuk mensetup standard dalam programming logic ? Yep... Interface.
>
> Enterprise Software Architect must spot this potential since the very
> beginning and enforce one of the way to avoid future problems.
>
> 2008/1/30 Joshua Jackson <[EMAIL PROTECTED] <joshua.java%40gmail.com>
> >:
>
> >
> > Dear all,
> >
> > Seberapa penting-kah design by interface dalam membuat sebuah
> > aplikasi, terutama aplikasi enterprise?
> > Sudah ada yang baca:
> >
> http://www.theserverside.com/tt/articles/article.tss?l=NewFeaturesinEJB3-1
> >
> > Salah satu fitur terbaru dari EJB3.1 adalah sekarang EJB interface
> > merupakan optional, berarti kita gak harus pake EJB interface kalau
> > kita gak mau.
> > Saya sangat setuju dengan pendekatan yang diajukan oleh tim EJB3.1 ini.
> >
> > Salah satu alasan kenapa orang mendesign by interface adalah untuk
> > men-decouple interface dan logic implementation supaya mempermudah
> > ketika melakukan unit testing. Tapi sebenarnya dengan cara design by
> > annotation, seperti pendekatan yang dilakukan EJB 3.1 kita juga bisa
> > menghindari tightly coupling dan mempermudah untuk melakukan unit
> > testing, sehingga tightly coupling seperti jaman EJB2.1 sudah tinggal
> > kenangan. I've done this and it works. IMHO design by interface dalam
> > sebuah development sangat menyulitkan karena yang ada di source-code
> > adalah interface-nya sehingga ketika kita Ctrl+Click (di eclipse) maka
> > kita akan ditujukan ke interface dan masih harus mencari tau class
> > yang mengimplementasikannya, biasanya saya menggukana Ctrl+Shift+H
> > (di eclipse). Ribet dan tidak produktif :(
> >
> > So is there any other reason why we should design by interface now
> > that we have annotation other than to decouple for unit testing?
> >
> > --
> > It's not going to be like this forever
> >
> > Blog: http://joshuajava.wordpress.com/
>
> --
> Ferdinand Neman
> ----
> Cows who loves java
> http://www.jroller.com/page/newm4n
> ----
> #152 BigFoot B6509CID
> Pulsarian PANSER Kelas 1.
> Pulsarian Safety Riding Team.
> ----
> Respektieren Sie selbst,
> Respect Andere
>  
>

Reply via email to