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.

Domain-Driven Design
“Eric Evans has written a fantastic book on how you can make the design of your software match your mental model of the problem domain yo...

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

  1. Value Equality
  2. Immutability
  3. 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

  1. Mengurangi Primitive Obsession -> Primitive Obsession is a code smell.
  2. Type Safety -> menggunakan unit yang sama di dalam objek.
  3. Flexible -> tipe di dalamnya tidak dipedulikan oleh dunia luar.
  4. Validation -> Validasi ketika membuat object-nya.
  5. Remove Duplication -> VO Address bisa digunakan di berbagai Entity.
  6. Mudah Dibaca -> Kode lebih mudah dibaca.
  7. 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:

Value Objects to the rescue!
Get rid of your primitive obsession thanks to value objects!
Thinking Beyond Primitive Values: Value Objects | Rahul Nath
When modelling objects for our application, we use primitive values to represent their attributes or…