Home > Design Pattern, Domain Driven Design, OO Programming, OOAD Basic > Getter and Setter adalah Domain Anti-Pattern

Getter and Setter adalah Domain Anti-Pattern

Object haruslah kaya akan behavior. Object tidak memiliki bentuk. Jika kita mengekspose state dari object tersebut dengan getter dan setter, maka object yg menggunakannya akan bergantung kepada shape tersebut. Terjadilah coupling terhadap object tersebut. Internal state dari object hanya boleh diubah berdasarkan behavior object tersebut saja.

Jika kita mengeset suatu field pada sebuah object saya yakin sebenarnya ada behavior yg menuntuk kita melakukannya. Pasti ada behavior yg melatarbelakanginya tetapi kita mungkin salah menempatkannya. Mungkin kita menempatkannya di Service Layer atau bisa saja pada object yg berinteraksi langsung dengan object tersebut.

Dengan adanya setter dan getter maka kita akan mengalami permasalahan dalam melakukan validasi. Salah satu masalahnya adalah mengenai circular reference. Salah satu contoh kasusnya adalah validasi state dan zipcode. Apabila kita mengijinkan setter, maka ketika kita mengeset salah satu state maka akan dilakukan validasi terhadap zip code dan demikian juga sebaliknya. Kita juga membiarkan object kita memasuki keadaan tidak valid meskipun dalam waktu yg singkat atau temporary ketika mengeset salah satu dari kedua field tersebut. Pemecahan terhadap masalah diatas adalah dengan membuat behavior yg melewatkan state dan zipcode pada saat yg sama melalui parameter dengan nama method yg jelas. ChangeCustomerAddress(state, zipcode). Dengan demikian kita dapat menjamin bahwa object kita valid setiap saat.

Masalah akan muncul ketika kita membiarkan object kita berada dalam keadaan tidak valid. Kita akan memiliki banyak group-group code yg berfungsi melakukan validasi dimana domain object tersebut diterima atau diprocess. Permasalahan akan menjadi semakin besar jika kita lupa membuat code validasi tersebut. Maka domain object yg tidak valid tersebut akan mengotori system dan pada satu saat kita tidak tahu lagi mana yang valid dan tidak.

Dengan menghilangkan getter pada domain object maka kita tidak akan memiliki kumpulan code yang bergantung kepada bentuk dari domain object. Kita benar-benar menerapkan prinsip OOP yaitu tell don’t ask. Kita dapat dengan mudah menganti implementasi dari internal object tersebut tanpa takut ada code lain yang rusak.

  1. ryzam
    August 1, 2009 at 9:05 pm

    Hanya ingin bertanya jika menggunakan Hibernate/NHibenate tanpa ada setter/getter bagaimana bisa persist ke database?

    • weltam
      August 2, 2009 at 5:28 am

      kita tidak dapat menggunakan hibernate lagi jika ingin benar2 menerapkan hal tersebut.
      tetapi kita harus menerapkan pattern event sourcing dan yg kita persist ke database adalah event yg terjadi
      bukan lagi state object pada saat sekarang.

  2. ryzam
    August 2, 2009 at 6:02 am

    Boleh bagi contoh code untuk melihat dengan lebih detail? Berkaitan event sourcing

  3. weltam
  4. weltam
    August 2, 2009 at 3:34 pm

    dan masih banyak lagi mengenai domain event related pattern di blog tersebut

  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: