Inheritance, The Stupid Way

Inheritance bukan sekedar sharing state maupun behaviour. Programmer sangat mudah sekali untuk menyalahgunakan inheritance sehingga menghasilkan code "gila". Ini ilustrasinya:

class Monyet
def initialize
@jumlah_kaki = 2
@jumlah_tangan = 2
@jumlah_jari = 5
end
def makan
#...
end
def minum
#...
end
def buang_air
#...
end
end

class Manusia < Monyet
def belajar
#...
end
def membaca
#...
end
end

Hey.. Manusia bukanlah Monyet yang dapat belajar dan membaca! :)

Prototype-based Programming

Dalam pemrograman berorientasi objek, class digunakan sebagai "cetakan" atau "pabrik" untuk membuat object. Umumnya, class dan object dipandang sebagai dua hal yang berbeda, dimana object merupakan instance dari suatu class. Pemahaman seperti ini tidak salah, namun dalam paradigma object-oriented programming ini bukanlah satu-satunya cara. Salah satunya adalah Prototype-based Programming, dimana object dan class dipandang sebagai hal yang sama!!! Dalam bahasa pemrograman Ruby, untuk menerapkan metode ini sangat mudah karena kita tahu bahwa pada ruby semua adalah Object, termasuk Class itu sendiri adalah Object. Anda bisa membuktikannya melalui irb seperti contoh di bawah ini:

irb(main):001:0> Class.kind_of?Object
=> true
irb(main):002:0> Object.kind_of?Class
=> true

Class adalah object dan Object (dalam konteks ini) adalah class. So, antara class dan object tidak dibeda-bedakan lagi.
OK, sekarang kita akan bandingkan metode "class-oriented" dengan prototyped-based. Pertama, kita membuat yang class-oriented dulu:
class Hewan
def jumlah_kaki=(kaki)
@jumlah_kaki = kaki
end
def jumlah_kaki
@jumlah_kaki
end
end

class Kucing < Hewan
def initialize
@jumlah_kaki = 4
end
end

manis = Kucing.new

puts manis.jumlah_kaki

Kode di atas kita membuat class Hewan yang di dalamnya terdapat setter dan getter untuk instance variable @jumlah kaki. Kemudian kita buat class Kucing yang menurun dari class Hewan dan memiliki method konstruktor untuk menjadikan @jumlah_kaki = 4. Jika kita eksekusi, maka pada layar akan tercetak angka 4.
OK, itu tadi class-oriented. Di bawah ini, kita buat yang model prototype-based untuk kita bandingkan.
hewan = Object.new

def hewan.jumlah_kaki=(kaki)
@jumlah_kaki = kaki
end
def hewan.jumlah_kaki
@jumlah_kaki
end

kucing = hewan.clone

kucing.jumlah_kaki = 4

manis = kucing.clone

puts manis.jumlah_kaki

Jika kode ini kita eksekusi, hasilnya akan sama dengan kode sebelumnya. Jika kita perhatikan, kita tidak menemukan pendefinisian class pada kode yang terakhir ini. Yang kita lakukan adalah membuat object baru kemudian memodifikasinya maupun melakukan kloning. Ya, inti dari Prototype-based programming pada Ruby adalah pada method clone. Object hewan kita kloning menjadi kucing kemudian kita tambahkan state baru berupa jumlah_kaki = 4. Kemudian kucing kita clone lagi menjadi manis, dan alhasil manis juga memiliki state dan behaviour yang sama persis dengan kucing.

Selamat mencoba.