Terus bagaimana cara mengatasinya? Tentunya hanya melalui pemahaman yang benar mengenai OOP. Mengenal kata extends atau implements tidak cukup membuat kita dijalan yang benar dalam object-oriented. Ahlinya mengatakan mimpimu harus berisi tentang turunan, dan polymorphisme harus mengalir didalammu. Cohesion dan louse-coupling harus menjadi dunia keduamu. Memang tidak cukup hanya mengerti prinsip object-oriented programming, juga perlu Object Oriented Design(OOD). Tapi untuk bisa melakukan OOD tentu harus menguasai OOP.
Beberapa kata kunci yang paling penting dalam OOP adalah encapsulation, inheritance, interface, polymorphism, overload, overriding, coupling dan cohesion. Beberapa konsep ini juga bisa semakin kompleks ketika berpasangan dengan konsep access modifier, constructor, casting, assigning, atau return type. Mari kita coba lihat satu-satu.
Encapsulation
Dalam prinsip OOP sesuatu yang sifatnya pribadi dan tidak mestinya dicampuri oleh pihak lain harus disembunyikan untuk diri sendiri. Tetapi ketika pihak luar ingin mengetahui apa nilai yang disembunyikan tadi kita bisa menyediakan sebuah jalan atau method untuk mengambilnya. Tetapi hanya melalui jalan itu sajalah pihak luar tadi bisa mengakses. Begitulah kira-kira encapsulation. Dalam Java hal ini diterapkan dengan cara memberi akses private kepada properti yang mau disembunyikan dan membuat method dengan akses publik untuk setter atau getternya. Contoh:
class Animal {
private String name;
public setName(String name){
this.name = name;
}
public String getName(){
return name;
}
public void eat(){
System.out.println(”Every animal needs food”);
}
}
Pastikan deklarasi variable di set private agar tidak bisa diakses langsung oleh pihak luar. Banyak orang kadang mendeklarasikan variable dengan akses default tanpa alasan yang jelas.
Inheritance
Inheritance atau turunan adalah cara menciptakan sebuah tipe atau class baru (subclass) dengan menggunakan kelas lain sebagai templatenya (superclass). Ada dua cara menurunkan sebuah obyek dari obyek lain yang dikenal dengan istilah type implementation dan interface implementation. Type implementation menggunakan cara extends sementara interface implementation menggunakan cara implements. Hasil dari kedua cara ini dikenal juga dengan IS-A yang mana obyek turunan adalah juga bertipe obyek asalnya. Jadi kalau Carnivore diturunkan dari Animal, pastilah Carnivore tersebut juga Animal. Carnivore IS-A Animal. Tetapi tidak sebaliknya, tidak semua Animal adalah Carnivore. Ada juga Omnivore. Dalam Java perbedaan penting mengenai dua cara ini adalah sebuah obyek turunan hanya bisa meng-extends-kan diri dari SATU superclass, sementara melalui interface bisa meng-implements-kan diri dari LEBIH DARI SATU interface. Lalu pertanyaannya kapan cocoknya menggunakan type implementation dan kapan menggunakan interface implementation?
Dalam dunia nyata padanan turunan dengan extends dan turunan dengan implements adalah kira-kira demikian. Extends menurunkan sesuatu yang berupa benda (noun) sementara implements menurunkan sesuatu yang berupa sifat (adjective). Contoh, Lion adalah termasuk Animal yang bisa berlari. Kalau dituliskan dalam code program kira-kira begini:
class Lion extends Animal implements RunLikeable {}
Pada umumnya nama sebuah interface selalu diakhiri dengan kata able, yang memudahkan programmer untuk menandai dan mengenalinya.
Polymorphism
Melalui inheritance, kita bisa menciptakan sebuah hirarki obyek, baik simple atau kompleks sekali pun. Bayangkan hirarki kompleks seperti hirarki dunia hewan. Hirarkinya pasti berlapis-lapis, tetapi turunan sedalam apapun tetaplah seekor hewan. Polymorphism memungkinkan untuk menukar obyek dari turunan ke obyek superclass-nya. Katakan:
Animal ani = new Animal(); // variable bertipe Animal
ani = new Lion(); // sekarang bertipe Lion
Setelah baris kedua, memanggil method yang didefenisikan di Animal, akan memanggil implementasi method yang ada di Lion. Konsep OOP ini memungkinkan hasil pemanggilan method berubah/berbeda tergantung ke instance obyek mana dia direferensikan. Deklarasi di atas tidak tidak berlaku sebaliknya :
Lion lion = new Animal(); // tidak valid
Overload dan Overriding
Barangkali fitur ini salah satu yang paling jelimet untuk dipahami. Sekilas nampak sama tetapi berbeda. Dalam kalimat sederhana bisa dikatakan demikian, overload adalah menulis lebih dari 1 method dengan nama yang sama tetapi parameter berbeda. Overriding adalah menulis ulang isi method di kelas turunan dimana di kelas atasnya method tersebut sudah ditulis juga. Baik dalam overload dan override nama method yang dioverload/ride harus tetap sama. Dalam hal parameter, parameter di overload harus berbeda tetapi untuk override harus sama. Return type untuk overload harus tetap sama sementar untuk override bisa sama atau berbeda.
Coupling dan cohesion
Simplenya, coupling adalah ketergantungan sebuah class dengan class lain. Apakah jika sebuah class diubah mempengaruhi fungsi class lain? Seberapa besar pengaruhnya? Jika keterikatan antar class bisa diatur sedemikian rupa sehingga perubahan disuatu class tidak banyak atau sama sekali tidak mempegaruhi class lain namanya loose coupling, tetapi kalau tidak namanya tight coupling. Dalam hal OOP sebisa mungkin keterikatan class dengan class lain itu diminalkan alias loose coupling. Sementara cohesion berbicara tentang fungsi dalam konteks dimana semakin kedalam tingkat hirarki class-class itu spesifik fungsinya. Atau juga membagi class-class sedemikian rupa sehingga setiap class menjalankan fungsi spesifik (atau yang mempunyai keterkaikan) dan tidak terkumpul dalam sebuah class besar. Untuk cohesion yang diharapkan adalah high cohession.
Tips
Apakah Anda kira-kira selalu memperhatikan keyword diatas dalam setiap penulisan coding? Mungkin Anda melek dengan OOP tetapi apakah itu dituangkan dalam coding? Juga apakah cukup memahami teori dan praktek untuk membuat program yang berkualitas? Tidak! Jujur dunia Java itu dunia yang kompleks. Banyak programmer otodidak pertama kali akan kebingungan mempelajari Java. Bagi pemula rasanya seperti berada di belantara istilah-istilah dan singkatan yang membingungkan. Pola yang diberikan Endy dalam mempelajari Java EE menurut saya sah-sah saja. Tetapi setelah bisa berbicara dengan Java EE mungkin Anda bertanya bagaimana membuat program berkualitas? Tip saya adalah, kembali pelajari lebih dalam lagi mengenai OOP ditambah OO design. Ada 2 buku yang MUST READ yang harus Anda baca dan selalu baca. Satunya adalah Effective Java (EJ) dan Design Patterns: Elements of Reusable Object-Oriented Software (DP).