Open Closed Principle (OCP)
Open-Closed Principle :
Open for extention, closed for modification.
Terbuka untuk perluasan, tertutup untuk modifikasi.
Dengan tertutupnya code yang sudah ada dari modifikasi maka kemungkinan terjadinya gelombang bug karena kita melakukan suatu perubahan terhadap code yang sudah ada pun dapat dihindari. Bayangkan jika kita merubah suatu sintaks dalam code pada sistem yang sudah berjalan. Ternyata karena kompleksitas sistem itu, yang saling tergantung antar code, maka terjadilah bug yang tidak diinginkan. Huff.. Sepertinya akan menghabiskan banyak waktu untuk mencari celah kesalahan.
Dengan sifatnya yang “terbuka untuk perluasan”, maka code yang kita buat dapat digunakan berulang. Ini paling dirasakan manfaatnya untuk code swing yang seringkali digunakan secara berulang-ulang dalam aplikasi berbeda. (kebayang bagaimana sulitnya membuat suatu fitur swing..^_^)
Melakukan extends pada kelas lalu meng-override method-nya merupakan salah satu bentuk OCP.
Misalkan kita punya kelas Pegawai. Salah satu method dalam kelas ini adalah hitungGaji(). Awalnya setiap pegawai punya cara yang sama dalam perhitungan gajinya. Kemudian seiring waktu, ternyata perusahaan membutuhkan pegawai outsource yang cara perhitungan gajinya tidaklah sama seperti pegawai tetap.
Maka salah satu alternatif adalah dengan mengubah kelas Pegawai. Pengubahan dilakukan dengan override method hitungGaji().
Yang pada awalnya code Pegawai seperti ini :
public class Pegawai{
//konstruktor
public Pegawai(){
}
public float hitungGaji(){
//terserah apa isinya;
}
}
Kemudian menjadi :
public class Pegawai{
//konstruktor
public Pegawai(){
}
public float hitungGaji(){
//terserah apa isinya;
}
public float hitungGaji(String s){
//terserah apa isinya; Yang pasti beda dengan hitungGaji().
}
}
Atau bisa juga sih membuat tambahan parameter inputan pada method hitungGaji() yang awal. Maksudnya, saya ubah hitungGaji() dengan melakukan penambahan parameter inputan, menjadi hitungGaji(String s) tanpa melakukan override. Konsekuensinya, saya harus melakukan pengkondisian (if-else) dalam method hitungGaji(String s) yang berdasarkan dari variabel “s”. Tidak hanya itu! Lalu saja juga perlu merubah segala code awal yang memanggil hitungGaji() menjadi hitungGaji(“Tetap”). Artinya saya harus mempelajari ulang sistem untuk dapat mengetahui dimana sajakah sistem ini menggunakan hitungGaji(). Rumit dan amat berkemungkinan menimbulkan bug.
Maka solusinya adalah dengan menerapkan OCP.
Misalnya diagram kelas awalnya sebagai berikut :
Kemudian lakukan extends terhadap kelas Pegawai. Dan dalam kelas baru itu, Outsource, definisikan kembali method hitungGaji(). Maka OCP telah diterapkan. Saya tidak mengubah-ubah kelas Pegawai (closed for modified), tetapi menurunkan sifat kelas Pegawai pada kelas Outsource (open for extention).
Diagram kelasnya sebagai berikut :
Bisa dikatakan bahwa maksud “open for extension” pada OCP adalah terbuka untuk proses perubahan behavior. Bukan terbuka untuk suatu extends kelas.
Salah satu prinsip dalam OOD (object oriented design) ini memiliki beberapa manfaat, diantaranya :
- Membuat code yang kita buat menjadi reusable (dapat digunakan berkali-kali)
- Mempermudah maintenance (pemeliharaan) code yang sudah ada. Lebih mudah karena tidak perlu dipelihara, khan tidak diubah-ubah! Hehe..
Walau begitu ada pula kekurangannya dan biasanya ini dikatakan dengan lantang oleh orang-orang yang cinta mati XP (extreme programming). Halah..halah.. mulai hiperbolis nih..
Mungkin bukan kekurangan, tapi lebih tepatnya kesulitannya. Untuk menerapkan OCP ini dari awal pembangunan sistem diperlukan kemampuan untuk memperkirakan “pengembangan sistem di masa yang akan datang” dengan cepat. Sehingga tidak memakan waktu banyak. Tentunya keahlian ini berkaitan erat dengan “jam terbang” seorang desainer.
Untuk mengasah “sense” OCP, coba rekan-rekan baca referensi nomor dua. 🙂
Referensi :
- HeadFirst Object Oriented Analysis and Design
- http://doodleproject.sourceforge.net/articles/2000/openClosedPrinciple.html
- http://c2.com/cgi/wiki?OpenClosedPrinciple
0 Comments
afiemaniez
waah..seru juga ternyata OOD tuh….bagi2 referensi yaa..saya baru awal2 tertarik yang berbau2 OO, baik itu OOP atau OOD, soalnya default otak saya masih struktural banget, jadi rada loading kalo soal object oriented beginian…
😀
aliefte
lagi-lagi ngopi lagi.. trimsss bgt. 🙂