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.
Hanya ingin bertanya jika menggunakan Hibernate/NHibenate tanpa ada setter/getter bagaimana bisa persist ke database?
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.
Boleh bagi contoh code untuk melihat dengan lebih detail? Berkaitan event sourcing
http://martinfowler.com/eaaDev/EventSourcing.html
dan masih banyak lagi mengenai domain event related pattern di blog tersebut