Saya pikir ada beberapa faktor yang belum disebutkan.
Pertama-tama, setidaknya dalam "OOP murni" (mis., Smalltalk) di mana semuanya adalah objek, Anda harus memutar pikiran Anda menjadi konfigurasi yang agak tidak wajar untuk memikirkan angka (hanya untuk satu contoh) sebagai objek cerdas daripada objek hanya nilai - karena dalam kenyataannya, 21
(misalnya) benar - benar hanya nilai. Ini menjadi sangat bermasalah ketika di satu sisi Anda diberitahu bahwa keuntungan besar dari OOP adalah memodelkan kenyataan lebih dekat, tetapi Anda memulainya dengan mengambil apa yang tampak sangat mengerikan seperti pandangan yang diinspirasi oleh LSD bahkan pada bagian yang paling dasar dan jelas dari realitas.
Kedua, pewarisan dalam OOP juga tidak mengikuti model mental kebanyakan orang. Bagi kebanyakan orang, mengklasifikasikan hal-hal yang paling spesifik tidak memiliki aturan mutlak yang diperlukan untuk membuat hierarki kelas yang berfungsi. Secara khusus, menciptakan class D
yang diwarisi dari yang lain class B
berarti bahwa objek class D
berbagi secara mutlak, positif semua karakteristik class B
. class D
dapat menambahkan karakteristik baru dan berbeda sendiri, tetapi semua karakteristik class B
harus tetap utuh.
Sebaliknya, ketika orang mengklasifikasikan sesuatu secara mental, mereka biasanya mengikuti model yang jauh lebih longgar. Sebagai contoh, jika seseorang membuat beberapa aturan tentang apa yang merupakan kelas objek, itu cukup khas bahwa hampir semua aturan dapat dilanggar selama cukup banyak aturan lain yang diikuti. Bahkan beberapa aturan yang tidak bisa benar-benar dilanggar hampir selalu bisa "ditarik" sedikit pula.
Sebagai contoh, pertimbangkan "mobil" sebagai kelas. Sangat mudah untuk melihat bahwa sebagian besar dari apa yang kebanyakan orang pikirkan sebagai "mobil" memiliki empat roda. Namun, kebanyakan orang telah melihat (setidaknya gambar) mobil dengan hanya tiga roda. Beberapa dari kita di usia yang tepat juga ingat satu atau dua mobil balap dari awal 80-an (atau lebih) yang memiliki enam roda - dan seterusnya. Ini membuat kita pada dasarnya tiga pilihan:
- Jangan menyatakan apa pun tentang berapa banyak roda yang dimiliki mobil - tetapi ini cenderung mengarah pada asumsi tersirat bahwa itu akan selalu 4, dan kode yang kemungkinan akan rusak untuk nomor lain.
- Tegaskan bahwa semua mobil memiliki empat roda, dan hanya mengklasifikasikan yang lain sebagai "bukan mobil" meskipun kita tahu sebenarnya.
- Rancang kelas untuk memungkinkan variasi dalam jumlah roda, untuk jaga-jaga, meskipun ada kemungkinan bagus kemampuan ini tidak akan pernah diperlukan, digunakan, atau diuji dengan benar.
Mengajar tentang OOP sering berfokus pada membangun taksonomi besar - misalnya, potongan-potongan apa yang akan menjadi hierarki raksasa dari semua kehidupan yang dikenal di bumi, atau sesuatu dengan urutan itu. Ini menimbulkan dua masalah: pertama dan terutama, cenderung mengarahkan banyak orang untuk fokus pada sejumlah besar informasi yang sama sekali tidak relevan dengan pertanyaan yang ada. Pada satu titik saya melihat diskusi yang agak panjang tentang bagaimana memodelkan jenis anjing, dan apakah (misalnya) "pudel miniatur" harus diwarisi dari "pudel ukuran penuh", atau sebaliknya, atau apakah harus ada pangkalan abstrak "Poodle". "kelas, dengan" pudel ukuran penuh "dan" pudel miniatur "keduanya mewarisi darinya. Apa yang mereka semua tampaknya mengabaikan adalah bahwa aplikasi itu seharusnya berurusan dengan melacak lisensi untuk anjing,
Kedua, dan hampir penting, ini mengarah ke fokus pada karakteristik item, daripada berfokus pada karakteristik yang penting untuk tugas yang dihadapi. Ini mengarah pada memodelkan hal-hal sebagaimana adanya, di mana (sebagian besar waktu) yang benar-benar dibutuhkan adalah membangun model paling sederhana yang akan memenuhi kebutuhan kita, dan menggunakan abstraksi agar sesuai dengan sub-kelas yang diperlukan agar sesuai dengan abstraksi yang telah kita bangun.
Akhirnya, saya akan mengatakan sekali lagi: kami perlahan mengikuti jalur yang sama yang diambil oleh database selama bertahun-tahun. Database awal mengikuti model hierarkis. Selain berfokus secara eksklusif pada data, ini adalah warisan tunggal. Untuk waktu yang singkat, beberapa database mengikuti model jaringan - pada dasarnya identik dengan multiple inheritance (dan dilihat dari sudut ini, beberapa antarmuka tidak cukup berbeda dari beberapa kelas dasar untuk diperhatikan atau diperhatikan).
Dulu, bagaimanapun, basis data sebagian besar bertemu pada model relasional (dan meskipun mereka bukan SQL, pada tingkat abstraksi ini, basis data "NoSQL" saat ini juga bersifat relasional). Keuntungan dari model relasional sudah cukup dikenal sehingga saya tidak akan repot mengulanginya di sini. Saya hanya akan mencatat bahwa analog terdekat dari model relasional yang kita miliki dalam pemrograman adalah pemrograman generik (dan maaf, tetapi terlepas dari namanya, Java generics, misalnya, tidak benar-benar memenuhi syarat, meskipun mereka adalah langkah kecil dalam arah yang benar).