Halo teman-teman semua, kali ini saya akan membahas tentang Value Object.
Dari waktu kuliah sampai awal kerja, saya biasanya mendefinisikan attribute dari suatu entity dengan menggunakan primitive type seperti String
, int
, float
, boolean
dll. Awalnya lancar-lancar aja, sampai tiba ketika aplikasi sudah di production, tetapi terdapat bug karena object dari suatu entity tidak valid karena masalah validasi.
Sampai suatu ketika saya berjumpa dengan konsep yang namanya Domain-Driven Design (DDD), yang terdapat pada buku Domain-Driven Design by Eric Evans.
DDD merupakan framework yang digunakan dalam memecahkan permasalahan domain yang kompleks bersama-sama dengan domain expert yang ada. Dalam pembuatan software menggunakan konsep ini, banyak terdapat overhead atau boilerplate sehingga tidak terlalu cocok digunakan untuk software yang berbasis CRUD biasa.
Tapi tenang saja, salah satu konsep di dalam DDD, Value Object, bisa kita gunakan tanpa perlu menerapkan DDD secara keseluruhan.
Value Object
Value object merupakan berbeda dengan entity karena kurangnya suatu konsep yang bernama identity, seperti UUID
/ id
. Value Object ini dibedakan bukan berdasarkan object tetapi berdasarkan value yang terdapat dalam object tersebut. Jadi Value Object itu equals apa bila value nya sama. Dan juga bersifat immutable.
Concept of Value Object
- Value Equality
- Immutability
- Self-Validation
Value Equality
Dari namanya kita sudah tahu bahwa VO itu equal berdasarkan nilai yang ditampungnya. Jadi suatu Username
bernilai sama jika isi didalamya sama, walaupun reference nya berbeda.
Immutability
Sebuah Value Object bersifat immutable atau tidak dapat diubah. Untuk mengubah nilainya kita harus membuat object yang baru, yang mana bisa mengurangi bug, dan konsisten.
Self-Validation
Ketika melakukan instantiation suatu value object kita harus selalu melakukan validasi, sehingga value object hanya akan tercipta jika input bersifat valid. Sehingga menjaga konsistensi data. Misalnya kita membuat VO Age
yang didalamnya menampung int
. Kita akan membuat validasi kalao nilai didalamnya harus >= 0 karena umur tidak mungkin negatif.
Contoh
Benefit
- Mengurangi Primitive Obsession -> Primitive Obsession is a code smell.
- Type Safety -> menggunakan unit yang sama di dalam objek.
- Flexible -> tipe di dalamnya tidak dipedulikan oleh dunia luar.
- Validation -> Validasi ketika membuat object-nya.
- Remove Duplication -> VO
Address
bisa digunakan di berbagaiEntity
. - Mudah Dibaca -> Kode lebih mudah dibaca.
- Hashing -> Hash dapat di cache, dan aman digunakan.
Drawback
Tidak semua attribute perlu dibuatkan Value Object karena akan membuat codebase terkesan bloated. Tapi gunakan jika membutuhkan validasi, domain business logic, atau jika terdapat ambiguitas apabila menggunakan data primitif.
Referensi: