Monday, November 22, 2010

Konsep OOP yang Terlupakan: Invariant

Waktu kuliah OOP (Object Oriented Programming), Saya diajarkan untuk men-private-kan variabel member sebuah kelas, untuk encapsulation bahasa kerennya. Tapi karena ga tau KENAPA perlu di buat private, akhirnya sering Saya declare public.

Ketika akhir kuliah, mulai kerasa manfaatnya di private-kan. Contoh paling jelas mungkin WAKTU. kelas WAKTU kurang lebih biasanya seperti ini:

class Waktu {
int Jam;
int Menit;
int Detik;
}

Jika Saya declare public variabel diatas, maka mungkin Object Waktu menjadi tidak valid. Maksudnya, adakah jam -1? adakah detik ke 77? adakah menit ke 60? tidak, karena Jam diantara 0 sampai 23, demikian juga dengan menit dan detik, yang memiliki batasan sendiri. Sejak ini, Saya terus secara konsisten mem-private-kan variabel member.

Setelah Saya bekerja, tiba-tiba sampai pada website ini, Saya tertarik dan melihat lihat lebih dalam. Lagipula, siapa yang tidak tertarik dengan materi kuliah MIT yang tersohor, hehe

Disana Saya baru tahu yang namanya Invariant. Invariant adalah sesuatu yang TRUE pada seluruh instance suatu kelas, dalam keadaan apapun instance tersebut.

Contoh pada kelas Waktu diatas, jika seluruh variabel di declare public, maka invariantnya adalah:
{
MIN_INTEGER <= Jam <= MAX_INTEGER,
MIN_INTEGER <= Menit <= MAX_INTEGER ,
MIN_INTEGER <= Detik <= MAX_INTEGER
}

berapapun nilai Jam, Menit dan Detik, pasti kondisi diatas akan tetap TRUE.

Namun tentunya invariant diatas tidak tepat, karena Jam sendiri antara 0..23, Menit dan Detik antara 0..59. Sehingga INVARIANT YANG BENAR untuk kelas Waktu adalah:
{
0 <= Jam <= 23,
0 <= Menit <= 59,
0 <= Detik <= 59
}

Tentu Saja Invariant diatas tidak tercapai dengan sendirinya. Disinilah peran dari men-declare variabel member private, agar Invariant dari kelas Waktu tetap terjaga.

Sayangnya, Invariant ini seringkali tidak se-explisit contoh Waktu diatas. Oleh karena itu, cocok sekali jika deklarasi suatu kelas ditambahkan dengan komentar mengenai Invariant-nya. Hal ini akan sangat membantu developer lain atau bahkan pembuat kelas tersebut untuk memahami suatu deklarasi kelas.

Meski Saya sendiri belom 100% menuliskan Invariant kelas-kelas yang Saya buat, hehe, Saya akan berusaha mengejar 100% tersebut. Sebaiknya begitu juga dengan Anda :)

No comments:

Post a Comment