Service (Part 2) Kesalahan Umum
Kesalahan yg biasa terjadi adalah ketika kita melihat suatu operasi. Kita cenderung mencari pada object apa operasi tersebut cocok diletakkan. Dan kita mungkin saja memaksakannya diletakkan pada salah satu object. Jangan paksakan. Karena jika operasi tersebut merupakan bagian dari UL maka konsep tersebut bisa kabur dan mungkin hilang. Apalagi jika operasi tersebut merupakan konsep yg sangat penting di Domain. Konsep penting harus dibuat seexplicit mungkin. Jadi buatlah kelas untk operasi tersebut.
Jika kita memaksakannya masuk ke dalam satu object. Object tersebut akan kehilangan jati dirinya. Hehehe. Maksudnya udh ga jelas lagi dia bisa apa aja. N mungkin menyalahi SRP. Single Responsibility Principle.
Nah dan biasaya operasi tersebut memiliki keterhubungan dengan banyak object. Nah jika kita paksa masuk ke satu object. Object tersebut jadi memiliki ketergantungan ke banyak object. Dan akan sulit merefactornya di kemudian hari. Padahal kalau bisa satu object dapat dipahami tanpa mengerti object lain. Itulah yg dinamakan encapsulasi dalam level yg lebih tinggi. Cie… cuit cuit. Keren…. Hahhaah
Service juga melakukan hal yg spesifik terhadap permintaan client. Service biasanya dinamakan menurut activity ketimbang entity. Verb ketimbang Noun. Nama service haruslah merupakan bagian dari UL. Parameter dan resultnya haruslah merupakan Domain Objects.
Yg paling penting dari service juga adalah sifatnya yg stateless. Jadi client bisa menggunakan instance mana aja dari Service tanpa peduli sejarah pemakaian si object tersebut apa. TInggal panggil methodnya dan selesai. Si Service tidak akan mengingat bahwa dia pernah dipanggil. Karena Service tidak menyimpan state. Berbeda dengan domain object yg pasti memiliki state.
Eksekusi dari service menggunakan informasi yg dapat diakses secara global dan juga dapat mengubah informasi global tersebut ( memiliki side effect ). Mengakses data global. Mmmm. Brarti bisa dong ada repository di dalam service. Yups. Anda benar. Tetapi keterikatannya hanya sebatas interface. Karena implementasi dari Repository merupakan infrastructure. Contohnya Repository dengan menggunakan NHibernate atau yg lain.