Semakin saya belajar tentang paradigma pemrograman yang berbeda, seperti pemrograman fungsional, semakin saya mulai mempertanyakan kebijaksanaan konsep OOP seperti pewarisan dan polimorfisme. Saya pertama kali belajar tentang pewarisan dan polimorfisme di sekolah, dan pada saat itu polimorfisme tampak seperti cara yang hebat untuk menulis kode generik yang memungkinkan perluasan yang mudah.
Tetapi dalam menghadapi mengetik bebek (baik dinamis dan statis) dan fitur fungsional seperti fungsi tingkat tinggi, saya mulai melihat pewarisan dan polimorfisme sebagai memaksakan pembatasan yang tidak perlu berdasarkan pada serangkaian hubungan yang rapuh antara objek. Gagasan umum di balik polimorfisme adalah bahwa Anda menulis suatu fungsi sekali, dan kemudian Anda dapat menambahkan fungsionalitas baru ke program Anda tanpa mengubah fungsi aslinya - yang perlu Anda lakukan hanyalah membuat kelas turunan lain yang mengimplementasikan metode yang diperlukan.
Tapi ini jauh lebih sederhana untuk dicapai melalui mengetik bebek, apakah itu dalam bahasa yang dinamis seperti Python, atau bahasa statis seperti C ++.
Sebagai contoh, perhatikan fungsi Python berikut, diikuti oleh C ++ yang setara:
def foo(obj):
obj.doSomething()
template <class Obj>
void foo(Obj& obj)
{
obj.doSomething();
}
Setara dengan OOP akan menjadi seperti kode Java berikut:
public void foo(DoSomethingable obj)
{
obj.doSomething();
}
Perbedaan utama, tentu saja, adalah bahwa versi Java membutuhkan pembuatan antarmuka atau hierarki warisan sebelum dapat berfungsi. Versi Java dengan demikian melibatkan lebih banyak pekerjaan, dan kurang fleksibel. Selain itu, saya menemukan bahwa sebagian besar hierarki warisan dunia nyata agak tidak stabil. Kita semua telah melihat contoh Bentuk dan Hewan yang dibuat-buat, tetapi di dunia nyata, ketika persyaratan bisnis berubah dan fitur baru ditambahkan, sulit untuk menyelesaikan pekerjaan sebelum Anda perlu benar-benar memperluas hubungan "is-a" antara sub-kelas, atau merombak / memperbaiki hierarki Anda untuk memasukkan kelas dasar atau antarmuka lebih lanjut untuk mengakomodasi persyaratan baru. Dengan mengetik bebek, Anda tidak perlu khawatir tentang pemodelan apa pun - Anda hanya perlu khawatir tentang fungsionalitas yang Anda butuhkan.
Namun, pewarisan dan polimorfisme sangat populer sehingga saya ragu akan terlalu berlebihan untuk menyebut mereka strategi dominan untuk perluasan dan penggunaan kembali kode. Jadi mengapa warisan dan polimorfisme begitu sukses? Apakah saya mengabaikan beberapa keuntungan serius yang dimiliki pewarisan / polimorfisme dibandingkan pengetikan bebek?
obj
tidak memilikidoSomething
metode? Apakah pengecualian dikemukakan? Apakah tidak ada yang terjadi?