Class Invariant
Istilah invarian diambil dari istilah matematika dimana istilah tersebut memiliki definisi sebuah property pada object matematika yang tidak terjadi perubahan setelah melakukan sebuah operasi atau transformasi pada sebuah object matematik. Sedangkan pada OOP dikenal sebagai Class Invariant yang memiliki definisi object memiliki kondisi dan property-property pada object selalu valid/benar sehingga object tersebut selalu terjaga selama masa hidup object tersebut.
In mathematics, an invariant is a property of a mathematical object (or a class of mathematical objects) which remains unchanged after operations or transformations of a certain type are applied to the objects.
Tujuan dari class tersebut untuk menjamin konsistensi data. Selain itu pada dasarnya, class invariant adalah kumpulan asumsi yang divalidasi, dengan begitu bisa mengurangi error pada program dan akan mempermudah proses debuging ketika terjadi masalah.
Karakteristik class invariant
Syarat-syarat agar object invariant selalu dipertahankan yaitu:
Harus terpenuhi setelah kontruktor dijalankan
Ketika object akan dibuat dari class invariant, pada bagian konstruktor akan melakukan validasi pada data-data yang masuk yang harus bernilai valid sesuai dengan asumsinya. Untuk contoh kasus Vending Machine, bisa kita asumsikan seperti ini.
Karena keterbatasan space machine, maka maximal total barang yang bisa masuk hanya 10 barang.
Machine boleh dalam kedaan kosong
Jika diinterpretasikan ke dalam bentuk code, maka kurang lebih seperti ini
class VendingMachine {
private maxItems: number = 10;
private totalItem: number = 0;
constructor(totalItem: number): void {
this.isInvariant(totalItem)
this.totalItem = totalItem;
}
isInvariant(totalItem: number): boolean {
if (totalItem > this.maxItems || totalItem < 0) {
throw new Error("Invalid total items")
}
return true
}
}
Seperti terlihat pada kontruktor class VendingMachine tersebut melakukan validasi untuk totalItem yang mana dengan asumsi bahwa seharusnya totalItem pada VendingMachine tidak lebih dari 10 item karena batas maximal space pada VendingMachine dan juga nilai total Item tidak mungkin kurang dari 0.
Harus dipertahankan oleh semua method public
Ketika ada method public yang bisa berakibat merubah property pada object, maka setiap invariant property harus divalidasi. Sebagi contoh asumsi
Ketika ada penambahan barang, maka jumlah maksimal barang tidak boleh melebihi 10 barang sesuai kapasitasnya dan juga total item tidak bernilai decimal.
Ketika ada pembelian barang, maka jumlah minimal barang tidak mungkin kurang dari 0 dan tidak mungkin dalam bentuk decimal.
Ketika asumsi tersebut ditranslate ke dalam bentuk code, akan seperti ini:
type Item = {
id: number;
name: string;
}
class VendingMachine {
private maxItems: number = 10
private totalItem: number = 0;
private database: Record<string, string>;
constructor(totalItem: number): void {
this.database = {}
this.isInvariant(totalItem)
this.totalItem = totalItem;
}
isInvariant(totalItem: number): boolean {
if (totalItem > this.maxItems || totalItem < 0) {
throw new Error("Invalid total items")
}
return true
}
addItem(item: Item) {
if (!item.id) {
throw new Error("Invalid ID")
}
this.database[item.id] = item.name
let total: number = this.totalItem
total += 1
this.isInvariant(total)
this.totalItem = total
}
delItem(id: number) {
delete this.database[id]
let total = this.totalItem
total -= 1
this.isInvariant(total)
this.totalItem = total
}
}
Pada contoh ini, database yg digunakan adalah Map sederhana tapi pada real world case seharusnya property database adalah instance data storage pada infrastruktur layer jika mengambil istilah dari clean architecture.
Seperti terlihat pada code tersebut bahwa terdapat dua method public dengan nama addItem
dan delItem
dengan asumsi bahwa addItem
digunakan ketika operator Vending Machine menambah item baru dan delItem
digunakan ketika ada pembeli yang melakukan penarikan item dari Vending Machine.
Pada setiap kali method-method public dieksekusi, selalu diikuti oleh pemanggilan method isInvariant
yang bertujuan untuk menjaga object tetap bersifat invariant.
Selalu digaransi invarian selama object masih ada dalam masa hidupnya
Yang dimaksud pada point ini adalah object invariant akan selalu tergaransi selama object belum dihancurkan (destruction).
Kesimpulan
Class invariant adalah konsep yang cukup dasar pada promgraman OOP karena dengan menggunakan konsep ini akan sangat berpengaruh pada ke stabilan dan ketahanan software yang dibuat.
Subscribe to my newsletter
Read articles from Andriawan directly inside your inbox. Subscribe to the newsletter, and don't miss out.
Written by